@ -0,0 +1,14 @@ |
|||||||
|
package com.fr.design.remote; |
||||||
|
|
||||||
|
public class RemoteDesignAuthority { |
||||||
|
|
||||||
|
private String name; |
||||||
|
|
||||||
|
public String getName() { |
||||||
|
return name; |
||||||
|
} |
||||||
|
|
||||||
|
public void setName(String name) { |
||||||
|
this.name = name; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,45 @@ |
|||||||
|
package com.fr.design.remote; |
||||||
|
|
||||||
|
import com.fr.design.beans.BasicBeanPane; |
||||||
|
|
||||||
|
import javax.swing.Icon; |
||||||
|
|
||||||
|
public class RemoteDesignAuthorityCreator { |
||||||
|
|
||||||
|
private String name; |
||||||
|
private Icon icon; |
||||||
|
private Class clazz; |
||||||
|
private Class<? extends BasicBeanPane> editorClazz; |
||||||
|
|
||||||
|
|
||||||
|
public RemoteDesignAuthorityCreator(String name, Icon icon, Class clazz, Class<? extends BasicBeanPane> editorClazz) { |
||||||
|
this.name = name; |
||||||
|
this.icon = icon; |
||||||
|
this.clazz = clazz; |
||||||
|
this.editorClazz = editorClazz; |
||||||
|
} |
||||||
|
|
||||||
|
public boolean accept(Object object) { |
||||||
|
return this.clazz != null && this.clazz.isInstance(object); |
||||||
|
} |
||||||
|
|
||||||
|
public String getName() { |
||||||
|
return name; |
||||||
|
} |
||||||
|
|
||||||
|
public Icon getIcon() { |
||||||
|
return icon; |
||||||
|
} |
||||||
|
|
||||||
|
public Class getClazz() { |
||||||
|
return clazz; |
||||||
|
} |
||||||
|
|
||||||
|
public Class<? extends BasicBeanPane> getEditorClazz() { |
||||||
|
return editorClazz; |
||||||
|
} |
||||||
|
|
||||||
|
public void saveUpdatedBean(RemoteDesignAuthority authority, Object bean) { |
||||||
|
|
||||||
|
} |
||||||
|
} |
@ -0,0 +1,20 @@ |
|||||||
|
package com.fr.design.remote; |
||||||
|
|
||||||
|
public class RemoteMember { |
||||||
|
|
||||||
|
public static final RemoteMember DEFAULT_MEMBER = new RemoteMember("查询中..."); |
||||||
|
|
||||||
|
private String name; |
||||||
|
|
||||||
|
public RemoteMember(String name) { |
||||||
|
this.name = name; |
||||||
|
} |
||||||
|
|
||||||
|
public String getName() { |
||||||
|
return name; |
||||||
|
} |
||||||
|
|
||||||
|
public void setName(String name) { |
||||||
|
this.name = name; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,48 @@ |
|||||||
|
package com.fr.design.remote.action; |
||||||
|
|
||||||
|
import com.fr.base.BaseUtils; |
||||||
|
import com.fr.design.actions.UpdateAction; |
||||||
|
import com.fr.design.dialog.BasicDialog; |
||||||
|
import com.fr.design.dialog.DialogActionAdapter; |
||||||
|
import com.fr.design.mainframe.DesignerContext; |
||||||
|
import com.fr.design.remote.ui.AuthorityManagerPane; |
||||||
|
|
||||||
|
import java.awt.event.ActionEvent; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author yaohwu |
||||||
|
*/ |
||||||
|
public class RemoteDesignAuthorityManagerAction extends UpdateAction { |
||||||
|
|
||||||
|
|
||||||
|
public RemoteDesignAuthorityManagerAction() { |
||||||
|
this.setName("远程设计权限管理"); |
||||||
|
this.setSmallIcon(BaseUtils.readIcon("com/fr/design/remote/images/icon_Remote_Design_Permission_Manager_normal@1x.png")); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public void actionPerformed(ActionEvent e) { |
||||||
|
|
||||||
|
AuthorityManagerPane managerPane = new AuthorityManagerPane(); |
||||||
|
|
||||||
|
BasicDialog dialog = managerPane.showWindow(DesignerContext.getDesignerFrame()); |
||||||
|
|
||||||
|
|
||||||
|
//todo read contents from database by hibernate to show
|
||||||
|
|
||||||
|
dialog.addDialogActionListener(new DialogActionAdapter() { |
||||||
|
@Override |
||||||
|
public void doOk() { |
||||||
|
//todo save contents into database by hibernate
|
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void doCancel() { |
||||||
|
super.doCancel(); |
||||||
|
} |
||||||
|
}); |
||||||
|
dialog.setModal(true); |
||||||
|
dialog.setVisible(true); |
||||||
|
} |
||||||
|
} |
After Width: | Height: | Size: 337 B |
After Width: | Height: | Size: 548 B |
After Width: | Height: | Size: 525 B |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 350 B |
After Width: | Height: | Size: 746 B |
After Width: | Height: | Size: 288 B |
After Width: | Height: | Size: 531 B |
After Width: | Height: | Size: 575 B |
After Width: | Height: | Size: 1.1 KiB |
@ -0,0 +1,33 @@ |
|||||||
|
package com.fr.design.remote.ui; |
||||||
|
|
||||||
|
import com.fr.design.beans.BasicBeanPane; |
||||||
|
import com.fr.design.layout.FRGUIPaneFactory; |
||||||
|
import com.fr.design.remote.RemoteDesignAuthority; |
||||||
|
|
||||||
|
import javax.swing.BorderFactory; |
||||||
|
import java.awt.BorderLayout; |
||||||
|
import java.awt.Label; |
||||||
|
|
||||||
|
public class AuthorityEditorPane extends BasicBeanPane<RemoteDesignAuthority> { |
||||||
|
|
||||||
|
public AuthorityEditorPane() { |
||||||
|
this.setLayout(FRGUIPaneFactory.createBorderLayout()); |
||||||
|
this.setBorder(BorderFactory.createEmptyBorder()); |
||||||
|
this.add(new Label("editor"), BorderLayout.CENTER); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected String title4PopupWindow() { |
||||||
|
return "编辑文件权限"; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void populateBean(RemoteDesignAuthority ob) { |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public RemoteDesignAuthority updateBean() { |
||||||
|
return new RemoteDesignAuthority(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,520 @@ |
|||||||
|
package com.fr.design.remote.ui; |
||||||
|
|
||||||
|
import com.fr.base.BaseUtils; |
||||||
|
import com.fr.design.actions.UpdateAction; |
||||||
|
import com.fr.design.beans.BasicBeanPane; |
||||||
|
import com.fr.design.dialog.BasicDialog; |
||||||
|
import com.fr.design.dialog.BasicPane; |
||||||
|
import com.fr.design.dialog.DialogActionAdapter; |
||||||
|
import com.fr.design.gui.controlpane.ShortCut4JControlPane; |
||||||
|
import com.fr.design.gui.icontainer.UIScrollPane; |
||||||
|
import com.fr.design.gui.ilable.UILabel; |
||||||
|
import com.fr.design.gui.itoolbar.UIToolbar; |
||||||
|
import com.fr.design.icon.IconPathConstants; |
||||||
|
import com.fr.design.layout.FRGUIPaneFactory; |
||||||
|
import com.fr.design.menu.ShortCut; |
||||||
|
import com.fr.design.menu.ToolBarDef; |
||||||
|
import com.fr.design.remote.RemoteDesignAuthority; |
||||||
|
import com.fr.design.remote.RemoteDesignAuthorityCreator; |
||||||
|
import com.fr.design.remote.ui.list.AuthorityList; |
||||||
|
import com.fr.design.remote.ui.list.AuthorityListCellRenderer; |
||||||
|
import com.fr.design.utils.gui.GUICoreUtils; |
||||||
|
import com.fr.general.ComparatorUtils; |
||||||
|
import com.fr.general.Inter; |
||||||
|
import com.fr.stable.ArrayUtils; |
||||||
|
|
||||||
|
import javax.swing.BorderFactory; |
||||||
|
import javax.swing.DefaultListModel; |
||||||
|
import javax.swing.JOptionPane; |
||||||
|
import javax.swing.JPanel; |
||||||
|
import javax.swing.JSplitPane; |
||||||
|
import javax.swing.ListSelectionModel; |
||||||
|
import javax.swing.SwingUtilities; |
||||||
|
import javax.swing.event.ListSelectionEvent; |
||||||
|
import javax.swing.event.ListSelectionListener; |
||||||
|
import java.awt.BorderLayout; |
||||||
|
import java.awt.CardLayout; |
||||||
|
import java.awt.event.ActionEvent; |
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
public class AuthorityListControlPane extends BasicPane { |
||||||
|
|
||||||
|
|
||||||
|
private static final String LIST_NAME = "AuthorityListControlPaneList"; |
||||||
|
|
||||||
|
private static final String UNSELECTED_EDITOR_NAME = "UNSELECTED"; |
||||||
|
private static final String SELECTED_EDITOR_NAME = "SELECTED"; |
||||||
|
|
||||||
|
private AuthorityList authorityList; |
||||||
|
|
||||||
|
private static final int SHORT_WIDTH = 30; |
||||||
|
|
||||||
|
private ListEditorControlPane editorCtrl; |
||||||
|
|
||||||
|
|
||||||
|
private CardLayout cardLayout; |
||||||
|
|
||||||
|
private JPanel cardPane; |
||||||
|
|
||||||
|
private ShortCut4JControlPane[] shortCuts; |
||||||
|
|
||||||
|
private RemoteDesignAuthorityCreator[] authorityCreators; |
||||||
|
|
||||||
|
private ToolBarDef toolbarDef; |
||||||
|
|
||||||
|
private UIToolbar toolBar; |
||||||
|
|
||||||
|
|
||||||
|
public AuthorityListControlPane() { |
||||||
|
super(); |
||||||
|
initComponentPane(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
private void initComponentPane() { |
||||||
|
this.setLayout(FRGUIPaneFactory.createBorderLayout()); |
||||||
|
this.authorityCreators = new RemoteDesignAuthorityCreator[]{ |
||||||
|
new RemoteDesignAuthorityCreator( |
||||||
|
"远程设计用户", |
||||||
|
BaseUtils.readIcon("com/fr/design/remote/images/icon_Member_normal@1x.png"), |
||||||
|
RemoteDesignAuthority.class, |
||||||
|
AuthorityEditorPane.class) |
||||||
|
}; |
||||||
|
editorCtrl = new ListEditorControlPane(); |
||||||
|
|
||||||
|
// 左侧列表面板
|
||||||
|
JPanel leftPane = new JPanel(new BorderLayout()); |
||||||
|
initLeftList(leftPane); |
||||||
|
initLeftToolbar(leftPane); |
||||||
|
|
||||||
|
// 右侧卡片布局
|
||||||
|
cardLayout = new CardLayout(); |
||||||
|
cardPane = new JPanel(cardLayout); |
||||||
|
UILabel selectLabel = new UILabel(); |
||||||
|
cardPane.add(selectLabel, UNSELECTED_EDITOR_NAME); |
||||||
|
cardPane.add(editorCtrl, SELECTED_EDITOR_NAME); |
||||||
|
|
||||||
|
// 左右分割布局
|
||||||
|
JSplitPane mainSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true, leftPane, cardPane); |
||||||
|
mainSplitPane.setBorder(BorderFactory.createLineBorder(GUICoreUtils.getTitleLineBorderColor())); |
||||||
|
mainSplitPane.setOneTouchExpandable(true); |
||||||
|
add(mainSplitPane, BorderLayout.CENTER); |
||||||
|
mainSplitPane.setDividerLocation(shortCuts.length * SHORT_WIDTH); |
||||||
|
|
||||||
|
checkButtonEnabled(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
private void initLeftToolbar(JPanel leftPane) { |
||||||
|
shortCuts = createShortcuts(); |
||||||
|
if (ArrayUtils.isEmpty(shortCuts)) { |
||||||
|
return; |
||||||
|
} |
||||||
|
toolbarDef = new ToolBarDef(); |
||||||
|
for (ShortCut4JControlPane sj : shortCuts) { |
||||||
|
toolbarDef.addShortCut(sj.getShortCut()); |
||||||
|
} |
||||||
|
toolBar = ToolBarDef.createJToolBar(); |
||||||
|
toolbarDef.updateToolBar(toolBar); |
||||||
|
leftPane.add(toolBar, BorderLayout.NORTH); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
private void initLeftList(JPanel leftPane) { |
||||||
|
authorityList = createList(); |
||||||
|
authorityList.setName(LIST_NAME); |
||||||
|
leftPane.add(new UIScrollPane(authorityList), BorderLayout.CENTER); |
||||||
|
|
||||||
|
|
||||||
|
authorityList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); |
||||||
|
authorityList.addListSelectionListener(new ListSelectionListener() { |
||||||
|
@Override |
||||||
|
public void valueChanged(ListSelectionEvent evt) { |
||||||
|
//避免多次update和populate大大降低效率
|
||||||
|
if (!evt.getValueIsAdjusting()) { |
||||||
|
//切换的时候加检验
|
||||||
|
if (hasInvalid()) { |
||||||
|
return; |
||||||
|
} |
||||||
|
AuthorityListControlPane.this.editorCtrl.update(); |
||||||
|
AuthorityListControlPane.this.editorCtrl.populate(); |
||||||
|
AuthorityListControlPane.this.checkButtonEnabled(); |
||||||
|
} |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
private AuthorityList createList() { |
||||||
|
AuthorityList list = new AuthorityList(new DefaultListModel<RemoteDesignAuthority>()); |
||||||
|
list.setCellRenderer(new AuthorityListCellRenderer()); |
||||||
|
return list; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
private void doWhenPopulate() { |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
private void doBeforePopulate() { |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public RemoteDesignAuthority[] update() { |
||||||
|
List<RemoteDesignAuthority> res = new ArrayList<>(); |
||||||
|
this.editorCtrl.update(); |
||||||
|
DefaultListModel listModel = (DefaultListModel) this.authorityList.getModel(); |
||||||
|
for (int i = 0, len = listModel.getSize(); i < len; i++) { |
||||||
|
res.add((RemoteDesignAuthority) listModel.getElementAt(i)); |
||||||
|
} |
||||||
|
return res.toArray(new RemoteDesignAuthority[0]); |
||||||
|
} |
||||||
|
|
||||||
|
public void populate(RemoteDesignAuthority[] authorities) { |
||||||
|
DefaultListModel<RemoteDesignAuthority> listModel = (DefaultListModel<RemoteDesignAuthority>) this.authorityList.getModel(); |
||||||
|
listModel.removeAllElements(); |
||||||
|
if (ArrayUtils.isEmpty(authorities)) { |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
for (RemoteDesignAuthority authority : authorities) { |
||||||
|
listModel.addElement(authority); |
||||||
|
} |
||||||
|
|
||||||
|
if (listModel.size() > 0) { |
||||||
|
this.authorityList.setSelectedIndex(0); |
||||||
|
} |
||||||
|
this.checkButtonEnabled(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public void updateEditorCtrlPane() { |
||||||
|
editorCtrl.update(); |
||||||
|
} |
||||||
|
|
||||||
|
/* |
||||||
|
* 刷新当前的选中的UpdatePane |
||||||
|
*/ |
||||||
|
public void populateEditorCtrlPane() { |
||||||
|
this.editorCtrl.populate(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public void setSelectedName(String name) { |
||||||
|
DefaultListModel listModel = (DefaultListModel) this.authorityList.getModel(); |
||||||
|
for (int i = 0, len = listModel.getSize(); i < len; i++) { |
||||||
|
RemoteDesignAuthority authority = (RemoteDesignAuthority) listModel.getElementAt(i); |
||||||
|
if (ComparatorUtils.equals(name, authority.getName())) { |
||||||
|
this.authorityList.setSelectedIndex(i); |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 获取选中的名字 |
||||||
|
*/ |
||||||
|
public String getSelectedName() { |
||||||
|
RemoteDesignAuthority authority = (RemoteDesignAuthority) this.authorityList.getSelectedValue(); |
||||||
|
return authority == null ? null : authority.getName(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 添加 RemoteDesignAuthority |
||||||
|
* |
||||||
|
* @param authority authority |
||||||
|
* @param index 序号 |
||||||
|
*/ |
||||||
|
public void addAuthority(RemoteDesignAuthority authority, int index) { |
||||||
|
DefaultListModel<RemoteDesignAuthority> model = (DefaultListModel<RemoteDesignAuthority>) authorityList.getModel(); |
||||||
|
|
||||||
|
model.add(index, authority); |
||||||
|
authorityList.setSelectedIndex(index); |
||||||
|
authorityList.ensureIndexIsVisible(index); |
||||||
|
|
||||||
|
authorityList.revalidate(); |
||||||
|
authorityList.repaint(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
protected DefaultListModel<RemoteDesignAuthority> getModel() { |
||||||
|
return (DefaultListModel<RemoteDesignAuthority>) this.authorityList.getModel(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 检查按钮可用状态 Check button enabled. |
||||||
|
*/ |
||||||
|
public void checkButtonEnabled() { |
||||||
|
|
||||||
|
if (authorityList.getSelectedIndex() == -1) { |
||||||
|
this.cardLayout.show(cardPane, UNSELECTED_EDITOR_NAME); |
||||||
|
} else { |
||||||
|
this.cardLayout.show(cardPane, SELECTED_EDITOR_NAME); |
||||||
|
} |
||||||
|
for (ShortCut4JControlPane shortCut : shortCuts) { |
||||||
|
shortCut.checkEnable(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public class AbsoluteEnableShortCut extends ShortCut4JControlPane { |
||||||
|
AbsoluteEnableShortCut(ShortCut shortCut) { |
||||||
|
this.shortCut = shortCut; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 检查是否可用 |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
public void checkEnable() { |
||||||
|
this.shortCut.setEnabled(true); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public class NormalEnableShortCut extends ShortCut4JControlPane { |
||||||
|
NormalEnableShortCut(ShortCut shortCut) { |
||||||
|
this.shortCut = shortCut; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 检查是否可用 |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
public void checkEnable() { |
||||||
|
this.shortCut.setEnabled(authorityList.getModel() |
||||||
|
.getSize() > 0 |
||||||
|
&& AuthorityListControlPane.this.authorityList.getSelectedIndex() != -1); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
private BasicBeanPane createPaneByCreators(RemoteDesignAuthorityCreator creator) { |
||||||
|
try { |
||||||
|
return creator.getEditorClazz().newInstance(); |
||||||
|
} catch (InstantiationException | IllegalAccessException e) { |
||||||
|
throw new RuntimeException(e); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 检查是否符合规范 |
||||||
|
* |
||||||
|
* @throws Exception e |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
public void checkValid() throws Exception { |
||||||
|
this.editorCtrl.checkValid(); |
||||||
|
} |
||||||
|
|
||||||
|
private int getInValidIndex() { |
||||||
|
BasicBeanPane[] p = editorCtrl.editorPanes; |
||||||
|
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; |
||||||
|
} |
||||||
|
|
||||||
|
private boolean hasInvalid() { |
||||||
|
int idx = AuthorityListControlPane.this.getInValidIndex(); |
||||||
|
if (authorityList.getSelectedIndex() != idx) { |
||||||
|
try { |
||||||
|
checkValid(); |
||||||
|
} catch (Exception exp) { |
||||||
|
JOptionPane.showMessageDialog(AuthorityListControlPane.this, exp.getMessage()); |
||||||
|
authorityList.setSelectedIndex(idx); |
||||||
|
return true; |
||||||
|
} |
||||||
|
} |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 设置选中项 |
||||||
|
* |
||||||
|
* @param index 选中项的序列号 |
||||||
|
*/ |
||||||
|
public void setSelectedIndex(int index) { |
||||||
|
authorityList.setSelectedIndex(index); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
private ShortCut4JControlPane[] createShortcuts() { |
||||||
|
return new ShortCut4JControlPane[]{ |
||||||
|
new AbsoluteEnableShortCut(new AddItemUpdateAction(authorityCreators)), |
||||||
|
new NormalEnableShortCut(new RemoveItemAction()) |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
private void doBeforeRemove() { |
||||||
|
} |
||||||
|
|
||||||
|
private void doAfterRemove() { |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 刷新 creators |
||||||
|
* |
||||||
|
* @param creators 生成器 |
||||||
|
*/ |
||||||
|
public void refreshCreator(RemoteDesignAuthorityCreator[] creators) { |
||||||
|
this.authorityCreators = creators; |
||||||
|
shortCuts = this.createShortcuts(); |
||||||
|
toolbarDef.clearShortCuts(); |
||||||
|
for (ShortCut4JControlPane sj : shortCuts) { |
||||||
|
toolbarDef.addShortCut(sj.getShortCut()); |
||||||
|
} |
||||||
|
|
||||||
|
toolbarDef.updateToolBar(toolBar); |
||||||
|
toolBar.validate(); |
||||||
|
toolBar.repaint(); |
||||||
|
this.repaint(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
protected String title4PopupWindow() { |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
private class ListEditorControlPane extends JPanel { |
||||||
|
private CardLayout card; |
||||||
|
private JPanel cardPane; |
||||||
|
private BasicBeanPane[] editorPanes; |
||||||
|
|
||||||
|
private RemoteDesignAuthority authority; |
||||||
|
|
||||||
|
ListEditorControlPane() { |
||||||
|
initUpdatePane(); |
||||||
|
} |
||||||
|
|
||||||
|
private void initUpdatePane() { |
||||||
|
card = new CardLayout(); |
||||||
|
cardPane = FRGUIPaneFactory.createCardLayout_S_Pane(); |
||||||
|
cardPane.setLayout(card); |
||||||
|
this.setLayout(FRGUIPaneFactory.createBorderLayout()); |
||||||
|
this.add(cardPane); |
||||||
|
editorPanes = new BasicBeanPane[authorityCreators.length]; |
||||||
|
} |
||||||
|
|
||||||
|
public void populate() { |
||||||
|
authority = (RemoteDesignAuthority) AuthorityListControlPane.this.authorityList.getSelectedValue(); |
||||||
|
|
||||||
|
if (authority == null) { |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
for (int i = 0, len = editorPanes.length; i < len; i++) { |
||||||
|
if (authorityCreators[i].accept(authority)) { |
||||||
|
editorPanes[i] = createPaneByCreators(authorityCreators[i]); |
||||||
|
cardPane.add(editorPanes[i], String.valueOf(i)); |
||||||
|
card.show(cardPane, String.valueOf(i)); |
||||||
|
doBeforePopulate(); |
||||||
|
editorPanes[i].populateBean(authority); |
||||||
|
doWhenPopulate(); |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public void update() { |
||||||
|
for (int i = 0; i < editorPanes.length; i++) { |
||||||
|
BasicBeanPane pane = editorPanes[i]; |
||||||
|
if (pane != null && pane.isVisible()) { |
||||||
|
Object bean = pane.updateBean(); |
||||||
|
if (i < authorityCreators.length) { |
||||||
|
authorityCreators[i].saveUpdatedBean(authority, bean); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public void checkValid() throws Exception { |
||||||
|
if (editorPanes != null) { |
||||||
|
for (BasicBeanPane updatePane : editorPanes) { |
||||||
|
if (updatePane != null) { |
||||||
|
updatePane.checkValid(); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 添加按钮 |
||||||
|
*/ |
||||||
|
private class AddItemUpdateAction extends UpdateAction { |
||||||
|
private RemoteDesignAuthorityCreator creator; |
||||||
|
|
||||||
|
AddItemUpdateAction(RemoteDesignAuthorityCreator[] creators) { |
||||||
|
this.creator = creators[0]; |
||||||
|
this.setName(Inter.getLocText("FR-Action_Add")); |
||||||
|
this.setMnemonic('A'); |
||||||
|
this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/buttonicon/add.png")); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void actionPerformed(ActionEvent e) { |
||||||
|
final UserManagerPane userManagerPane = new UserManagerPane(); |
||||||
|
BasicDialog dialog = userManagerPane.showWindow(SwingUtilities.getWindowAncestor(AuthorityListControlPane.this)); |
||||||
|
|
||||||
|
dialog.addDialogActionListener(new DialogActionAdapter() { |
||||||
|
@Override |
||||||
|
public void doOk() { |
||||||
|
// todo 获取 UserManagerPane 添加的用户
|
||||||
|
userManagerPane.title4PopupWindow(); |
||||||
|
|
||||||
|
RemoteDesignAuthority authority = new RemoteDesignAuthority(); |
||||||
|
authority.setName("new User"); |
||||||
|
AuthorityListControlPane.this.addAuthority(authority, getModel().getSize()); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void doCancel() { |
||||||
|
super.doCancel(); |
||||||
|
} |
||||||
|
}); |
||||||
|
dialog.setModal(true); |
||||||
|
dialog.setVisible(true); |
||||||
|
|
||||||
|
|
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/* |
||||||
|
* 删除按钮 |
||||||
|
*/ |
||||||
|
private class RemoveItemAction extends UpdateAction { |
||||||
|
RemoveItemAction() { |
||||||
|
this.setName(Inter.getLocText("FR-Action_Remove")); |
||||||
|
this.setMnemonic('R'); |
||||||
|
this.setSmallIcon(BaseUtils |
||||||
|
.readIcon(IconPathConstants.TD_REMOVE_ICON_PATH)); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void actionPerformed(ActionEvent evt) { |
||||||
|
doBeforeRemove(); |
||||||
|
if (GUICoreUtils.removeJListSelectedNodes(SwingUtilities |
||||||
|
.getWindowAncestor(AuthorityListControlPane.this), authorityList)) { |
||||||
|
checkButtonEnabled(); |
||||||
|
doAfterRemove(); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,37 @@ |
|||||||
|
package com.fr.design.remote.ui; |
||||||
|
|
||||||
|
import com.fr.design.dialog.BasicPane; |
||||||
|
import com.fr.design.remote.RemoteDesignAuthority; |
||||||
|
import com.fr.general.Inter; |
||||||
|
|
||||||
|
import javax.swing.BorderFactory; |
||||||
|
import java.awt.BorderLayout; |
||||||
|
|
||||||
|
public class AuthorityManagerPane extends BasicPane { |
||||||
|
|
||||||
|
private AuthorityListControlPane list; |
||||||
|
|
||||||
|
|
||||||
|
public AuthorityManagerPane() { |
||||||
|
this.setLayout(new BorderLayout()); |
||||||
|
this.setBorder(BorderFactory.createEmptyBorder()); |
||||||
|
|
||||||
|
list = new AuthorityListControlPane(); |
||||||
|
this.add(list, BorderLayout.CENTER); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
protected String title4PopupWindow() { |
||||||
|
return Inter.getLocText("远程设计权限管理"); |
||||||
|
} |
||||||
|
|
||||||
|
public void populate(RemoteDesignAuthority[] authorities) { |
||||||
|
list.populate(authorities); |
||||||
|
} |
||||||
|
|
||||||
|
private RemoteDesignAuthority[] update() { |
||||||
|
|
||||||
|
return list.update(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,98 @@ |
|||||||
|
package com.fr.design.remote.ui; |
||||||
|
|
||||||
|
import com.fr.design.border.UITitledBorder; |
||||||
|
import com.fr.design.dialog.BasicPane; |
||||||
|
import com.fr.design.gui.ibutton.UIButton; |
||||||
|
import com.fr.design.gui.icontainer.UIScrollPane; |
||||||
|
import com.fr.design.gui.itextfield.UITextField; |
||||||
|
import com.fr.design.layout.TableLayout; |
||||||
|
import com.fr.design.layout.TableLayoutHelper; |
||||||
|
import com.fr.design.remote.RemoteMember; |
||||||
|
import com.fr.design.remote.ui.list.MemberList; |
||||||
|
import com.fr.design.remote.ui.list.MemberListCellRender; |
||||||
|
import com.fr.general.Inter; |
||||||
|
|
||||||
|
import javax.swing.BorderFactory; |
||||||
|
import javax.swing.DefaultListModel; |
||||||
|
import javax.swing.JPanel; |
||||||
|
import javax.swing.border.EmptyBorder; |
||||||
|
import java.awt.BorderLayout; |
||||||
|
import java.awt.Component; |
||||||
|
import java.awt.FlowLayout; |
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* @author yaohwu |
||||||
|
*/ |
||||||
|
public class UserManagerPane extends BasicPane { |
||||||
|
|
||||||
|
private List<RemoteMember> members = new ArrayList<>(); |
||||||
|
|
||||||
|
DefaultListModel<RemoteMember> listModel = new DefaultListModel<>(); |
||||||
|
|
||||||
|
|
||||||
|
public UserManagerPane() { |
||||||
|
this.setBorder(BorderFactory.createEmptyBorder()); |
||||||
|
this.setLayout(new BorderLayout()); |
||||||
|
this.add( |
||||||
|
TableLayoutHelper.createTableLayoutPane( |
||||||
|
new Component[][]{ |
||||||
|
new Component[]{createLeftPanel(), new JPanel()} |
||||||
|
}, |
||||||
|
new double[]{TableLayout.FILL}, |
||||||
|
new double[]{TableLayout.FILL, TableLayout.FILL} |
||||||
|
), |
||||||
|
BorderLayout.CENTER); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
protected String title4PopupWindow() { |
||||||
|
return "添加设计成员"; |
||||||
|
} |
||||||
|
|
||||||
|
private JPanel createLeftPanel() { |
||||||
|
JPanel content = new JPanel(new BorderLayout()); |
||||||
|
|
||||||
|
content.setBorder( |
||||||
|
BorderFactory.createCompoundBorder( |
||||||
|
new EmptyBorder(6, 0, 0, 0), |
||||||
|
UITitledBorder.createBorderWithTitle(Inter.getLocText("决策系统成员"))) |
||||||
|
); |
||||||
|
|
||||||
|
// 搜索
|
||||||
|
UITextField searchKeyInput = new UITextField(); |
||||||
|
UIButton searchButton = new UIButton("搜索"); |
||||||
|
JPanel searchPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); |
||||||
|
searchPanel.setBorder(BorderFactory.createEmptyBorder()); |
||||||
|
searchPanel.add(searchKeyInput); |
||||||
|
searchPanel.add(searchButton); |
||||||
|
// 内容列表
|
||||||
|
listModel = new DefaultListModel<>(); |
||||||
|
MemberList list = new MemberList(listModel); |
||||||
|
list.setCellRenderer(new MemberListCellRender()); |
||||||
|
resetMembers(); |
||||||
|
addContentToList(); |
||||||
|
UIScrollPane listPane = new UIScrollPane(list); |
||||||
|
listPane.setBorder(BorderFactory.createEmptyBorder()); |
||||||
|
|
||||||
|
content.add(searchPanel, BorderLayout.NORTH); |
||||||
|
content.add(listPane, BorderLayout.CENTER); |
||||||
|
return content; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
private void addContentToList() { |
||||||
|
listModel.removeAllElements(); |
||||||
|
for (RemoteMember member : members) { |
||||||
|
listModel.addElement(member); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private void resetMembers() { |
||||||
|
members.clear(); |
||||||
|
members.add(RemoteMember.DEFAULT_MEMBER); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,28 @@ |
|||||||
|
package com.fr.design.remote.ui.list; |
||||||
|
|
||||||
|
import com.fr.design.remote.RemoteDesignAuthority; |
||||||
|
|
||||||
|
import javax.swing.JList; |
||||||
|
import javax.swing.ListModel; |
||||||
|
import java.util.Vector; |
||||||
|
|
||||||
|
public class AuthorityList extends JList<RemoteDesignAuthority> { |
||||||
|
|
||||||
|
|
||||||
|
public AuthorityList() { |
||||||
|
super(); |
||||||
|
} |
||||||
|
|
||||||
|
public AuthorityList(ListModel<RemoteDesignAuthority> dataModel) { |
||||||
|
super(dataModel); |
||||||
|
} |
||||||
|
|
||||||
|
public AuthorityList(final RemoteDesignAuthority[] listData) { |
||||||
|
super(listData); |
||||||
|
} |
||||||
|
|
||||||
|
public AuthorityList(final Vector<? extends RemoteDesignAuthority> listData) { |
||||||
|
super(listData); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,132 @@ |
|||||||
|
package com.fr.design.remote.ui.list; |
||||||
|
|
||||||
|
import com.fr.base.BaseUtils; |
||||||
|
import com.fr.design.remote.RemoteDesignAuthority; |
||||||
|
import sun.swing.DefaultLookup; |
||||||
|
|
||||||
|
import javax.swing.JLabel; |
||||||
|
import javax.swing.JList; |
||||||
|
import javax.swing.ListCellRenderer; |
||||||
|
import javax.swing.border.Border; |
||||||
|
import javax.swing.border.EmptyBorder; |
||||||
|
import java.awt.Color; |
||||||
|
import java.awt.Component; |
||||||
|
|
||||||
|
/* |
||||||
|
* NameableListCellRenderer |
||||||
|
*/ |
||||||
|
public class AuthorityListCellRenderer extends |
||||||
|
JLabel implements ListCellRenderer<RemoteDesignAuthority> { |
||||||
|
|
||||||
|
/** |
||||||
|
* An empty <code>Border</code>. This field might not be used. To change the |
||||||
|
* <code>Border</code> used by this renderer override the |
||||||
|
* <code>getListCellRendererComponent</code> method and set the border |
||||||
|
* of the returned component directly. |
||||||
|
*/ |
||||||
|
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 Border noFocusBorder = DEFAULT_NO_FOCUS_BORDER; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Constructs a default renderer object for an item |
||||||
|
* in a list. |
||||||
|
*/ |
||||||
|
public AuthorityListCellRenderer() { |
||||||
|
super(); |
||||||
|
setOpaque(true); |
||||||
|
setBorder(getNoFocusBorder()); |
||||||
|
setName("List.cellRenderer"); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public Component getListCellRendererComponent(JList list, RemoteDesignAuthority authority, |
||||||
|
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()); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
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); |
||||||
|
|
||||||
|
this.setIcon(BaseUtils.readIcon("com/fr/design/remote/images/icon_Member_normal@1x.png")); |
||||||
|
this.setText(authority.getName()); |
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
private Border getNoFocusBorder() { |
||||||
|
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; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Overridden for performance reasons. |
||||||
|
* See the <a href="#override">Implementation Note</a> |
||||||
|
* for more information. |
||||||
|
* |
||||||
|
* @return <code>true</code> if the background is completely opaque |
||||||
|
* and differs from the JList's background; |
||||||
|
* <code>false</code> otherwise |
||||||
|
* @since 1.5 |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
public boolean isOpaque() { |
||||||
|
Color back = getBackground(); |
||||||
|
Component p = getParent(); |
||||||
|
if (p != null) { |
||||||
|
p = p.getParent(); |
||||||
|
} |
||||||
|
// p should now be the JList.
|
||||||
|
boolean colorMatch = (back != null) && (p != null) && |
||||||
|
back.equals(p.getBackground()) && |
||||||
|
p.isOpaque(); |
||||||
|
return !colorMatch && super.isOpaque(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,39 @@ |
|||||||
|
package com.fr.design.remote.ui.list; |
||||||
|
|
||||||
|
import com.fr.design.remote.RemoteMember; |
||||||
|
|
||||||
|
import javax.swing.JList; |
||||||
|
import javax.swing.ListModel; |
||||||
|
import java.awt.Color; |
||||||
|
import java.util.Vector; |
||||||
|
|
||||||
|
public class MemberList extends JList<RemoteMember> { |
||||||
|
|
||||||
|
|
||||||
|
public MemberList() { |
||||||
|
super(); |
||||||
|
init(); |
||||||
|
} |
||||||
|
|
||||||
|
public MemberList(ListModel<RemoteMember> dataModel) { |
||||||
|
super(dataModel); |
||||||
|
init(); |
||||||
|
} |
||||||
|
|
||||||
|
public MemberList(RemoteMember[] listData) { |
||||||
|
super(listData); |
||||||
|
init(); |
||||||
|
} |
||||||
|
|
||||||
|
public MemberList(Vector<? extends RemoteMember> listData) { |
||||||
|
super(listData); |
||||||
|
init(); |
||||||
|
} |
||||||
|
|
||||||
|
private void init() { |
||||||
|
setBackground(new Color(0xF5F5F7)); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
|
@ -0,0 +1,45 @@ |
|||||||
|
package com.fr.design.remote.ui.list; |
||||||
|
|
||||||
|
import com.fr.base.BaseUtils; |
||||||
|
import com.fr.design.gui.icheckbox.UICheckBox; |
||||||
|
import com.fr.design.gui.ilable.UILabel; |
||||||
|
import com.fr.design.remote.RemoteMember; |
||||||
|
|
||||||
|
import javax.swing.BorderFactory; |
||||||
|
import javax.swing.JList; |
||||||
|
import javax.swing.JPanel; |
||||||
|
import javax.swing.ListCellRenderer; |
||||||
|
import java.awt.Component; |
||||||
|
import java.awt.FlowLayout; |
||||||
|
|
||||||
|
public class MemberListCellRender extends JPanel implements ListCellRenderer<RemoteMember> { |
||||||
|
|
||||||
|
private UILabel label; |
||||||
|
private UICheckBox check; |
||||||
|
|
||||||
|
|
||||||
|
public MemberListCellRender() { |
||||||
|
this.setBorder(BorderFactory.createEmptyBorder()); |
||||||
|
this.setLayout(new FlowLayout(FlowLayout.LEFT)); |
||||||
|
label = new UILabel(); |
||||||
|
label.setIcon(BaseUtils.readIcon("com/fr/design/remote/images/icon_Member_normal@1x.png")); |
||||||
|
check = new UICheckBox(); |
||||||
|
check.setSelected(false); |
||||||
|
this.add(label); |
||||||
|
this.add(check); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public Component getListCellRendererComponent(JList list, RemoteMember member, int index, boolean isSelected, boolean cellHasFocus) { |
||||||
|
this.setLabelName(member.getName()); |
||||||
|
check.setSelected(false); |
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
private void setLabelName(String name) { |
||||||
|
label.setName(name); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
} |