@ -0,0 +1,49 @@
|
||||
package com.fr.design.remote; |
||||
|
||||
import com.fr.design.beans.BasicBeanPane; |
||||
import com.fr.report.DesignAuthority; |
||||
|
||||
import javax.swing.*; |
||||
|
||||
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(DesignAuthority authority, Object bean) { |
||||
if (authority == null) { |
||||
return; |
||||
} |
||||
authority.setItems(((DesignAuthority) bean).getItems()); |
||||
} |
||||
} |
@ -0,0 +1,72 @@
|
||||
package com.fr.design.remote; |
||||
|
||||
import com.fr.general.Inter; |
||||
|
||||
public class RemoteMember { |
||||
|
||||
public static final RemoteMember DEFAULT_MEMBER = |
||||
new RemoteMember(Inter.getLocText("FR-Designer_Remote_Design_Loading")); |
||||
|
||||
|
||||
private String username; |
||||
private String realName; |
||||
private String userId; |
||||
|
||||
private boolean selected; |
||||
|
||||
public RemoteMember() { |
||||
|
||||
} |
||||
|
||||
public RemoteMember(String username) { |
||||
this.username = username; |
||||
} |
||||
|
||||
public RemoteMember username(String username) { |
||||
this.username = username; |
||||
return this; |
||||
} |
||||
|
||||
public RemoteMember realName(String realName) { |
||||
this.realName = realName; |
||||
return this; |
||||
} |
||||
|
||||
public RemoteMember userId(String userId) { |
||||
this.userId = userId; |
||||
return this; |
||||
} |
||||
|
||||
public String getRealName() { |
||||
return realName; |
||||
} |
||||
|
||||
public void setRealName(String realName) { |
||||
this.realName = realName; |
||||
} |
||||
|
||||
public String getUserId() { |
||||
return userId; |
||||
} |
||||
|
||||
public void setUserId(String userId) { |
||||
this.userId = userId; |
||||
} |
||||
|
||||
public String getUsername() { |
||||
return username; |
||||
} |
||||
|
||||
public void setUsername(String username) { |
||||
this.username = username; |
||||
} |
||||
|
||||
|
||||
public boolean isSelected() { |
||||
return selected; |
||||
} |
||||
|
||||
public void setSelected(boolean selected) { |
||||
this.selected = selected; |
||||
} |
||||
} |
@ -0,0 +1,47 @@
|
||||
package com.fr.design.remote; |
||||
|
||||
import com.fr.base.FRContext; |
||||
import com.fr.decision.webservice.bean.user.UserAdditionBean; |
||||
import com.fr.decision.webservice.v10.user.UserService; |
||||
|
||||
import java.util.ArrayList; |
||||
import java.util.Collection; |
||||
import java.util.List; |
||||
import java.util.Map; |
||||
|
||||
public class Utils { |
||||
|
||||
|
||||
private Utils() { |
||||
} |
||||
|
||||
public static Collection<? extends RemoteMember> getRemoteMember(String keyword) { |
||||
|
||||
List<UserAdditionBean> userBeans = new ArrayList<>(); |
||||
try { |
||||
Map<String, Object> result = |
||||
UserService.getInstance().getAllUsers( |
||||
FRContext.getCurrentEnv().getUser(), |
||||
1, |
||||
10, |
||||
keyword, |
||||
"", |
||||
true); |
||||
userBeans = (List<UserAdditionBean>) result.get("items"); |
||||
} catch (Exception e) { |
||||
FRContext.getLogger().error(e.getMessage()); |
||||
} |
||||
|
||||
List<RemoteMember> res = new ArrayList<>(); |
||||
|
||||
for (UserAdditionBean userBean : userBeans) { |
||||
res.add( |
||||
new RemoteMember() |
||||
.username(userBean.getUsername()) |
||||
.realName(userBean.getRealName()) |
||||
.userId(userBean.getId()) |
||||
); |
||||
} |
||||
return res; |
||||
} |
||||
} |
@ -0,0 +1,67 @@
|
||||
package com.fr.design.remote.action; |
||||
|
||||
import com.fr.base.BaseUtils; |
||||
import com.fr.base.FRContext; |
||||
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 com.fr.env.RemoteEnv; |
||||
import com.fr.general.Inter; |
||||
import com.fr.report.DesignAuthority; |
||||
|
||||
import java.awt.event.ActionEvent; |
||||
|
||||
/** |
||||
* @author yaohwu |
||||
*/ |
||||
public class RemoteDesignAuthorityManagerAction extends UpdateAction { |
||||
|
||||
|
||||
public RemoteDesignAuthorityManagerAction() { |
||||
this.setName(Inter.getLocText("FR-Designer_Remote_Design_Authority_Manager")); |
||||
this.setSmallIcon(BaseUtils.readIcon("com/fr/design/remote/images/icon_Remote_Design_Permission_Manager_normal@1x.png")); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public void actionPerformed(ActionEvent e) { |
||||
|
||||
final AuthorityManagerPane managerPane = new AuthorityManagerPane(); |
||||
|
||||
BasicDialog dialog = managerPane.showWindow(DesignerContext.getDesignerFrame()); |
||||
|
||||
if (!FRContext.getCurrentEnv().isLocalEnv()) { |
||||
try { |
||||
DesignAuthority[] authorities = ((RemoteEnv) FRContext.getCurrentEnv()).getAuthorities(); |
||||
if (authorities != null && authorities.length != 0) { |
||||
managerPane.populate(authorities); |
||||
} |
||||
} catch (Exception exception) { |
||||
FRContext.getLogger().error(exception.getMessage()); |
||||
} |
||||
} |
||||
|
||||
dialog.addDialogActionListener(new DialogActionAdapter() { |
||||
@Override |
||||
public void doOk() { |
||||
DesignAuthority[] authorities = managerPane.update(); |
||||
if (!FRContext.getCurrentEnv().isLocalEnv()) { |
||||
try { |
||||
((RemoteEnv) FRContext.getCurrentEnv()).updateAuthorities(authorities); |
||||
} catch (Exception exception) { |
||||
FRContext.getLogger().error(exception.getMessage()); |
||||
} |
||||
} |
||||
} |
||||
|
||||
@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 |
After Width: | Height: | Size: 238 B |
@ -0,0 +1,88 @@
|
||||
package com.fr.design.remote.ui; |
||||
|
||||
import com.fr.base.FRContext; |
||||
import com.fr.design.beans.BasicBeanPane; |
||||
import com.fr.design.gui.icontainer.UIScrollPane; |
||||
import com.fr.design.gui.ilable.UILabel; |
||||
import com.fr.design.gui.itree.refreshabletree.ExpandMutableTreeNode; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.design.remote.ui.tree.FileAuthorityTree; |
||||
import com.fr.file.filetree.FileNode; |
||||
import com.fr.file.filetree.IOFileNodeFilter; |
||||
import com.fr.general.Inter; |
||||
import com.fr.report.DesignAuthority; |
||||
import com.fr.stable.CoreConstants; |
||||
|
||||
import javax.swing.BorderFactory; |
||||
import javax.swing.tree.TreePath; |
||||
import java.awt.BorderLayout; |
||||
import java.util.ArrayList; |
||||
import java.util.Arrays; |
||||
import java.util.List; |
||||
|
||||
public class AuthorityEditorPane extends BasicBeanPane<DesignAuthority> { |
||||
|
||||
private UILabel label = new UILabel(); |
||||
|
||||
private FileAuthorityTree tree = new FileAuthorityTree(); |
||||
|
||||
|
||||
public AuthorityEditorPane() { |
||||
this.setLayout(FRGUIPaneFactory.createBorderLayout()); |
||||
this.setBorder(BorderFactory.createEmptyBorder()); |
||||
this.add(label, BorderLayout.NORTH); |
||||
IOFileNodeFilter filter = new IOFileNodeFilter(new String[]{".cpt", ".class", ".frm", ".form"}); |
||||
tree.setDigIn(true); |
||||
tree.setFileNodeFilter(filter); |
||||
this.add(new UIScrollPane(tree), BorderLayout.CENTER); |
||||
tree.refreshEnv(FRContext.getCurrentEnv()); |
||||
|
||||
} |
||||
|
||||
@Override |
||||
protected String title4PopupWindow() { |
||||
return Inter.getLocText("FR-Designer_Remote_Design_Configure_Authority"); |
||||
} |
||||
|
||||
@Override |
||||
public void populateBean(DesignAuthority ob) { |
||||
if (ob == null) { |
||||
return; |
||||
} |
||||
label.setText(ob.getUsername()); |
||||
|
||||
DesignAuthority.Item[] items = ob.getItems(); |
||||
if (items == null) { |
||||
return; |
||||
} |
||||
String[] paths = new String[items.length]; |
||||
for (int i = 0; i < items.length; i++) { |
||||
paths[i] = items[i].getPath(); |
||||
} |
||||
tree.selectCheckBoxPaths(paths); |
||||
} |
||||
|
||||
@Override |
||||
public DesignAuthority updateBean() { |
||||
DesignAuthority da = new DesignAuthority(); |
||||
TreePath[] treePaths = tree.getCheckBoxTreeSelectionModel().getSelectionPaths(); |
||||
|
||||
List<DesignAuthority.Item> items = new ArrayList<>(); |
||||
for (TreePath treePath : treePaths) { |
||||
StringBuilder tempSpot = new StringBuilder(); |
||||
boolean type = true; |
||||
for (int counter = 1, maxCounter = treePath.getPathCount(); counter < maxCounter; |
||||
counter++) { |
||||
if (counter > 1) { |
||||
tempSpot.append(CoreConstants.SEPARATOR); |
||||
} |
||||
FileNode fileNode = (FileNode) ((ExpandMutableTreeNode) treePath.getPathComponent(counter)).getUserObject(); |
||||
type = type && fileNode.isDirectory(); |
||||
tempSpot.append(fileNode.getName()); |
||||
} |
||||
items.add(new DesignAuthority.Item(tempSpot.toString(), type)); |
||||
} |
||||
da.setItems(items.toArray(new DesignAuthority.Item[0])); |
||||
return da; |
||||
} |
||||
} |
@ -0,0 +1,522 @@
|
||||
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.RemoteDesignAuthorityCreator; |
||||
import com.fr.design.remote.RemoteMember; |
||||
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.report.DesignAuthority; |
||||
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 = 90; |
||||
|
||||
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( |
||||
Inter.getLocText("FR-Designer_Remote_Design_User"), |
||||
BaseUtils.readIcon("com/fr/design/remote/images/icon_Member_normal@1x.png"), |
||||
DesignAuthority.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<DesignAuthority>()); |
||||
list.setCellRenderer(new AuthorityListCellRenderer()); |
||||
return list; |
||||
} |
||||
|
||||
|
||||
private void doWhenPopulate() { |
||||
|
||||
} |
||||
|
||||
private void doBeforePopulate() { |
||||
|
||||
} |
||||
|
||||
|
||||
public DesignAuthority[] update() { |
||||
List<DesignAuthority> res = new ArrayList<>(); |
||||
this.editorCtrl.update(); |
||||
DefaultListModel listModel = (DefaultListModel) this.authorityList.getModel(); |
||||
for (int i = 0, len = listModel.getSize(); i < len; i++) { |
||||
res.add((DesignAuthority) listModel.getElementAt(i)); |
||||
} |
||||
return res.toArray(new DesignAuthority[0]); |
||||
} |
||||
|
||||
public void populate(DesignAuthority[] authorities) { |
||||
DefaultListModel<DesignAuthority> listModel = (DefaultListModel<DesignAuthority>) this.authorityList.getModel(); |
||||
listModel.removeAllElements(); |
||||
if (ArrayUtils.isEmpty(authorities)) { |
||||
return; |
||||
} |
||||
|
||||
for (DesignAuthority 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++) { |
||||
DesignAuthority authority = (DesignAuthority) listModel.getElementAt(i); |
||||
if (ComparatorUtils.equals(name, authority.getUsername())) { |
||||
this.authorityList.setSelectedIndex(i); |
||||
break; |
||||
} |
||||
} |
||||
} |
||||
|
||||
|
||||
/** |
||||
* 获取选中的名字 |
||||
*/ |
||||
public String getSelectedName() { |
||||
DesignAuthority authority = this.authorityList.getSelectedValue(); |
||||
return authority == null ? null : authority.getUsername(); |
||||
} |
||||
|
||||
/** |
||||
* 添加 RemoteDesignAuthority |
||||
* |
||||
* @param authority authority |
||||
* @param index 序号 |
||||
*/ |
||||
public void addAuthority(DesignAuthority authority, int index) { |
||||
DefaultListModel<DesignAuthority> model = (DefaultListModel<DesignAuthority>) authorityList.getModel(); |
||||
|
||||
model.add(index, authority); |
||||
authorityList.setSelectedIndex(index); |
||||
authorityList.ensureIndexIsVisible(index); |
||||
|
||||
authorityList.revalidate(); |
||||
authorityList.repaint(); |
||||
} |
||||
|
||||
|
||||
protected DefaultListModel<DesignAuthority> getModel() { |
||||
return (DefaultListModel<DesignAuthority>) 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()), |
||||
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 DesignAuthority 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 = 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 { |
||||
|
||||
AddItemUpdateAction() { |
||||
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() { |
||||
// 获取添加的用户到权限编辑面板
|
||||
List<RemoteMember> members = userManagerPane.update(); |
||||
for (RemoteMember member : members) { |
||||
DesignAuthority authority = new DesignAuthority(); |
||||
authority.setUsername(member.getUsername()); |
||||
authority.setUserId(member.getUserId()); |
||||
authority.setRealName(member.getRealName()); |
||||
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.general.Inter; |
||||
import com.fr.report.DesignAuthority; |
||||
|
||||
import javax.swing.BorderFactory; |
||||
import java.awt.BorderLayout; |
||||
import java.util.Arrays; |
||||
|
||||
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("FR-Designer_Remote_Design_Authority_Manager"); |
||||
} |
||||
|
||||
public void populate(DesignAuthority[] authorities) { |
||||
list.populate(authorities); |
||||
} |
||||
|
||||
public DesignAuthority[] update() { |
||||
return list.update(); |
||||
} |
||||
} |
@ -0,0 +1,298 @@
|
||||
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.ilable.UILabel; |
||||
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.Utils; |
||||
import com.fr.design.remote.ui.list.AddedMemberList; |
||||
import com.fr.design.remote.ui.list.AddedMemberListCellRender; |
||||
import com.fr.design.remote.ui.list.AddingMemberList; |
||||
import com.fr.design.remote.ui.list.AddingMemberListCellRender; |
||||
import com.fr.design.remote.ui.list.MemberListSelectedChangeListener; |
||||
import com.fr.general.Inter; |
||||
import com.fr.stable.StringUtils; |
||||
import com.fr.third.guava.collect.ImmutableList; |
||||
|
||||
import javax.swing.BorderFactory; |
||||
import javax.swing.DefaultListModel; |
||||
import javax.swing.JPanel; |
||||
import javax.swing.ListSelectionModel; |
||||
import javax.swing.SwingWorker; |
||||
import javax.swing.border.EmptyBorder; |
||||
import java.awt.BorderLayout; |
||||
import java.awt.Component; |
||||
import java.awt.Dimension; |
||||
import java.awt.FlowLayout; |
||||
import java.awt.event.ActionEvent; |
||||
import java.awt.event.ActionListener; |
||||
import java.awt.event.KeyAdapter; |
||||
import java.awt.event.KeyEvent; |
||||
import java.util.ArrayList; |
||||
import java.util.Arrays; |
||||
import java.util.List; |
||||
|
||||
|
||||
/** |
||||
* @author yaohwu |
||||
*/ |
||||
public class UserManagerPane extends BasicPane { |
||||
|
||||
/** |
||||
* 获取的决策平台成员 |
||||
*/ |
||||
private List<RemoteMember> addingMembers = new ArrayList<>(); |
||||
/** |
||||
* 添加到设计的决策平台成员 |
||||
*/ |
||||
private List<RemoteMember> addedMembers = new ArrayList<>(); |
||||
|
||||
/** |
||||
* 决策平台成员列表model |
||||
*/ |
||||
private DefaultListModel<RemoteMember> addingListModel = new DefaultListModel<>(); |
||||
/** |
||||
* 搜索输入框 |
||||
*/ |
||||
private UITextField keyField = new UITextField(); |
||||
/** |
||||
* 搜索按钮 |
||||
*/ |
||||
private UIButton keyButton = new UIButton(); |
||||
|
||||
/** |
||||
* 搜索按钮绑定事件 |
||||
*/ |
||||
private ActionListener keyButtonActionListener = new ActionListener() { |
||||
@Override |
||||
public void actionPerformed(ActionEvent e) { |
||||
searchAddingMembers(keyField.getText()); |
||||
} |
||||
}; |
||||
|
||||
/** |
||||
* 输入框绑定事件 |
||||
*/ |
||||
private KeyAdapter keyFieldKeyListener = new KeyAdapter() { |
||||
@Override |
||||
public void keyReleased(KeyEvent e) { |
||||
// 判断按下的键是否是回车键
|
||||
// todo 对话框回车键绑定的是对话框的确定按钮
|
||||
if (e.getKeyCode() == KeyEvent.VK_ENTER) { |
||||
searchAddingMembers(keyField.getText()); |
||||
} |
||||
} |
||||
}; |
||||
/** |
||||
* 添加到设计的决策成员计数标签 |
||||
*/ |
||||
private UILabel countLabel = new UILabel(); |
||||
/** |
||||
* 添加到设计的决策成员计数标签 |
||||
*/ |
||||
private DefaultListModel<RemoteMember> addedListModel; |
||||
|
||||
|
||||
private MemberListSelectedChangeListener addingListChangeListener = new MemberListSelectedChangeListener() { |
||||
@Override |
||||
public void selectedChange() { |
||||
resetAddedMembers(); |
||||
sync2AddedMembersFromAdding(); |
||||
addToAddedMemberList(); |
||||
} |
||||
}; |
||||
|
||||
private MemberListSelectedChangeListener addedListChangeListener = new MemberListSelectedChangeListener() { |
||||
@Override |
||||
public void selectedChange() { |
||||
addingList.revalidate(); |
||||
addingList.repaint(); |
||||
resetAddedMembers(); |
||||
sync2AddedMembersFormAdded(); |
||||
// 不需要重复更新右侧列表显示 但是更新一下计数显示
|
||||
countLabel.setText( |
||||
Inter.getLocText("FR-Designer_Remote_Design_Selected_Member_Count", |
||||
String.valueOf(addedMembers.size()) |
||||
) |
||||
); |
||||
|
||||
} |
||||
}; |
||||
private AddedMemberList addedList; |
||||
private AddingMemberList addingList; |
||||
|
||||
|
||||
public UserManagerPane() { |
||||
this.setBorder(BorderFactory.createEmptyBorder()); |
||||
this.setLayout(new BorderLayout()); |
||||
this.add( |
||||
TableLayoutHelper.createTableLayoutPane( |
||||
new Component[][]{ |
||||
new Component[]{createLeftPanel(), createRightPanel()} |
||||
}, |
||||
new double[]{TableLayout.FILL}, |
||||
new double[]{TableLayout.FILL, TableLayout.FILL} |
||||
), |
||||
BorderLayout.CENTER); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
protected String title4PopupWindow() { |
||||
return Inter.getLocText("FR-Designer_Remote_Design_Add_Member"); |
||||
} |
||||
|
||||
private JPanel createLeftPanel() { |
||||
JPanel content = new JPanel(new BorderLayout()); |
||||
|
||||
content.setBorder( |
||||
BorderFactory.createCompoundBorder( |
||||
new EmptyBorder(6, 0, 0, 0), |
||||
UITitledBorder.createBorderWithTitle( |
||||
Inter.getLocText("FR-Designer_Remote_Design_Decision_Member") |
||||
) |
||||
) |
||||
); |
||||
|
||||
// 搜索
|
||||
JPanel searchPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); |
||||
searchPanel.setBorder(BorderFactory.createEmptyBorder()); |
||||
keyField.setPreferredSize(new Dimension(200, 20)); |
||||
keyField.requestFocus(); |
||||
keyField.addKeyListener(keyFieldKeyListener); |
||||
keyButton.setText(Inter.getLocText("FR-Designer_Remote_Design_Search")); |
||||
keyButton.addActionListener(keyButtonActionListener); |
||||
searchPanel.add(keyField); |
||||
searchPanel.add(keyButton); |
||||
|
||||
// 内容列表
|
||||
addingListModel = new DefaultListModel<>(); |
||||
addingList = new AddingMemberList(addingListModel); |
||||
addingList.setCellRenderer(new AddingMemberListCellRender()); |
||||
addingList.addSelectedChangeListener(addingListChangeListener); |
||||
resetMembers(); |
||||
addToMemberList(); |
||||
searchAddingMembers(StringUtils.EMPTY); |
||||
UIScrollPane listPane = new UIScrollPane(addingList); |
||||
listPane.setBorder(BorderFactory.createEmptyBorder()); |
||||
|
||||
content.add(searchPanel, BorderLayout.NORTH); |
||||
content.add(listPane, BorderLayout.CENTER); |
||||
return content; |
||||
} |
||||
|
||||
|
||||
private JPanel createRightPanel() { |
||||
JPanel content = new JPanel(new BorderLayout()); |
||||
|
||||
content.setBorder( |
||||
BorderFactory.createCompoundBorder( |
||||
new EmptyBorder(6, 0, 0, 0), |
||||
UITitledBorder.createBorderWithTitle( |
||||
Inter.getLocText("FR-Designer_Remote_Design_Selected_Member") |
||||
) |
||||
) |
||||
); |
||||
|
||||
// 计数
|
||||
countLabel.setText( |
||||
Inter.getLocText("FR-Designer_Remote_Design_Selected_Member_Count", |
||||
String.valueOf(addedMembers.size())) |
||||
); |
||||
|
||||
addedListModel = new DefaultListModel<>(); |
||||
addedList = new AddedMemberList(addedListModel); |
||||
addedList.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); |
||||
addedList.setCellRenderer(new AddedMemberListCellRender()); |
||||
addedList.addSelectedChangeListener(addedListChangeListener); |
||||
resetAddedMembers(); |
||||
addToAddedMemberList(); |
||||
UIScrollPane listPane = new UIScrollPane(addedList); |
||||
listPane.setBorder(BorderFactory.createEmptyBorder()); |
||||
|
||||
content.add(countLabel, BorderLayout.NORTH); |
||||
content.add(listPane, BorderLayout.CENTER); |
||||
return content; |
||||
|
||||
} |
||||
|
||||
|
||||
private void addToMemberList() { |
||||
addingListModel.clear(); |
||||
for (RemoteMember member : addingMembers) { |
||||
addingListModel.addElement(member); |
||||
} |
||||
addingList.revalidate(); |
||||
addingList.repaint(); |
||||
} |
||||
|
||||
private void addToAddedMemberList() { |
||||
addedListModel.clear(); |
||||
for (RemoteMember member : addedMembers) { |
||||
addedListModel.addElement(member); |
||||
} |
||||
addedList.revalidate(); |
||||
addedList.repaint(); |
||||
countLabel.setText( |
||||
Inter.getLocText("FR-Designer_Remote_Design_Selected_Member_Count", |
||||
String.valueOf(addedMembers.size()) |
||||
)); |
||||
} |
||||
|
||||
private void resetMembers() { |
||||
addingMembers.clear(); |
||||
addingMembers.add(RemoteMember.DEFAULT_MEMBER); |
||||
} |
||||
|
||||
private void resetAddedMembers() { |
||||
addedMembers.clear(); |
||||
} |
||||
|
||||
|
||||
private void searchAddingMembers(final String keyword) { |
||||
|
||||
final SwingWorker getMemberWorker = new SwingWorker<List<RemoteMember>, Void>() { |
||||
@Override |
||||
protected List<RemoteMember> doInBackground() { |
||||
addingMembers.clear(); |
||||
addingMembers.addAll(Utils.getRemoteMember(keyword)); |
||||
return addingMembers; |
||||
} |
||||
|
||||
@Override |
||||
protected void done() { |
||||
addToMemberList(); |
||||
} |
||||
}; |
||||
getMemberWorker.execute(); |
||||
} |
||||
|
||||
|
||||
private void sync2AddedMembersFromAdding() { |
||||
RemoteMember[] members = new RemoteMember[addingListModel.getSize()]; |
||||
// shallow copy
|
||||
addingListModel.copyInto(members); |
||||
for (RemoteMember member : members) { |
||||
if (member.isSelected()) { |
||||
addedMembers.add(member); |
||||
} |
||||
} |
||||
} |
||||
|
||||
private void sync2AddedMembersFormAdded() { |
||||
RemoteMember[] members = new RemoteMember[addedListModel.getSize()]; |
||||
// shallow copy
|
||||
addedListModel.copyInto(members); |
||||
addedMembers.addAll(Arrays.asList(members)); |
||||
} |
||||
|
||||
|
||||
public ImmutableList<RemoteMember> update() { |
||||
return ImmutableList.copyOf(addedMembers); |
||||
} |
||||
} |
@ -0,0 +1,44 @@
|
||||
package com.fr.design.remote.ui.list; |
||||
|
||||
import com.fr.design.remote.RemoteMember; |
||||
|
||||
import javax.swing.*; |
||||
import java.awt.event.MouseEvent; |
||||
import java.util.Vector; |
||||
|
||||
public class AddedMemberList extends MemberList { |
||||
|
||||
public AddedMemberList() { |
||||
super(); |
||||
} |
||||
|
||||
public AddedMemberList(DefaultListModel<RemoteMember> dataModel) { |
||||
super(dataModel); |
||||
} |
||||
|
||||
public AddedMemberList(RemoteMember[] listData) { |
||||
super(listData); |
||||
} |
||||
|
||||
public AddedMemberList(Vector<? extends RemoteMember> listData) { |
||||
super(listData); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
protected boolean shouldDisplaySelected(MouseEvent e) { |
||||
return true; |
||||
} |
||||
|
||||
@Override |
||||
protected void displaySelected() { |
||||
RemoteMember member = getSelectedValue(); |
||||
if (member != null) { |
||||
member.setSelected(!member.isSelected()); |
||||
((DefaultListModel<RemoteMember>) getModel()).removeElement(member); |
||||
} |
||||
revalidate(); |
||||
repaint(); |
||||
fireSelectedChange(); |
||||
} |
||||
} |
@ -0,0 +1,45 @@
|
||||
package com.fr.design.remote.ui.list; |
||||
|
||||
import com.fr.base.BaseUtils; |
||||
import com.fr.design.gui.ibutton.UIButton; |
||||
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 AddedMemberListCellRender extends JPanel implements ListCellRenderer<RemoteMember> { |
||||
|
||||
|
||||
private UILabel label; |
||||
|
||||
private UIButton uiButton; |
||||
|
||||
public AddedMemberListCellRender() { |
||||
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")); |
||||
|
||||
uiButton = new UIButton(); |
||||
uiButton.setIcon(BaseUtils.readIcon("com/fr/design/remote/images/icon_Remove_x.png")); |
||||
|
||||
this.add(label); |
||||
this.add(uiButton); |
||||
} |
||||
|
||||
@Override |
||||
public Component getListCellRendererComponent(JList<? extends RemoteMember> list, RemoteMember member, int index, boolean isSelected, boolean cellHasFocus) { |
||||
this.setLabelText(member.getUsername()); |
||||
return this; |
||||
} |
||||
|
||||
private void setLabelText(String name) { |
||||
label.setText(name); |
||||
} |
||||
} |
@ -0,0 +1,45 @@
|
||||
package com.fr.design.remote.ui.list; |
||||
|
||||
import com.fr.design.remote.RemoteMember; |
||||
|
||||
import javax.swing.DefaultListModel; |
||||
import java.awt.event.MouseEvent; |
||||
import java.util.Vector; |
||||
|
||||
public class AddingMemberList extends MemberList { |
||||
|
||||
|
||||
public AddingMemberList() { |
||||
super(); |
||||
} |
||||
|
||||
public AddingMemberList(DefaultListModel<RemoteMember> dataModel) { |
||||
super(dataModel); |
||||
} |
||||
|
||||
public AddingMemberList(RemoteMember[] listData) { |
||||
super(listData); |
||||
|
||||
} |
||||
|
||||
public AddingMemberList(Vector<? extends RemoteMember> listData) { |
||||
super(listData); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
protected void displaySelected() { |
||||
RemoteMember member = getSelectedValue(); |
||||
member.setSelected(!member.isSelected()); |
||||
revalidate(); |
||||
repaint(); |
||||
fireSelectedChange(); |
||||
} |
||||
|
||||
@Override |
||||
protected boolean shouldDisplaySelected(MouseEvent e) { |
||||
return true; |
||||
} |
||||
} |
||||
|
||||
|
@ -0,0 +1,47 @@
|
||||
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 AddingMemberListCellRender extends JPanel implements ListCellRenderer<RemoteMember> { |
||||
|
||||
private UILabel label; |
||||
private UICheckBox check; |
||||
|
||||
|
||||
public AddingMemberListCellRender() { |
||||
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); |
||||
check.setEnabled(true); |
||||
|
||||
this.add(label); |
||||
this.add(check); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public Component getListCellRendererComponent(JList list, RemoteMember member, int index, boolean isSelected, boolean cellHasFocus) { |
||||
this.setLabelText(member.getUsername()); |
||||
check.setSelected(member.isSelected()); |
||||
return this; |
||||
} |
||||
|
||||
private void setLabelText(String name) { |
||||
label.setText(name); |
||||
} |
||||
} |
@ -0,0 +1,28 @@
|
||||
package com.fr.design.remote.ui.list; |
||||
|
||||
import com.fr.report.DesignAuthority; |
||||
|
||||
import javax.swing.JList; |
||||
import javax.swing.ListModel; |
||||
import java.util.Vector; |
||||
|
||||
public class AuthorityList extends JList<DesignAuthority> { |
||||
|
||||
|
||||
public AuthorityList() { |
||||
super(); |
||||
} |
||||
|
||||
public AuthorityList(ListModel<DesignAuthority> dataModel) { |
||||
super(dataModel); |
||||
} |
||||
|
||||
public AuthorityList(final DesignAuthority[] listData) { |
||||
super(listData); |
||||
} |
||||
|
||||
public AuthorityList(final Vector<? extends DesignAuthority> listData) { |
||||
super(listData); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,129 @@
|
||||
package com.fr.design.remote.ui.list; |
||||
|
||||
import com.fr.base.BaseUtils; |
||||
import com.fr.report.DesignAuthority; |
||||
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; |
||||
|
||||
public class AuthorityListCellRenderer extends |
||||
JLabel implements ListCellRenderer<DesignAuthority> { |
||||
|
||||
/** |
||||
* 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, DesignAuthority 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.getUsername()); |
||||
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,84 @@
|
||||
package com.fr.design.remote.ui.list; |
||||
|
||||
import com.fr.design.remote.RemoteMember; |
||||
|
||||
import javax.swing.DefaultListModel; |
||||
import javax.swing.JList; |
||||
import javax.swing.ListSelectionModel; |
||||
import java.awt.Color; |
||||
import java.awt.event.KeyAdapter; |
||||
import java.awt.event.KeyEvent; |
||||
import java.awt.event.MouseAdapter; |
||||
import java.awt.event.MouseEvent; |
||||
import java.util.Vector; |
||||
|
||||
public abstract class MemberList extends JList<RemoteMember> { |
||||
|
||||
public MemberList(DefaultListModel<RemoteMember> dataModel) { |
||||
super(dataModel); |
||||
init(); |
||||
} |
||||
|
||||
public MemberList(RemoteMember[] listData) { |
||||
super(listData); |
||||
init(); |
||||
} |
||||
|
||||
public MemberList(Vector<? extends RemoteMember> listData) { |
||||
super(listData); |
||||
init(); |
||||
} |
||||
|
||||
public MemberList() { |
||||
super(); |
||||
init(); |
||||
} |
||||
|
||||
|
||||
public void addSelectedChangeListener(MemberListSelectedChangeListener l) { |
||||
this.listenerList.add(MemberListSelectedChangeListener.class, l); |
||||
} |
||||
|
||||
public void removeSelectedChangeListener(MemberListSelectedChangeListener l) { |
||||
this.listenerList.remove(MemberListSelectedChangeListener.class, l); |
||||
} |
||||
|
||||
public void fireSelectedChange() { |
||||
Object[] listeners = listenerList.getListenerList(); |
||||
for (int i = listeners.length - 2; i >= 0; i -= 2) { |
||||
if (listeners[i] == MemberListSelectedChangeListener.class) { |
||||
((MemberListSelectedChangeListener) listeners[i + 1]).selectedChange(); |
||||
} |
||||
} |
||||
} |
||||
|
||||
private void init() { |
||||
setBackground(new Color(0xF5F5F7)); |
||||
this.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); |
||||
|
||||
this.addMouseListener(new MouseAdapter() { |
||||
@Override |
||||
public void mouseReleased(MouseEvent e) { |
||||
super.mouseReleased(e); |
||||
if (shouldDisplaySelected(e)) { |
||||
displaySelected(); |
||||
} |
||||
} |
||||
}); |
||||
this.addKeyListener(new KeyAdapter() { |
||||
@Override |
||||
public void keyReleased(KeyEvent e) { |
||||
super.keyReleased(e); |
||||
if (e.getKeyCode() == KeyEvent.VK_SPACE) { |
||||
displaySelected(); |
||||
} |
||||
} |
||||
}); |
||||
} |
||||
|
||||
abstract protected void displaySelected(); |
||||
|
||||
abstract protected boolean shouldDisplaySelected(MouseEvent e); |
||||
|
||||
|
||||
} |
@ -0,0 +1,7 @@
|
||||
package com.fr.design.remote.ui.list; |
||||
|
||||
import java.util.EventListener; |
||||
|
||||
public interface MemberListSelectedChangeListener extends EventListener { |
||||
void selectedChange(); |
||||
} |
@ -0,0 +1,72 @@
|
||||
package com.fr.design.remote.ui.tree; |
||||
|
||||
import com.fr.design.gui.itree.filetree.TemplateFileTree; |
||||
import com.fr.design.gui.itree.refreshabletree.ExpandMutableTreeNode; |
||||
import com.fr.file.filetree.FileNode; |
||||
import com.fr.general.ComparatorUtils; |
||||
import com.fr.stable.CoreConstants; |
||||
import com.fr.stable.StringUtils; |
||||
|
||||
import javax.swing.tree.DefaultTreeModel; |
||||
import javax.swing.tree.TreePath; |
||||
import java.io.File; |
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
|
||||
public class FileAuthorityTree extends TemplateFileTree { |
||||
|
||||
@Override |
||||
public boolean isCheckBoxVisible(TreePath path) { |
||||
return true; |
||||
} |
||||
|
||||
|
||||
public void selectCheckBoxPaths(String[] paths) { |
||||
if (paths == null || paths.length == 0) { |
||||
return; |
||||
} |
||||
|
||||
DefaultTreeModel model = (DefaultTreeModel) this.getModel(); |
||||
ExpandMutableTreeNode treeNode = (ExpandMutableTreeNode) model.getRoot(); |
||||
List<TreePath> res = new ArrayList<>(); |
||||
for (int i = 0, len = treeNode.getChildCount(); i < len; i++) { |
||||
ExpandMutableTreeNode childTreeNode = (ExpandMutableTreeNode) treeNode.getChildAt(i); |
||||
for (String path : paths) { |
||||
TreePath tPath = getSelectingPath(childTreeNode, StringUtils.EMPTY, path, model); |
||||
if (tPath != null) { |
||||
res.add(tPath); |
||||
} |
||||
} |
||||
} |
||||
// 勾选中这些结点
|
||||
this.getCheckBoxTreeSelectionModel().setSelectionPaths(res.toArray(new TreePath[0])); |
||||
} |
||||
|
||||
|
||||
private TreePath getSelectingPath(ExpandMutableTreeNode currentTreeNode, String prefix, String filePath, DefaultTreeModel model) { |
||||
FileNode fileNode = (FileNode) currentTreeNode.getUserObject(); |
||||
String nodePath = fileNode.getName(); |
||||
String currentTreePath = prefix + nodePath; |
||||
TreePath res; |
||||
|
||||
// 判断是否是希望选中的
|
||||
if (ComparatorUtils.equals(new File(currentTreePath), new File(filePath))) { |
||||
return new TreePath(model.getPathToRoot(currentTreeNode)); |
||||
} |
||||
// 如果当前路径是currentFilePath的ParentFile,则expandTreeNode,并继续往下找
|
||||
else if (isParentFile(currentTreePath, filePath)) { |
||||
loadPendingChildTreeNode(currentTreeNode); |
||||
prefix = currentTreePath + CoreConstants.SEPARATOR; |
||||
for (int i = 0, len = currentTreeNode.getChildCount(); i < len; i++) { |
||||
ExpandMutableTreeNode childTreeNode = (ExpandMutableTreeNode) currentTreeNode.getChildAt(i); |
||||
// 继续在子结点里面找
|
||||
res = getSelectingPath(childTreeNode, prefix, filePath, model); |
||||
if (res != null) { |
||||
return res; |
||||
} |
||||
} |
||||
return null; |
||||
} |
||||
return null; |
||||
} |
||||
} |
@ -0,0 +1,148 @@
|
||||
package com.fr.design.remote.ui.tree; |
||||
|
||||
import javax.swing.tree.DefaultMutableTreeNode; |
||||
|
||||
public class FileAuthorityTreeNode extends DefaultMutableTreeNode { |
||||
|
||||
public enum Status { |
||||
SELECTED, |
||||
UNSELECTED, |
||||
INDETERMINATE |
||||
} |
||||
|
||||
|
||||
private Status status; |
||||
|
||||
|
||||
public FileAuthorityTreeNode() { |
||||
this(null); |
||||
} |
||||
|
||||
public FileAuthorityTreeNode(Object userObject) { |
||||
this(userObject, true, Status.UNSELECTED); |
||||
} |
||||
|
||||
public FileAuthorityTreeNode(Object userObject, boolean allowsChildren, Status status) { |
||||
super(userObject, allowsChildren); |
||||
this.status = status; |
||||
} |
||||
|
||||
public Status getStatus() { |
||||
return status; |
||||
} |
||||
|
||||
public boolean isSelected() { |
||||
return status == Status.SELECTED; |
||||
} |
||||
|
||||
public boolean isUnselected() { |
||||
return status == Status.UNSELECTED; |
||||
} |
||||
|
||||
public boolean isIndeterminate() { |
||||
return status == Status.INDETERMINATE; |
||||
} |
||||
|
||||
|
||||
public void setSelected(boolean selected) { |
||||
setStatus(selected ? Status.SELECTED : Status.UNSELECTED); |
||||
} |
||||
|
||||
|
||||
public void setStatus(Status status) { |
||||
this.status = status; |
||||
switch (status) { |
||||
case SELECTED: |
||||
// 标记为选中
|
||||
// 向下
|
||||
// 如果选中,则所有的子结点都要选中
|
||||
if (children != null) { |
||||
for (Object obj : children) { |
||||
FileAuthorityTreeNode node = (FileAuthorityTreeNode) obj; |
||||
if (!node.isSelected()) { |
||||
node.setSelected(true); |
||||
} |
||||
} |
||||
} |
||||
// 向上
|
||||
// 检查其父节点
|
||||
if (parent != null) { |
||||
FileAuthorityTreeNode pNode = (FileAuthorityTreeNode) parent; |
||||
int index = 0; |
||||
for (; index < pNode.children.size(); ++index) { |
||||
FileAuthorityTreeNode pChildNode = (FileAuthorityTreeNode) pNode.children.get(index); |
||||
if (!pChildNode.isSelected()) { |
||||
break; |
||||
} |
||||
} |
||||
// 如果父结点下的子结点都被选中了,那么选中父节点
|
||||
if (index == pNode.children.size()) { |
||||
if (!pNode.isSelected()) { |
||||
pNode.setSelected(true); |
||||
} |
||||
} |
||||
// 如果父结点下的子结点有部分没被选中,那么标记父结点选中状况为未知
|
||||
else { |
||||
if (!pNode.isIndeterminate()) { |
||||
pNode.setStatus(Status.INDETERMINATE); |
||||
} |
||||
} |
||||
} |
||||
break; |
||||
case UNSELECTED: |
||||
//标记为未被选中
|
||||
// 向下
|
||||
// 子结点都要取消选中
|
||||
if (children != null) { |
||||
for (Object aChildren : children) { |
||||
FileAuthorityTreeNode node = (FileAuthorityTreeNode) aChildren; |
||||
if (!node.isUnselected()) { |
||||
node.setSelected(false); |
||||
} |
||||
} |
||||
} |
||||
// 向上
|
||||
// 查看父节点的选中情况
|
||||
|
||||
if (parent != null) { |
||||
FileAuthorityTreeNode pNode = (FileAuthorityTreeNode) parent; |
||||
int index = 0; |
||||
for (; index < pNode.children.size(); ++index) { |
||||
FileAuthorityTreeNode pChildNode = (FileAuthorityTreeNode) pNode.children.get(index); |
||||
if (!pChildNode.isUnselected()) { |
||||
break; |
||||
} |
||||
} |
||||
// 如果父结点下的子结点都是未被选中的,那么取消选中父节点
|
||||
if (index == pNode.children.size()) { |
||||
if (!pNode.isUnselected()) { |
||||
pNode.setSelected(false); |
||||
} |
||||
} |
||||
// 如果父结点下的子结点有部分不是未被选中的,那么标记父结点选中状况为未知
|
||||
else { |
||||
if (!pNode.isIndeterminate()) { |
||||
pNode.setStatus(Status.INDETERMINATE); |
||||
} |
||||
} |
||||
} |
||||
break; |
||||
case INDETERMINATE: |
||||
// 标记为未知
|
||||
// 向下
|
||||
// 不做改动
|
||||
|
||||
// 向上
|
||||
// 需要将父结点标记为未知
|
||||
if (parent != null) { |
||||
FileAuthorityTreeNode pNode = (FileAuthorityTreeNode) parent; |
||||
if (!pNode.isIndeterminate()) { |
||||
pNode.setStatus(Status.INDETERMINATE); |
||||
} |
||||
} |
||||
break; |
||||
default: |
||||
break; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,10 @@
|
||||
package com.fr.env; |
||||
|
||||
import com.fr.report.DesignAuthority; |
||||
|
||||
public interface DesignAuthorityConfigurable { |
||||
|
||||
DesignAuthority[] getAuthorities(); |
||||
|
||||
boolean updateAuthorities(DesignAuthority[] authorities) throws Exception; |
||||
} |
@ -0,0 +1,86 @@
|
||||
package com.fr.env; |
||||
|
||||
import com.fr.base.FRContext; |
||||
import com.fr.general.IOUtils; |
||||
import com.fr.report.DesignAuthority; |
||||
import com.fr.stable.EncodeConstants; |
||||
import com.fr.third.org.apache.http.HttpEntity; |
||||
import com.fr.third.org.apache.http.client.methods.CloseableHttpResponse; |
||||
import com.fr.third.org.apache.http.client.methods.HttpUriRequest; |
||||
import com.fr.third.org.apache.http.client.methods.RequestBuilder; |
||||
import com.fr.third.org.apache.http.entity.ContentType; |
||||
import com.fr.third.org.apache.http.entity.InputStreamEntity; |
||||
import com.fr.third.org.apache.http.impl.client.CloseableHttpClient; |
||||
import com.fr.third.org.apache.http.impl.client.HttpClients; |
||||
import com.fr.third.org.apache.http.util.EntityUtils; |
||||
import com.fr.web.utils.AuthorityXMLUtils; |
||||
|
||||
import java.io.ByteArrayInputStream; |
||||
import java.io.ByteArrayOutputStream; |
||||
import java.io.IOException; |
||||
|
||||
public class RemoteEnvUtils { |
||||
|
||||
private RemoteEnvUtils() { |
||||
} |
||||
|
||||
public static boolean updateAuthorities(DesignAuthority[] authorities, RemoteEnv env) { |
||||
String path = env.getPath(); |
||||
String userID = env.getUserID(); |
||||
|
||||
String res = null; |
||||
CloseableHttpClient httpClient = HttpClients.createDefault(); |
||||
|
||||
ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); |
||||
|
||||
AuthorityXMLUtils.writeDesignAuthoritiesXML(authorities, outputStream); |
||||
|
||||
|
||||
InputStreamEntity reqEntity = new InputStreamEntity(new ByteArrayInputStream(outputStream.toByteArray()), ContentType.TEXT_XML); |
||||
|
||||
HttpUriRequest request = RequestBuilder.post(path) |
||||
.addParameter("id", userID) |
||||
.addParameter("op", "remote_design_authority") |
||||
.addParameter("cmd", "update_authorities") |
||||
.setEntity(reqEntity) |
||||
.build(); |
||||
|
||||
try { |
||||
CloseableHttpResponse response = httpClient.execute(request); |
||||
HttpEntity entity = response.getEntity(); |
||||
res = IOUtils.inputStream2String(entity.getContent(), EncodeConstants.ENCODING_UTF_8); |
||||
EntityUtils.consume(entity); |
||||
} catch (IOException e) { |
||||
FRContext.getLogger().error(e.getMessage()); |
||||
} |
||||
|
||||
return res != null && Boolean.valueOf(res); |
||||
|
||||
} |
||||
|
||||
public static DesignAuthority[] getAuthorities(RemoteEnv env) { |
||||
String path = env.getPath(); |
||||
String userID = env.getUserID(); |
||||
DesignAuthority[] authorities = null; |
||||
CloseableHttpClient httpClient = HttpClients.createDefault(); |
||||
|
||||
HttpUriRequest request = RequestBuilder.get(path) |
||||
.addParameter("id", userID) |
||||
.addParameter("op", "remote_design_authority") |
||||
.addParameter("cmd", "get_authorities") |
||||
.build(); |
||||
|
||||
try { |
||||
CloseableHttpResponse response = httpClient.execute(request); |
||||
HttpEntity entity = response.getEntity(); |
||||
|
||||
authorities = AuthorityXMLUtils.readDesignAuthoritiesXML(entity.getContent()); |
||||
EntityUtils.consume(entity); |
||||
} catch (Exception e) { |
||||
FRContext.getLogger().error(e.getMessage()); |
||||
} |
||||
return authorities; |
||||
|
||||
} |
||||
|
||||
} |