Browse Source

Merge branch 'feature/10.0' of https://cloud.finedevelop.com/scm/~bjorn/design into feature/10.0

research/11.0
白岳 5 years ago
parent
commit
878a90fa4a
  1. 2
      designer-base/src/main/java/com/fr/design/extra/PluginOperateUtils.java
  2. 10
      designer-base/src/main/java/com/fr/design/file/NodeAuthProcessor.java
  3. 16
      designer-base/src/main/java/com/fr/design/remote/action/RemoteDesignAuthManagerAction.java
  4. 14
      designer-base/src/main/java/com/fr/design/remote/constants/MemberIcon.java
  5. 64
      designer-base/src/main/java/com/fr/design/remote/ui/AbstractListControlPane.java
  6. 440
      designer-base/src/main/java/com/fr/design/remote/ui/AbstractManagerPane.java
  7. 6
      designer-base/src/main/java/com/fr/design/remote/ui/AuthorityEditorPane.java
  8. 38
      designer-base/src/main/java/com/fr/design/remote/ui/AuthorityListCustomRolePane.java
  9. 38
      designer-base/src/main/java/com/fr/design/remote/ui/AuthorityListUserPane.java
  10. 39
      designer-base/src/main/java/com/fr/design/remote/ui/AuthorityManagerPane.java
  11. 83
      designer-base/src/main/java/com/fr/design/remote/ui/CustomRoleManagerPane.java
  12. 417
      designer-base/src/main/java/com/fr/design/remote/ui/UserManagerPane.java
  13. 17
      designer-base/src/main/java/com/fr/design/remote/ui/list/AddedMemberList.java
  14. 12
      designer-base/src/main/java/com/fr/design/remote/ui/list/AddedMemberListCellRender.java
  15. 19
      designer-base/src/main/java/com/fr/design/remote/ui/list/AddingMemberList.java
  16. 14
      designer-base/src/main/java/com/fr/design/remote/ui/list/AddingMemberListCellRender.java
  17. 12
      designer-base/src/main/java/com/fr/design/remote/ui/list/AuthorityListCellRenderer.java
  18. 25
      designer-base/src/main/java/com/fr/design/remote/ui/list/cell/AddedCustomRoleListCellRender.java
  19. 25
      designer-base/src/main/java/com/fr/design/remote/ui/list/cell/AddedUserListCellRender.java
  20. 25
      designer-base/src/main/java/com/fr/design/remote/ui/list/cell/AddingCustomRoleListCellRender.java
  21. 25
      designer-base/src/main/java/com/fr/design/remote/ui/list/cell/AddingUserListCellRender.java
  22. 25
      designer-base/src/main/java/com/fr/design/remote/ui/list/cell/AuthorityCustomRoleListCellRender.java
  23. 25
      designer-base/src/main/java/com/fr/design/remote/ui/list/cell/AuthorityUserListCellRender.java
  24. 118
      designer-base/src/main/java/com/fr/design/update/actions/FileDownloader.java
  25. 55
      designer-base/src/main/java/com/fr/design/update/actions/FileProcess.java
  26. 102
      designer-base/src/main/java/com/fr/design/update/domain/DownloadItem.java
  27. 195
      designer-base/src/main/java/com/fr/design/update/ui/dialog/UpdateMainDialog.java
  28. 6
      designer-base/src/main/java/com/fr/design/utils/gui/GUICoreUtils.java
  29. BIN
      designer-base/src/main/resources/com/fr/design/remote/images/icon_Custom_Role_normal@1x.png
  30. BIN
      designer-base/src/main/resources/com/fr/design/remote/images/icon_Custom_Role_normal@2x.png
  31. 8
      designer-form/src/main/java/com/fr/design/designer/properties/items/FRBorderConstraintsItems.java

2
designer-base/src/main/java/com/fr/design/extra/PluginOperateUtils.java

@ -96,7 +96,7 @@ public class PluginOperateUtils {
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Delete_Confirmed"),
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Warning"),
JOptionPane.OK_CANCEL_OPTION,
JOptionPane.INFORMATION_MESSAGE
JOptionPane.WARNING_MESSAGE
);
if (rv == JOptionPane.OK_OPTION) {
PluginMarker pluginMarker = PluginUtils.createPluginMarker(pluginInfo);

10
designer-base/src/main/java/com/fr/design/file/NodeAuthProcessor.java

@ -11,6 +11,7 @@ import com.fr.stable.CoreConstants;
import com.fr.stable.project.ProjectConstants;
import com.fr.workspace.WorkContext;
import com.fr.workspace.server.authority.AuthorityOperator;
import com.fr.workspace.server.authority.decision.DecisionOperator;
import java.util.ArrayList;
@ -39,14 +40,15 @@ public class NodeAuthProcessor {
authPaths.clear();
if (!WorkContext.getCurrent().isLocal()) {
try {
String username = WorkContext.getCurrent().getConnection().getUserName();
// 远程设计获取全部设计成员的权限列表
DesignAuthority[] authorities = WorkContext.getCurrent().get(AuthorityOperator.class).getAuthorities();
String userName = WorkContext.getCurrent().getConnection().getUserName();
String userId = WorkContext.getCurrent().get(DecisionOperator.class).getUserIdByName(userName);
// 远程设计获取设计成员的权限列表
DesignAuthority[] authorities = WorkContext.getCurrent().get(AuthorityOperator.class).getAuthorities(userId);
DesignAuthority authority = null;
if (authorities != null) {
for (DesignAuthority designAuthority : authorities) {
if (ComparatorUtils.equals(designAuthority.getUsername(), username)) {
if (ComparatorUtils.equals(designAuthority.getUsername(), userName)) {
authority = designAuthority;
}
}

16
designer-base/src/main/java/com/fr/design/remote/action/RemoteDesignAuthManagerAction.java

@ -9,6 +9,7 @@ import com.fr.design.mainframe.DesignerContext;
import com.fr.design.remote.ui.AuthorityManagerPane;
import com.fr.log.FineLoggerFactory;
import com.fr.report.DesignAuthority;
import com.fr.stable.ArrayUtils;
import com.fr.workspace.WorkContext;
import com.fr.workspace.server.authority.AuthorityOperator;
@ -22,6 +23,7 @@ public class RemoteDesignAuthManagerAction extends UpdateAction {
public RemoteDesignAuthManagerAction() {
this.setName(Toolkit.i18nText("Fine-Design_Basic_Remote_Design_Authority_Manager"));
// 远程设计权限管理
this.setSmallIcon(BaseUtils.readIcon("com/fr/design/remote/images/icon_Remote_Design_Auth_Manager_normal@1x.png"));
}
@ -36,9 +38,13 @@ public class RemoteDesignAuthManagerAction extends UpdateAction {
if (!WorkContext.getCurrent().isLocal()) {
try {
// 远程设计获取全部设计成员的权限列表
DesignAuthority[] authorities = WorkContext.getCurrent().get(AuthorityOperator.class).getAuthorities();
if (authorities != null && authorities.length != 0) {
managerPane.populate(authorities);
DesignAuthority[] userAuthorities = WorkContext.getCurrent().get(AuthorityOperator.class).getUserAuthorities();
DesignAuthority[] customAuthorities = WorkContext.getCurrent().get(AuthorityOperator.class).getCustomRoleAuthorities();
if (userAuthorities != null && userAuthorities.length != 0) {
managerPane.populateByUser(userAuthorities);
}
if (customAuthorities != null && customAuthorities.length != 0) {
managerPane.populateByCustom(customAuthorities);
}
} catch (Exception exception) {
FineLoggerFactory.getLogger().error(exception.getMessage(), exception);
@ -49,7 +55,9 @@ public class RemoteDesignAuthManagerAction extends UpdateAction {
@Override
public void doOk() {
DesignAuthority[] authorities = managerPane.update();
DesignAuthority[] userAuthorities = managerPane.updateByUser();
DesignAuthority[] customRoleAuthorities = managerPane.updateByCustom();
DesignAuthority[] authorities = ArrayUtils.addAll(userAuthorities, customRoleAuthorities);
if (!WorkContext.getCurrent().isLocal()) {
boolean success = false;
try {

14
designer-base/src/main/java/com/fr/design/remote/constants/MemberIcon.java

@ -0,0 +1,14 @@
package com.fr.design.remote.constants;
/**
* @author Lucian.Chen
* @version 10.0
* Created by Lucian.Chen on 2019/9/23
*/
public class MemberIcon {
public static final String CUSTOM_ROLE_ICON = "com/fr/design/remote/images/icon_Custom_Role_normal@1x.png";
public static final String USER_ICON = "com/fr/design/remote/images/icon_Member_normal@1x.png";
}

64
designer-base/src/main/java/com/fr/design/remote/ui/AuthorityListControlPane.java → designer-base/src/main/java/com/fr/design/remote/ui/AbstractListControlPane.java

@ -40,10 +40,15 @@ import java.awt.event.ActionEvent;
import java.util.ArrayList;
import java.util.List;
public class AuthorityListControlPane extends BasicPane {
/**
* 左侧面板的基类
* @author Lucian.Chen
* @version 10.0
* Created by Lucian.Chen on 2019/9/19
*/
public abstract class AbstractListControlPane extends BasicPane {
private static final String LIST_NAME = "AuthorityListControlPaneList";
private static final String LIST_NAME = "AbstractListControlPane";
private static final String UNSELECTED_EDITOR_NAME = "UNSELECTED";
private static final String SELECTED_EDITOR_NAME = "SELECTED";
@ -68,7 +73,7 @@ public class AuthorityListControlPane extends BasicPane {
private UIToolbar toolBar;
public AuthorityListControlPane() {
public AbstractListControlPane() {
super();
initComponentPane();
}
@ -76,13 +81,8 @@ public class AuthorityListControlPane extends BasicPane {
private void initComponentPane() {
this.setLayout(FRGUIPaneFactory.createBorderLayout());
this.authorityCreators = new RemoteDesignAuthorityCreator[]{
new RemoteDesignAuthorityCreator(
Toolkit.i18nText("Fine-Design_Basic_Remote_Design_User"),
BaseUtils.readIcon("com/fr/design/remote/images/icon_Member_normal@1x.png"),
DesignAuthority.class,
AuthorityEditorPane.class)
};
this.authorityCreators = getAuthorityCreators();
editorCtrl = new ListEditorControlPane();
// 左侧列表面板
@ -107,6 +107,7 @@ public class AuthorityListControlPane extends BasicPane {
checkButtonEnabled();
}
protected abstract RemoteDesignAuthorityCreator[] getAuthorityCreators();
private void initLeftToolbar(JPanel leftPane) {
shortCuts = createShortcuts();
@ -139,17 +140,19 @@ public class AuthorityListControlPane extends BasicPane {
if (hasInvalid()) {
return;
}
AuthorityListControlPane.this.editorCtrl.update();
AuthorityListControlPane.this.editorCtrl.populate();
AuthorityListControlPane.this.checkButtonEnabled();
AbstractListControlPane.this.editorCtrl.update();
AbstractListControlPane.this.editorCtrl.populate();
AbstractListControlPane.this.checkButtonEnabled();
}
}
});
}
protected abstract AuthorityListCellRenderer getAuthorityListCellRender();
private AuthorityList createList() {
AuthorityList list = new AuthorityList(new DefaultListModel<DesignAuthority>());
list.setCellRenderer(new AuthorityListCellRenderer());
list.setCellRenderer(getAuthorityListCellRender());
return list;
}
@ -168,7 +171,9 @@ public class AuthorityListControlPane extends BasicPane {
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));
DesignAuthority authority = (DesignAuthority) listModel.getElementAt(i);
// authority.setRoleType(RoleType.USER);
res.add(authority);
}
return res.toArray(new DesignAuthority[res.size()]);
}
@ -315,7 +320,7 @@ public class AuthorityListControlPane extends BasicPane {
public void checkEnable() {
this.shortCut.setEnabled(authorityList.getModel()
.getSize() > 0
&& AuthorityListControlPane.this.authorityList.getSelectedIndex() != -1);
&& AbstractListControlPane.this.authorityList.getSelectedIndex() != -1);
}
}
@ -356,13 +361,13 @@ public class AuthorityListControlPane extends BasicPane {
}
private boolean hasInvalid() {
int idx = AuthorityListControlPane.this.getInValidIndex();
int idx = AbstractListControlPane.this.getInValidIndex();
if (authorityList.getSelectedIndex() != idx) {
try {
checkValid();
} catch (Exception exp) {
FineLoggerFactory.getLogger().error(exp.getMessage(), exp);
JOptionPane.showMessageDialog(AuthorityListControlPane.this, exp.getMessage());
JOptionPane.showMessageDialog(AbstractListControlPane.this, exp.getMessage());
authorityList.setSelectedIndex(idx);
return true;
}
@ -442,7 +447,7 @@ public class AuthorityListControlPane extends BasicPane {
}
public void populate() {
authority = AuthorityListControlPane.this.authorityList.getSelectedValue();
authority = AbstractListControlPane.this.authorityList.getSelectedValue();
if (authority == null) {
return;
@ -485,6 +490,10 @@ public class AuthorityListControlPane extends BasicPane {
}
}
protected abstract AbstractManagerPane getManagerPane();
protected abstract String getKey();
/**
* 选择按钮
*/
@ -498,17 +507,17 @@ public class AuthorityListControlPane extends BasicPane {
@Override
public void actionPerformed(ActionEvent e) {
final UserManagerPane userManagerPane = new UserManagerPane();
BasicDialog dialog = userManagerPane.showWindow(SwingUtilities.getWindowAncestor(AuthorityListControlPane.this));
final AbstractManagerPane managerPane = getManagerPane();
BasicDialog dialog = managerPane.showWindow(SwingUtilities.getWindowAncestor(AbstractListControlPane.this));
// 刷新用户管理面板展示信息
final DesignAuthority[] authorities = AuthorityListControlPane.this.update();
final DesignAuthority[] authorities = AbstractListControlPane.this.update();
dialog.addDialogActionListener(new DialogActionAdapter() {
@Override
public void doOk() {
// 获取添加的用户到权限编辑面板
List<RemoteDesignMember> members = userManagerPane.update();
List<RemoteDesignMember> members = managerPane.update();
List<DesignAuthority> oldAuthorities = new ArrayList<>();
@ -529,6 +538,7 @@ public class AuthorityListControlPane extends BasicPane {
authority.setUsername(member.getUsername());
authority.setUserId(member.getUserId());
authority.setRealName(member.getRealName());
authority.setRoleType(member.getRoleType());
addAuthority(authority, getModel().getSize());
}
@ -543,9 +553,11 @@ public class AuthorityListControlPane extends BasicPane {
m.setUserId(authority.getUserId());
m.setRealName(authority.getRealName());
m.setSelected(true);
m.setRoleType(authority.getRoleType());
m.setAuthority(true);
members.add(m);
}
userManagerPane.populate(members);
managerPane.populate(members);
dialog.setModal(true);
dialog.setVisible(true);
@ -567,7 +579,7 @@ public class AuthorityListControlPane extends BasicPane {
public void actionPerformed(ActionEvent evt) {
doBeforeRemove();
if (GUICoreUtils.removeJListSelectedNodes(SwingUtilities
.getWindowAncestor(AuthorityListControlPane.this), authorityList)) {
.getWindowAncestor(AbstractListControlPane.this), authorityList, getKey())) {
checkButtonEnabled();
doAfterRemove();
}

440
designer-base/src/main/java/com/fr/design/remote/ui/AbstractManagerPane.java

@ -0,0 +1,440 @@
package com.fr.design.remote.ui;
import com.fr.base.BaseUtils;
import com.fr.design.constants.LayoutConstants;
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.i18n.Toolkit;
import com.fr.design.layout.TableLayout;
import com.fr.design.layout.TableLayoutHelper;
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.stable.StringUtils;
import com.fr.third.guava.collect.ImmutableList;
import com.fr.workspace.WorkContext;
import com.fr.workspace.server.authority.RemoteDesignMember;
import javax.swing.BorderFactory;
import javax.swing.DefaultListModel;
import javax.swing.JPanel;
import javax.swing.JViewport;
import javax.swing.ListSelectionModel;
import javax.swing.SwingWorker;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import java.awt.BorderLayout;
import java.awt.Color;
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.AdjustmentEvent;
import java.awt.event.AdjustmentListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
/**
* 选择设计角色用户面板的基类
* @author yaohwu
*/
public abstract class AbstractManagerPane extends BasicPane {
/**
* 每页个数
*/
private static final int DEFAULT_NUM_EACH_PAGE = 50;
/**
* 获取的决策平台用户
*/
private final List<RemoteDesignMember> addingMembers = new ArrayList<>();
/**
* 添加到设计的决策平台用户
*/
private List<RemoteDesignMember> addedMembers = new ArrayList<>();
/**
* 决策平台用户列表model
*/
private DefaultListModel<RemoteDesignMember> 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(keyWord);
}
};
/**
* 输入框绑定事件
*/
private KeyAdapter keyFieldKeyListener = new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
// 判断按下的键是否是回车键
// 对话框回车键绑定的是对话框的确定按钮
if (e.getKeyCode() == KeyEvent.VK_ENTER) {
searchAddingMembers(keyWord);
// has been processed
e.consume();
}
}
};
/**
* 添加到设计的决策用户计数标签
*/
private UILabel countLabel = new UILabel();
/**
* 添加到设计的决策用户计数标签
*/
private DefaultListModel<RemoteDesignMember> addedListModel;
/**
* 左侧列表变动事件
*/
private MemberListSelectedChangeListener addingListChangeListener = new MemberListSelectedChangeListener() {
@Override
public void selectedChange() {
sync2AddedMembersFromAdding();
// 刷新右侧列表显示
addToAddedMemberList();
}
};
/**
* 右侧列表变动事件
*/
private MemberListSelectedChangeListener addedListChangeListener = new MemberListSelectedChangeListener() {
@Override
public void selectedChange() {
addingList.revalidate();
addingList.repaint();
resetAddedMembers();
sync2AddedMembersFormAdded();
// 不需要重复更新右侧列表显示 但是更新一下计数显示
countLabel.setText(
Toolkit.i18nText("Fine-Design_Basic_Remote_Design_Selected_Member_Count",
String.valueOf(addedMembers.size())
)
);
// 刷新左侧列表显示
addToMemberList();
}
};
/**
* 已经添加的用户列表
*/
private AddedMemberList addedList;
/**
* 待添加的用户列表
*/
private AddingMemberList addingList;
/**
* 搜索关键字
*/
private String keyWord;
/**
* 搜索关键词变更监听
*/
private transient DocumentListener documentListener = new DocumentListener() {
@Override
public void insertUpdate(DocumentEvent e) {
keyWord = keyField.getText();
}
@Override
public void removeUpdate(DocumentEvent e) {
keyWord = keyField.getText();
}
@Override
public void changedUpdate(DocumentEvent e) {
keyWord = keyField.getText();
}
};
/**
* 当前分页计数
*/
private int pageNum = 1;
public AbstractManagerPane() {
this.setBorder(BorderFactory.createEmptyBorder(0, 4, 0, 4));
this.setLayout(new BorderLayout());
this.add(
TableLayoutHelper.createCommonTableLayoutPane(
new Component[][]{
new Component[]{createLeftPanel(), createRightPanel()}
},
new double[]{TableLayout.FILL},
new double[]{TableLayout.FILL, TableLayout.FILL},
LayoutConstants.VGAP_LARGE
),
BorderLayout.CENTER);
}
public void populate(List<RemoteDesignMember> addedMembers) {
// 已选信息
resetAddedMembers();
this.addedMembers.addAll(addedMembers);
// 刷新右侧面板
addToAddedMemberList();
// 刷新左侧展示信息
addToMemberList();
}
@Override
protected String title4PopupWindow() {
// 选择设计用户
return Toolkit.i18nText("Fine-Design_Basic_Remote_Design_Choose_User");
}
protected abstract JPanel leftPanel();
private JPanel createLeftPanel() {
JPanel content = leftPanel();
// 搜索
JPanel searchPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 5));
searchPanel.setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 5));
keyField.setPreferredSize(new Dimension(270, 20));
keyField.requestFocus();
keyField.addKeyListener(keyFieldKeyListener);
keyField.getDocument().addDocumentListener(documentListener);
keyButton.setIcon(BaseUtils.readIcon("com/fr/design/images/buttonicon/user_search_normal.png"));
keyButton.setToolTipText(Toolkit.i18nText("Fine-Design_Basic_Remote_Design_Search"));
keyButton.addActionListener(keyButtonActionListener);
searchPanel.add(keyField);
searchPanel.add(keyButton);
// 内容列表
addingListModel = new DefaultListModel<>();
addingList = new AddingMemberList(addingListModel);
addingList.setCellRenderer(getAddingMemberListCellRender());
addingList.addSelectedChangeListener(addingListChangeListener);
resetMembers();
addToMemberList();
searchAddingMembers(StringUtils.EMPTY);
final UIScrollPane listPane = new UIScrollPane(addingList);
listPane.addMouseWheelListener(new MouseWheelListener() {
@Override
public void mouseWheelMoved(MouseWheelEvent e) {
JViewport vp = listPane.getViewport();
if (vp.getView().getHeight() <= vp.getHeight() + vp.getViewPosition().y) {
loadMoreAddingMembers(keyWord, DEFAULT_NUM_EACH_PAGE);
}
}
});
listPane.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener() {
@Override
public void adjustmentValueChanged(AdjustmentEvent e) {
JViewport vp = listPane.getViewport();
if (vp.getView().getHeight() <= vp.getHeight() + vp.getViewPosition().y && e.getValueIsAdjusting()) {
loadMoreAddingMembers(keyWord, DEFAULT_NUM_EACH_PAGE);
}
}
});
listPane.setBorder(BorderFactory.createEmptyBorder());
content.add(searchPanel, BorderLayout.NORTH);
content.add(listPane, BorderLayout.CENTER);
return content;
}
protected abstract AddingMemberListCellRender getAddingMemberListCellRender();
protected abstract AddedMemberListCellRender getAddedMemberListCellRender();
protected abstract JPanel rightPanel();
private JPanel createRightPanel() {
JPanel content = rightPanel();
// 计数
countLabel.setText(
// 已选择{}人
Toolkit.i18nText("Fine-Design_Basic_Remote_Design_Selected_Member_Count",
String.valueOf(addedMembers.size()))
);
countLabel.setBorder(BorderFactory.createEmptyBorder(7, 12, 8, 0));
countLabel.setForeground(new Color(0x8F8F92));
addedListModel = new DefaultListModel<>();
addedList = new AddedMemberList(addedListModel);
addedList.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
addedList.setCellRenderer(getAddedMemberListCellRender());
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 (RemoteDesignMember member : addingMembers) {
// 如果包含在右侧列表中,那么左侧列表默认选中
if (addedMembers.contains(member)) {
member.setAuthority(true);
member.setSelected(true);
} else {
member.setAuthority(false);
member.setSelected(false);
}
addingListModel.addElement(member);
}
addingList.revalidate();
addingList.repaint();
}
private void addToAddedMemberList() {
addedListModel.clear();
for (RemoteDesignMember member : addedMembers) {
addedListModel.addElement(member);
}
addedList.revalidate();
addedList.repaint();
countLabel.setText(
Toolkit.i18nText("Fine-Design_Basic_Remote_Design_Selected_Member_Count",
String.valueOf(addedMembers.size())
));
}
private void resetMembers() {
addingMembers.clear();
addingMembers.add(RemoteDesignMember.DEFAULT_MEMBER);
}
private void resetAddedMembers() {
addedMembers.clear();
}
protected abstract Collection<RemoteDesignMember> getMembers(String userName, String keyWord);
protected abstract Collection<RemoteDesignMember> getMembers(String userName, String keyWord, int pageNum, int count);
private void searchAddingMembers(final String keyword) {
final SwingWorker getMemberWorker = new SwingWorker<List<RemoteDesignMember>, Void>() {
@Override
protected List<RemoteDesignMember> doInBackground() {
String username = WorkContext.getCurrent().getConnection().getUserName();
synchronized (addingMembers) {
addingMembers.clear();
Collection<RemoteDesignMember> more = getMembers(username, keyword);
pageNum = 1;
if (!more.isEmpty()) {
addingMembers.addAll(more);
if (more.size() >= DEFAULT_NUM_EACH_PAGE) {
addingMembers.add(RemoteDesignMember.DEFAULT_MEMBER);
}
}
}
return addingMembers;
}
@Override
protected void done() {
addToMemberList();
}
};
getMemberWorker.execute();
}
private void loadMoreAddingMembers(final String keyword, final int count) {
final SwingWorker loadMoreWorker = new SwingWorker<List<RemoteDesignMember>, Void>() {
@Override
protected List<RemoteDesignMember> doInBackground() {
String username = WorkContext.getCurrent().getConnection().getUserName();
synchronized (addingMembers) {
addingMembers.remove(RemoteDesignMember.DEFAULT_MEMBER);
Collection<RemoteDesignMember> more = getMembers(username, keyword, pageNum + 1, count);
if (!more.isEmpty()) {
pageNum += 1;
addingMembers.addAll(more);
addingMembers.add(RemoteDesignMember.DEFAULT_MEMBER);
}
}
return addingMembers;
}
@Override
protected void done() {
addToMemberList();
}
};
loadMoreWorker.execute();
}
private void sync2AddedMembersFromAdding() {
RemoteDesignMember[] members = new RemoteDesignMember[addingListModel.getSize()];
// shallow copy
addingListModel.copyInto(members);
for (RemoteDesignMember member : members) {
if (!member.isSelected()) {
addedMembers.remove(member);
}
if (member.isSelected() && !addedMembers.contains(member)) {
addedMembers.add(member);
}
}
}
private void sync2AddedMembersFormAdded() {
RemoteDesignMember[] members = new RemoteDesignMember[addedListModel.getSize()];
// shallow copy
addedListModel.copyInto(members);
addedMembers.addAll(Arrays.asList(members));
}
public ImmutableList<RemoteDesignMember> update() {
return ImmutableList.copyOf(addedMembers);
}
}

6
designer-base/src/main/java/com/fr/design/remote/ui/AuthorityEditorPane.java

@ -19,12 +19,15 @@ import java.awt.BorderLayout;
import java.util.ArrayList;
import java.util.List;
/**
* 右面板
*/
public class AuthorityEditorPane extends BasicBeanPane<DesignAuthority> {
private FileAuthorityTree tree = new FileAuthorityTree();
// 模板设计权限配置
public AuthorityEditorPane() {
this.setLayout(FRGUIPaneFactory.createBorderLayout());
this.setBorder(
@ -47,6 +50,7 @@ public class AuthorityEditorPane extends BasicBeanPane<DesignAuthority> {
@Override
protected String title4PopupWindow() {
// 编辑文件权限
return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Remote_Design_Configure_Authority");
}

38
designer-base/src/main/java/com/fr/design/remote/ui/AuthorityListCustomRolePane.java

@ -0,0 +1,38 @@
package com.fr.design.remote.ui;
import com.fr.base.BaseUtils;
import com.fr.design.i18n.Toolkit;
import com.fr.design.remote.RemoteDesignAuthorityCreator;
import com.fr.design.remote.ui.list.AuthorityListCellRenderer;
import com.fr.design.remote.ui.list.cell.AuthorityCustomRoleListCellRender;
import com.fr.report.DesignAuthority;
public class AuthorityListCustomRolePane extends AbstractListControlPane {
@Override
protected RemoteDesignAuthorityCreator[] getAuthorityCreators() {
return new RemoteDesignAuthorityCreator[]{
new RemoteDesignAuthorityCreator(
// 远程设计用户
Toolkit.i18nText("Fine-Design_Basic_Remote_Design_Custom"),
BaseUtils.readIcon("com/fr/design/remote/images/icon_Member_normal@1x.png"),
DesignAuthority.class,
AuthorityEditorPane.class)
};
}
@Override
protected AuthorityListCellRenderer getAuthorityListCellRender() {
return new AuthorityCustomRoleListCellRender();
}
@Override
protected AbstractManagerPane getManagerPane() {
return new CustomRoleManagerPane();
}
@Override
protected String getKey() {
return "Fine-Design_Basic_Utils_Are_You_Sure_To_Delete_The_Role_And_Its_Design_Authorities";
}
}

38
designer-base/src/main/java/com/fr/design/remote/ui/AuthorityListUserPane.java

@ -0,0 +1,38 @@
package com.fr.design.remote.ui;
import com.fr.base.BaseUtils;
import com.fr.design.i18n.Toolkit;
import com.fr.design.remote.RemoteDesignAuthorityCreator;
import com.fr.design.remote.ui.list.AuthorityListCellRenderer;
import com.fr.design.remote.ui.list.cell.AuthorityUserListCellRender;
import com.fr.report.DesignAuthority;
public class AuthorityListUserPane extends AbstractListControlPane {
@Override
protected RemoteDesignAuthorityCreator[] getAuthorityCreators() {
return new RemoteDesignAuthorityCreator[]{
new RemoteDesignAuthorityCreator(
// 远程设计用户
Toolkit.i18nText("Fine-Design_Basic_Remote_Design_User"),
BaseUtils.readIcon("com/fr/design/remote/images/icon_Member_normal@1x.png"),
DesignAuthority.class,
AuthorityEditorPane.class)
};
}
@Override
protected AuthorityListCellRenderer getAuthorityListCellRender() {
return new AuthorityUserListCellRender();
}
@Override
protected AbstractManagerPane getManagerPane() {
return new UserManagerPane();
}
@Override
protected String getKey() {
return "Fine-Design_Basic_Utils_Are_You_Sure_To_Delete_The_User_And_Its_Design_Authorities";
}
}

39
designer-base/src/main/java/com/fr/design/remote/ui/AuthorityManagerPane.java

@ -1,36 +1,51 @@
package com.fr.design.remote.ui;
import com.fr.design.dialog.BasicPane;
import com.fr.design.gui.frpane.UITabbedPane;
import com.fr.design.i18n.Toolkit;
import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.report.DesignAuthority;
import javax.swing.BorderFactory;
import java.awt.BorderLayout;
public class AuthorityManagerPane extends BasicPane {
private AuthorityListControlPane list;
private AuthorityListUserPane userList = new AuthorityListUserPane();
private AuthorityListCustomRolePane roleList = new AuthorityListCustomRolePane();
public AuthorityManagerPane() {
this.setLayout(new BorderLayout());
this.setBorder(BorderFactory.createEmptyBorder());
list = new AuthorityListControlPane();
this.add(list, BorderLayout.CENTER);
}
this.setLayout(FRGUIPaneFactory.createBorderLayout());
//Tabbed Pane
UITabbedPane tabbedPane = new UITabbedPane();
this.add(tabbedPane, BorderLayout.CENTER);
tabbedPane.addTab(Toolkit.i18nText("Fine-Design_Basic_User"), userList);
tabbedPane.addTab(Toolkit.i18nText("Fine-Design_Basic_Role"), roleList);
}
@Override
protected String title4PopupWindow() {
// 远程设计权限管理
return Toolkit.i18nText("Fine-Design_Basic_Remote_Design_Authority_Manager");
}
public void populate(DesignAuthority[] authorities) {
list.populate(authorities);
public void populateByUser(DesignAuthority[] authorities) {
userList.populate(authorities);
}
public DesignAuthority[] update() {
return list.update();
public void populateByCustom(DesignAuthority[] authorities) {
roleList.populate(authorities);
}
public DesignAuthority[] updateByUser() {
return userList.update();
}
public DesignAuthority[] updateByCustom() {
return roleList.update();
}
}

83
designer-base/src/main/java/com/fr/design/remote/ui/CustomRoleManagerPane.java

@ -0,0 +1,83 @@
package com.fr.design.remote.ui;
import com.fr.design.border.UITitledBorder;
import com.fr.design.i18n.Toolkit;
import com.fr.design.remote.ui.list.AddedMemberListCellRender;
import com.fr.design.remote.ui.list.AddingMemberListCellRender;
import com.fr.design.remote.ui.list.cell.AddedCustomRoleListCellRender;
import com.fr.design.remote.ui.list.cell.AddingCustomRoleListCellRender;
import com.fr.workspace.WorkContext;
import com.fr.workspace.server.authority.RemoteDesignMember;
import com.fr.workspace.server.authority.decision.DecisionOperator;
import javax.swing.BorderFactory;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import java.awt.BorderLayout;
import java.util.Collection;
/**
* 选择设计角色
*/
public class CustomRoleManagerPane extends AbstractManagerPane {
@Override
protected String title4PopupWindow() {
// 选择设计角色
return Toolkit.i18nText("Fine-Design_Basic_Remote_Design_Choose_Custom");
}
@Override
protected JPanel rightPanel(){
JPanel content = new JPanel(new BorderLayout());
content.setBorder(
BorderFactory.createCompoundBorder(
new EmptyBorder(6, 0, 0, 0),
UITitledBorder.createBorderWithTitle(
// 已选择的设计角色
Toolkit.i18nText("Fine-Design_Basic_Remote_Design_Selected_Custom"),
4
)
)
);
return content;
}
@Override
protected JPanel leftPanel(){
JPanel content = new JPanel(new BorderLayout());
content.setBorder(
BorderFactory.createCompoundBorder(
new EmptyBorder(6, 0, 0, 0),
UITitledBorder.createBorderWithTitle(
// 决策系统角色
Toolkit.i18nText("Fine-Design_Basic_Remote_Design_Decision_Custom"),
4)
)
);
return content;
}
@Override
protected AddingMemberListCellRender getAddingMemberListCellRender() {
return new AddingCustomRoleListCellRender();
}
@Override
protected AddedMemberListCellRender getAddedMemberListCellRender() {
return new AddedCustomRoleListCellRender();
}
@Override
protected Collection<RemoteDesignMember> getMembers(String userName, String keyWord){
return WorkContext.getCurrent().get(DecisionOperator.class).getCustoms(userName, keyWord);
}
@Override
protected Collection<RemoteDesignMember> getMembers(String userName, String keyWord, int pageNum, int count){
return WorkContext.getCurrent().get(DecisionOperator.class).getCustoms(userName, keyWord, pageNum, count);
}
}

417
designer-base/src/main/java/com/fr/design/remote/ui/UserManagerPane.java

@ -1,450 +1,83 @@
package com.fr.design.remote.ui;
import com.fr.base.BaseUtils;
import com.fr.design.border.UITitledBorder;
import com.fr.design.constants.LayoutConstants;
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.i18n.Toolkit;
import com.fr.design.layout.TableLayout;
import com.fr.design.layout.TableLayoutHelper;
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.stable.StringUtils;
import com.fr.third.guava.collect.ImmutableList;
import com.fr.design.remote.ui.list.cell.AddedUserListCellRender;
import com.fr.design.remote.ui.list.cell.AddingUserListCellRender;
import com.fr.workspace.WorkContext;
import com.fr.workspace.server.authority.RemoteDesignMember;
import com.fr.workspace.server.authority.decision.DecisionOperator;
import javax.swing.BorderFactory;
import javax.swing.DefaultListModel;
import javax.swing.JPanel;
import javax.swing.JViewport;
import javax.swing.ListSelectionModel;
import javax.swing.SwingWorker;
import javax.swing.border.EmptyBorder;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import java.awt.BorderLayout;
import java.awt.Color;
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.AdjustmentEvent;
import java.awt.event.AdjustmentListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
/**
* @author yaohwu
* 选择设计用户
*/
public class UserManagerPane extends BasicPane {
/**
* 每页个数
*/
private static final int DEFAULT_NUM_EACH_PAGE = 50;
/**
* 获取的决策平台成员
*/
private final List<RemoteDesignMember> addingMembers = new ArrayList<>();
/**
* 添加到设计的决策平台成员
*/
private List<RemoteDesignMember> addedMembers = new ArrayList<>();
/**
* 决策平台成员列表model
*/
private DefaultListModel<RemoteDesignMember> 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(keyWord);
}
};
/**
* 输入框绑定事件
*/
private KeyAdapter keyFieldKeyListener = new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
// 判断按下的键是否是回车键
// 对话框回车键绑定的是对话框的确定按钮
if (e.getKeyCode() == KeyEvent.VK_ENTER) {
searchAddingMembers(keyWord);
// has been processed
e.consume();
}
}
};
/**
* 添加到设计的决策成员计数标签
*/
private UILabel countLabel = new UILabel();
/**
* 添加到设计的决策成员计数标签
*/
private DefaultListModel<RemoteDesignMember> addedListModel;
/**
* 左侧列表变动事件
*/
private MemberListSelectedChangeListener addingListChangeListener = new MemberListSelectedChangeListener() {
@Override
public void selectedChange() {
// 右侧列表发生变化后,将右侧列表中选中但是在左侧列表中没有的成员添加进来,同时移除取消选中的
sync2AddedMembersFromAdding();
// 刷新右侧列表显示
addToAddedMemberList();
}
};
/**
* 右侧列表变动事件
*/
private MemberListSelectedChangeListener addedListChangeListener = new MemberListSelectedChangeListener() {
@Override
public void selectedChange() {
addingList.revalidate();
addingList.repaint();
resetAddedMembers();
sync2AddedMembersFormAdded();
// 不需要重复更新右侧列表显示 但是更新一下计数显示
countLabel.setText(
Toolkit.i18nText("Fine-Design_Basic_Remote_Design_Selected_Member_Count",
String.valueOf(addedMembers.size())
)
);
// 刷新左侧列表显示
addToMemberList();
}
};
/**
* 已经添加的成员列表
*/
private AddedMemberList addedList;
/**
* 待添加的成员列表
*/
private AddingMemberList addingList;
/**
* 搜索关键字
*/
private String keyWord;
/**
* 搜索关键词变更监听
*/
private transient DocumentListener documentListener = new DocumentListener() {
@Override
public void insertUpdate(DocumentEvent e) {
keyWord = keyField.getText();
}
@Override
public void removeUpdate(DocumentEvent e) {
keyWord = keyField.getText();
}
@Override
public void changedUpdate(DocumentEvent e) {
keyWord = keyField.getText();
}
};
/**
* 当前分页计数
*/
private int pageNum = 1;
public UserManagerPane() {
this.setBorder(BorderFactory.createEmptyBorder(0, 4, 0, 4));
this.setLayout(new BorderLayout());
this.add(
TableLayoutHelper.createCommonTableLayoutPane(
new Component[][]{
new Component[]{createLeftPanel(), createRightPanel()}
},
new double[]{TableLayout.FILL},
new double[]{TableLayout.FILL, TableLayout.FILL},
LayoutConstants.VGAP_LARGE
),
BorderLayout.CENTER);
}
public void populate(List<RemoteDesignMember> addedMembers) {
// 已选信息
resetAddedMembers();
this.addedMembers.addAll(addedMembers);
// 刷新右侧面板
addToAddedMemberList();
// 刷新左侧展示信息
addToMemberList();
}
public class UserManagerPane extends AbstractManagerPane {
@Override
protected String title4PopupWindow() {
return Toolkit.i18nText("Fine-Design_Basic_Remote_Design_Choose_Member");
// 选择设计用户
return Toolkit.i18nText("Fine-Design_Basic_Remote_Design_Choose_User");
}
private JPanel createLeftPanel() {
@Override
protected JPanel rightPanel(){
JPanel content = new JPanel(new BorderLayout());
content.setBorder(
BorderFactory.createCompoundBorder(
new EmptyBorder(6, 0, 0, 0),
UITitledBorder.createBorderWithTitle(
Toolkit.i18nText("Fine-Design_Basic_Remote_Design_Decision_Member"),
4)
// 已选择的设计用户
Toolkit.i18nText("Fine-Design_Basic_Remote_Design_Selected_User"),
4
)
)
);
// 搜索
JPanel searchPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 5));
searchPanel.setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 5));
keyField.setPreferredSize(new Dimension(270, 20));
keyField.requestFocus();
keyField.addKeyListener(keyFieldKeyListener);
keyField.getDocument().addDocumentListener(documentListener);
keyButton.setIcon(BaseUtils.readIcon("com/fr/design/images/buttonicon/user_search_normal.png"));
keyButton.setToolTipText(Toolkit.i18nText("Fine-Design_Basic_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);
final UIScrollPane listPane = new UIScrollPane(addingList);
listPane.addMouseWheelListener(new MouseWheelListener() {
@Override
public void mouseWheelMoved(MouseWheelEvent e) {
JViewport vp = listPane.getViewport();
if (vp.getView().getHeight() <= vp.getHeight() + vp.getViewPosition().y) {
loadMoreAddingMembers(keyWord, DEFAULT_NUM_EACH_PAGE);
}
}
});
listPane.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener() {
@Override
public void adjustmentValueChanged(AdjustmentEvent e) {
JViewport vp = listPane.getViewport();
if (vp.getView().getHeight() <= vp.getHeight() + vp.getViewPosition().y && e.getValueIsAdjusting()) {
loadMoreAddingMembers(keyWord, DEFAULT_NUM_EACH_PAGE);
}
}
});
listPane.setBorder(BorderFactory.createEmptyBorder());
content.add(searchPanel, BorderLayout.NORTH);
content.add(listPane, BorderLayout.CENTER);
return content;
}
private JPanel createRightPanel() {
@Override
protected JPanel leftPanel(){
JPanel content = new JPanel(new BorderLayout());
content.setBorder(
BorderFactory.createCompoundBorder(
new EmptyBorder(6, 0, 0, 0),
UITitledBorder.createBorderWithTitle(
Toolkit.i18nText("Fine-Design_Basic_Remote_Design_Selected_Member"),
4
)
// 决策系统用户
Toolkit.i18nText("Fine-Design_Basic_Remote_Design_Decision_User"),
4)
)
);
// 计数
countLabel.setText(
Toolkit.i18nText("Fine-Design_Basic_Remote_Design_Selected_Member_Count",
String.valueOf(addedMembers.size()))
);
countLabel.setBorder(BorderFactory.createEmptyBorder(7, 12, 8, 0));
countLabel.setForeground(new Color(0x8F8F92));
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 (RemoteDesignMember member : addingMembers) {
// 如果包含在右侧列表中,那么左侧列表默认选中
if (addedMembers.contains(member)) {
member.setSelected(true);
} else {
member.setSelected(false);
}
addingListModel.addElement(member);
}
addingList.revalidate();
addingList.repaint();
}
private void addToAddedMemberList() {
addedListModel.clear();
for (RemoteDesignMember member : addedMembers) {
addedListModel.addElement(member);
}
addedList.revalidate();
addedList.repaint();
countLabel.setText(
Toolkit.i18nText("Fine-Design_Basic_Remote_Design_Selected_Member_Count",
String.valueOf(addedMembers.size())
));
}
private void resetMembers() {
addingMembers.clear();
addingMembers.add(RemoteDesignMember.DEFAULT_MEMBER);
}
private void resetAddedMembers() {
addedMembers.clear();
}
private void searchAddingMembers(final String keyword) {
final SwingWorker getMemberWorker = new SwingWorker<List<RemoteDesignMember>, Void>() {
@Override
protected List<RemoteDesignMember> doInBackground() {
String username = WorkContext.getCurrent().getConnection().getUserName();
synchronized (addingMembers) {
addingMembers.clear();
Collection<RemoteDesignMember> more = WorkContext.getCurrent().get(DecisionOperator.class).getMembers(username, keyword);
pageNum = 1;
if (!more.isEmpty()) {
addingMembers.addAll(more);
if (more.size() >= DEFAULT_NUM_EACH_PAGE) {
addingMembers.add(RemoteDesignMember.DEFAULT_MEMBER);
}
}
}
return addingMembers;
protected AddingMemberListCellRender getAddingMemberListCellRender() {
return new AddingUserListCellRender();
}
@Override
protected void done() {
addToMemberList();
}
};
getMemberWorker.execute();
protected AddedMemberListCellRender getAddedMemberListCellRender() {
return new AddedUserListCellRender();
}
private void loadMoreAddingMembers(final String keyword, final int count) {
final SwingWorker loadMoreWorker = new SwingWorker<List<RemoteDesignMember>, Void>() {
@Override
protected List<RemoteDesignMember> doInBackground() {
String username = WorkContext.getCurrent().getConnection().getUserName();
synchronized (addingMembers) {
addingMembers.remove(RemoteDesignMember.DEFAULT_MEMBER);
Collection<RemoteDesignMember> more =
WorkContext.getCurrent().get(DecisionOperator.class).getMembers(username, keyword, pageNum + 1, count);
if (!more.isEmpty()) {
pageNum += 1;
addingMembers.addAll(more);
addingMembers.add(RemoteDesignMember.DEFAULT_MEMBER);
}
}
return addingMembers;
protected Collection<RemoteDesignMember> getMembers(String userName, String keyWord){
return WorkContext.getCurrent().get(DecisionOperator.class).getMembers(userName, keyWord);
}
@Override
protected void done() {
addToMemberList();
}
};
loadMoreWorker.execute();
}
private void sync2AddedMembersFromAdding() {
RemoteDesignMember[] members = new RemoteDesignMember[addingListModel.getSize()];
// shallow copy
addingListModel.copyInto(members);
for (RemoteDesignMember member : members) {
if (!member.isSelected()) {
addedMembers.remove(member);
}
if (member.isSelected() && !addedMembers.contains(member)) {
addedMembers.add(member);
}
}
}
private void sync2AddedMembersFormAdded() {
RemoteDesignMember[] members = new RemoteDesignMember[addedListModel.getSize()];
// shallow copy
addedListModel.copyInto(members);
addedMembers.addAll(Arrays.asList(members));
}
public ImmutableList<RemoteDesignMember> update() {
return ImmutableList.copyOf(addedMembers);
protected Collection<RemoteDesignMember> getMembers(String userName, String keyWord, int pageNum, int count){
return WorkContext.getCurrent().get(DecisionOperator.class).getMembers(userName, keyWord, pageNum, count);
}
}

17
designer-base/src/main/java/com/fr/design/remote/ui/list/AddedMemberList.java

@ -1,8 +1,12 @@
package com.fr.design.remote.ui.list;
import com.fr.design.i18n.Toolkit;
import com.fr.design.mainframe.DesignerContext;
import com.fr.report.constant.RoleType;
import com.fr.workspace.server.authority.RemoteDesignMember;
import javax.swing.DefaultListModel;
import javax.swing.JOptionPane;
import java.util.Vector;
public class AddedMemberList extends MemberList {
@ -27,9 +31,22 @@ public class AddedMemberList extends MemberList {
protected void displaySelected() {
RemoteDesignMember member = getSelectedValue();
if (member != null) {
String keyTitle = member.getRoleType() == RoleType.CUSTOM ?
"Fine-Design_Basic_Utils_Are_You_Sure_To_Delete_The_Role_And_Its_Design_Authorities" :
"Fine-Design_Basic_Utils_Are_You_Sure_To_Delete_The_User_And_Its_Design_Authorities";
if (member.isSelected() && member.hasAuthority()){
int val = JOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(), Toolkit.i18nText(keyTitle),
Toolkit.i18nText("Fine-Design_Basic_Remove"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE);
if (val == JOptionPane.OK_OPTION) {
member.setSelected(!member.isSelected());
((DefaultListModel<RemoteDesignMember>) getModel()).removeElement(member);
}
}
else {
member.setSelected(!member.isSelected());
((DefaultListModel<RemoteDesignMember>) getModel()).removeElement(member);
}
}
revalidate();
repaint();
fireSelectedChange();

12
designer-base/src/main/java/com/fr/design/remote/ui/list/AddedMemberListCellRender.java

@ -1,11 +1,11 @@
package com.fr.design.remote.ui.list;
import com.fr.base.BaseUtils;
import com.fr.design.gui.ilable.UILabel;
import com.fr.design.remote.button.IconButton;
import com.fr.workspace.server.authority.RemoteDesignMember;
import javax.swing.BorderFactory;
import javax.swing.Icon;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.ListCellRenderer;
@ -13,7 +13,7 @@ import java.awt.Component;
import java.awt.Dimension;
import java.awt.FlowLayout;
public class AddedMemberListCellRender extends JPanel implements ListCellRenderer<RemoteDesignMember> {
public abstract class AddedMemberListCellRender extends JPanel implements ListCellRenderer<RemoteDesignMember> {
private UILabel label;
@ -25,7 +25,7 @@ public class AddedMemberListCellRender extends JPanel implements ListCellRendere
label = new UILabel();
label.setPreferredSize(new Dimension(264, 20));
this.setPreferredSize(new Dimension(this.getPreferredSize().width, 25));
label.setIcon(BaseUtils.readIcon("com/fr/design/remote/images/icon_Member_normal@1x.png"));
label.setIcon(getMemberIcon());
this.add(label);
this.add(new IconButton());
@ -33,7 +33,7 @@ public class AddedMemberListCellRender extends JPanel implements ListCellRendere
@Override
public Component getListCellRendererComponent(JList<? extends RemoteDesignMember> list, RemoteDesignMember member, int index, boolean isSelected, boolean cellHasFocus) {
this.setLabelText(member.getRealName() + "(" + member.getUsername() + ")");
this.setLabelText(getMemberName(member));
return this;
}
@ -41,4 +41,8 @@ public class AddedMemberListCellRender extends JPanel implements ListCellRendere
label.setText(name);
}
protected abstract Icon getMemberIcon();
protected abstract String getMemberName(RemoteDesignMember member);
}

19
designer-base/src/main/java/com/fr/design/remote/ui/list/AddingMemberList.java

@ -1,13 +1,16 @@
package com.fr.design.remote.ui.list;
import com.fr.design.i18n.Toolkit;
import com.fr.design.mainframe.DesignerContext;
import com.fr.report.constant.RoleType;
import com.fr.workspace.server.authority.RemoteDesignMember;
import javax.swing.DefaultListModel;
import javax.swing.JOptionPane;
import java.util.Vector;
public class AddingMemberList extends MemberList {
public AddingMemberList() {
super();
}
@ -29,7 +32,21 @@ public class AddingMemberList extends MemberList {
@Override
protected void displaySelected() {
RemoteDesignMember member = getSelectedValue();
if (member != null) {
String keyTitle = member.getRoleType() == RoleType.CUSTOM ?
"Fine-Design_Basic_Utils_Are_You_Sure_To_Delete_The_Role_And_Its_Design_Authorities" :
"Fine-Design_Basic_Utils_Are_You_Sure_To_Delete_The_User_And_Its_Design_Authorities";
if (member.isSelected() && member.hasAuthority()){
int val = JOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(), Toolkit.i18nText(keyTitle),
Toolkit.i18nText("Fine-Design_Basic_Remove"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE);
if (val == JOptionPane.OK_OPTION) {
member.setSelected(!member.isSelected());
}
}
else {
member.setSelected(!member.isSelected());
}
}
revalidate();
repaint();
fireSelectedChange();

14
designer-base/src/main/java/com/fr/design/remote/ui/list/AddingMemberListCellRender.java

@ -1,11 +1,11 @@
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.workspace.server.authority.RemoteDesignMember;
import javax.swing.BorderFactory;
import javax.swing.Icon;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.ListCellRenderer;
@ -14,7 +14,7 @@ import java.awt.Component;
import java.awt.Dimension;
import java.awt.FlowLayout;
public class AddingMemberListCellRender extends JPanel implements ListCellRenderer<RemoteDesignMember> {
public abstract class AddingMemberListCellRender extends JPanel implements ListCellRenderer<RemoteDesignMember> {
private UILabel label;
private UICheckBox check;
@ -27,7 +27,7 @@ public class AddingMemberListCellRender extends JPanel implements ListCellRender
label = new UILabel();
label.setPreferredSize(new Dimension(260, 20));
this.setPreferredSize(new Dimension(this.getPreferredSize().width, 25));
label.setIcon(BaseUtils.readIcon("com/fr/design/remote/images/icon_Member_normal@1x.png"));
label.setIcon(getMemberIcon());
check = new UICheckBox();
check.setSelected(false);
@ -46,7 +46,7 @@ public class AddingMemberListCellRender extends JPanel implements ListCellRender
check.setVisible(false);
fixLoadingDisplay();
} else {
this.setLabelText(member.getRealName() + "(" + member.getUsername() + ")");
this.setLabelText(getMemberName(member));
check.setVisible(true);
check.setSelected(member.isSelected());
recoveryCommonDisplay();
@ -64,7 +64,11 @@ public class AddingMemberListCellRender extends JPanel implements ListCellRender
}
private void recoveryCommonDisplay() {
label.setIcon(BaseUtils.readIcon("com/fr/design/remote/images/icon_Member_normal@1x.png"));
label.setIcon(getMemberIcon());
label.setHorizontalAlignment(SwingConstants.LEFT);
}
protected abstract Icon getMemberIcon();
protected abstract String getMemberName(RemoteDesignMember member);
}

12
designer-base/src/main/java/com/fr/design/remote/ui/list/AuthorityListCellRenderer.java

@ -1,9 +1,9 @@
package com.fr.design.remote.ui.list;
import com.fr.base.BaseUtils;
import com.fr.report.DesignAuthority;
import sun.swing.DefaultLookup;
import javax.swing.Icon;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.ListCellRenderer;
@ -12,7 +12,7 @@ import javax.swing.border.EmptyBorder;
import java.awt.Color;
import java.awt.Component;
public class AuthorityListCellRenderer extends
public abstract class AuthorityListCellRenderer extends
JLabel implements ListCellRenderer<DesignAuthority> {
/**
@ -81,8 +81,8 @@ public class AuthorityListCellRenderer extends
}
setBorder(border);
this.setIcon(BaseUtils.readIcon("com/fr/design/remote/images/icon_Member_normal@1x.png"));
this.setText(authority.getRealName() + "(" + authority.getUsername() + ")");
this.setIcon(getMemberIcon());
this.setText(getMemberName(authority));
return this;
}
@ -126,4 +126,8 @@ public class AuthorityListCellRenderer extends
p.isOpaque();
return !colorMatch && super.isOpaque();
}
protected abstract Icon getMemberIcon();
protected abstract String getMemberName(DesignAuthority authority);
}

25
designer-base/src/main/java/com/fr/design/remote/ui/list/cell/AddedCustomRoleListCellRender.java

@ -0,0 +1,25 @@
package com.fr.design.remote.ui.list.cell;
import com.fr.base.BaseUtils;
import com.fr.design.remote.constants.MemberIcon;
import com.fr.design.remote.ui.list.AddedMemberListCellRender;
import com.fr.workspace.server.authority.RemoteDesignMember;
import javax.swing.Icon;
/**
* @author Lucian.Chen
* @version 10.0
* Created by Lucian.Chen on 2019/9/19
*/
public class AddedCustomRoleListCellRender extends AddedMemberListCellRender {
@Override
protected Icon getMemberIcon() {
return BaseUtils.readIcon(MemberIcon.CUSTOM_ROLE_ICON);
}
@Override
protected String getMemberName(RemoteDesignMember member) {
return member.getUsername();
}
}

25
designer-base/src/main/java/com/fr/design/remote/ui/list/cell/AddedUserListCellRender.java

@ -0,0 +1,25 @@
package com.fr.design.remote.ui.list.cell;
import com.fr.base.BaseUtils;
import com.fr.design.remote.constants.MemberIcon;
import com.fr.design.remote.ui.list.AddedMemberListCellRender;
import com.fr.workspace.server.authority.RemoteDesignMember;
import javax.swing.Icon;
/**
* @author Lucian.Chen
* @version 10.0
* Created by Lucian.Chen on 2019/9/19
*/
public class AddedUserListCellRender extends AddedMemberListCellRender {
@Override
protected Icon getMemberIcon() {
return BaseUtils.readIcon(MemberIcon.USER_ICON);
}
@Override
protected String getMemberName(RemoteDesignMember member) {
return member.getRealName() + "(" + member.getUsername() + ")";
}
}

25
designer-base/src/main/java/com/fr/design/remote/ui/list/cell/AddingCustomRoleListCellRender.java

@ -0,0 +1,25 @@
package com.fr.design.remote.ui.list.cell;
import com.fr.base.BaseUtils;
import com.fr.design.remote.constants.MemberIcon;
import com.fr.design.remote.ui.list.AddingMemberListCellRender;
import com.fr.workspace.server.authority.RemoteDesignMember;
import javax.swing.Icon;
/**
* @author Lucian.Chen
* @version 10.0
* Created by Lucian.Chen on 2019/9/19
*/
public class AddingCustomRoleListCellRender extends AddingMemberListCellRender {
@Override
protected Icon getMemberIcon() {
return BaseUtils.readIcon(MemberIcon.CUSTOM_ROLE_ICON);
}
@Override
protected String getMemberName(RemoteDesignMember member) {
return member.getUsername();
}
}

25
designer-base/src/main/java/com/fr/design/remote/ui/list/cell/AddingUserListCellRender.java

@ -0,0 +1,25 @@
package com.fr.design.remote.ui.list.cell;
import com.fr.base.BaseUtils;
import com.fr.design.remote.constants.MemberIcon;
import com.fr.design.remote.ui.list.AddingMemberListCellRender;
import com.fr.workspace.server.authority.RemoteDesignMember;
import javax.swing.Icon;
/**
* @author Lucian.Chen
* @version 10.0
* Created by Lucian.Chen on 2019/9/19
*/
public class AddingUserListCellRender extends AddingMemberListCellRender {
@Override
protected Icon getMemberIcon() {
return BaseUtils.readIcon(MemberIcon.USER_ICON);
}
@Override
protected String getMemberName(RemoteDesignMember member) {
return member.getRealName() + "(" + member.getUsername() + ")";
}
}

25
designer-base/src/main/java/com/fr/design/remote/ui/list/cell/AuthorityCustomRoleListCellRender.java

@ -0,0 +1,25 @@
package com.fr.design.remote.ui.list.cell;
import com.fr.base.BaseUtils;
import com.fr.design.remote.constants.MemberIcon;
import com.fr.design.remote.ui.list.AuthorityListCellRenderer;
import com.fr.report.DesignAuthority;
import javax.swing.Icon;
/**
* @author Lucian.Chen
* @version 10.0
* Created by Lucian.Chen on 2019/9/19
*/
public class AuthorityCustomRoleListCellRender extends AuthorityListCellRenderer {
@Override
protected Icon getMemberIcon() {
return BaseUtils.readIcon(MemberIcon.CUSTOM_ROLE_ICON);
}
@Override
protected String getMemberName(DesignAuthority authority) {
return authority.getUsername();
}
}

25
designer-base/src/main/java/com/fr/design/remote/ui/list/cell/AuthorityUserListCellRender.java

@ -0,0 +1,25 @@
package com.fr.design.remote.ui.list.cell;
import com.fr.base.BaseUtils;
import com.fr.design.remote.constants.MemberIcon;
import com.fr.design.remote.ui.list.AuthorityListCellRenderer;
import com.fr.report.DesignAuthority;
import javax.swing.Icon;
/**
* @author Lucian.Chen
* @version 10.0
* Created by Lucian.Chen on 2019/9/19
*/
public class AuthorityUserListCellRender extends AuthorityListCellRenderer {
@Override
protected Icon getMemberIcon() {
return BaseUtils.readIcon(MemberIcon.USER_ICON);
}
@Override
protected String getMemberName(DesignAuthority authority) {
return authority.getRealName() + "(" + authority.getUsername() + ")";
}
}

118
designer-base/src/main/java/com/fr/design/update/actions/FileDownloader.java

@ -1,118 +0,0 @@
package com.fr.design.update.actions;
import com.fr.design.update.domain.UpdateConstants;
import com.fr.locale.InterProviderFactory;
import com.fr.log.FineLoggerFactory;
import com.fr.design.update.domain.DownloadItem;
import com.fr.stable.ArrayUtils;
import com.fr.stable.StableUtils;
import javax.swing.JOptionPane;
import javax.swing.SwingWorker;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.util.concurrent.ExecutionException;
/**
* Created by XINZAI on 2018/8/21.
*/
public abstract class FileDownloader extends SwingWorker<Boolean, DownloadItem> {
private static final int REPEAT_DOWNLOAD_TIMES = 3;
private DownloadItem[] files;
private String saveDir;
//已经完成的大小
private long completeSize;
public FileDownloader(DownloadItem[] files, String saveDir) {
this.files = files;
this.saveDir = saveDir;
}
@Override
protected Boolean doInBackground() throws Exception {
if (ArrayUtils.isNotEmpty(files)) {
setCompleteSize(0L);
for (DownloadItem item : files) {
for (int i = 0; i < REPEAT_DOWNLOAD_TIMES; i++) {
item.setTotalLength(0);
item.setDownloadLength(0);
download(item);
if (item.getTotalLength() == item.getDownloadLength()) {
break;
}
}
if (item.getTotalLength() != item.getDownloadLength()) {
JOptionPane.showMessageDialog(null,
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Updater_Download_Failed"),
InterProviderFactory.getProvider().getLocText("Fine-Design_Updater_Alert"), JOptionPane.ERROR_MESSAGE);
return false;
} else {
item.setDownloadLength(0);
completeSize += item.getTotalLength();
}
}
}
return true;
}
@Override
protected void done() {
boolean success = false;
try {
success = get();
} catch (InterruptedException e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
Thread.currentThread().interrupt();
} catch (ExecutionException e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
}
if (success) {
onDownloadSuccess();
} else {
onDownloadFailed();
}
}
private void download(DownloadItem item) throws Exception {
URL url = new URL(item.getUrl());
URLConnection connection = url.openConnection();
int total = connection.getContentLength();
item.setTotalLength(total);
File tempFile = new File(StableUtils.pathJoin(saveDir, item.getName()));
StableUtils.makesureFileExist(tempFile);
try ( InputStream reader = connection.getInputStream();
FileOutputStream writer = new FileOutputStream(tempFile)) {
byte[] buffer = new byte[UpdateConstants.BYTE];
int bytesRead = 0;
int totalBytesRead = 0;
while ((bytesRead = reader.read(buffer)) != -1) {
writer.write(buffer, 0, bytesRead);
buffer = new byte[UpdateConstants.BYTE];
totalBytesRead += bytesRead;
item.setDownloadLength(totalBytesRead);
publish(item);
}
}
}
/**
* 下载成功
*/
public abstract void onDownloadSuccess();
/**
* 下载失败
*/
public abstract void onDownloadFailed();
public long getCompleteSize() {
return completeSize;
}
public void setCompleteSize(long completeSize) {
this.completeSize = completeSize;
}
}

55
designer-base/src/main/java/com/fr/design/update/actions/FileProcess.java

@ -0,0 +1,55 @@
package com.fr.design.update.actions;
import com.fr.decision.update.info.UpdateCallBack;
import com.fr.decision.update.UpdateExecutor;
import com.fr.log.FineLoggerFactory;
import javax.swing.*;
import java.util.concurrent.ExecutionException;
/**
* @author Bryant
* @version 10.0
* Created by Bryant on 2019-09-12
*/
public abstract class FileProcess extends SwingWorker<Boolean, Void> {
private UpdateCallBack callBack;
public FileProcess(UpdateCallBack callBack) {
this.callBack = callBack;
}
@Override
protected Boolean doInBackground() throws Exception {
return UpdateExecutor.getInstance().execute(callBack);
}
@Override
protected void done() {
boolean success = false;
try {
success = get();
} catch (InterruptedException e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
Thread.currentThread().interrupt();
} catch (ExecutionException e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
}
if (success) {
onDownloadSuccess();
} else {
onDownloadFailed();
}
}
/**
* 下载成功
*/
public abstract void onDownloadSuccess();
/**
* 下载失败
*/
public abstract void onDownloadFailed();
}

102
designer-base/src/main/java/com/fr/design/update/domain/DownloadItem.java

@ -1,102 +0,0 @@
package com.fr.design.update.domain;
import com.fr.general.ComparatorUtils;
import com.fr.json.JSONObject;
import java.util.Date;
/**
* Created by XINZAI on 2018/8/21.
*/
public class DownloadItem {
//显示为百分比
private static final int PERCENTAGE_RATIO = 100;
//显示kB
private static final int BYTETOKB_RATIO = 1000;
private String name;
private String url;
private long size;
private int totalLength;
private int downloadLength;
public DownloadItem(JSONObject json) {
this(json.optString("name"), json.optString("url"), json.optLong("size"));
}
public DownloadItem(String name, String url, long size) {
this.name = name;
this.url = url;
this.size = size;
}
public String getName() {
return name;
}
public String getUrl() {
return url + "?v=" + new Date().getTime();
}
public long getSize() {
return size;
}
public void setSize(long size) {
this.size = size;
}
public int getTotalLength() {
return totalLength;
}
public int getDownloadLength() {
return downloadLength;
}
public void setTotalLength(int totalLength) {
this.totalLength = totalLength;
}
public void setDownloadLength(int downloadLength) {
this.downloadLength = downloadLength;
}
public int getProgressValue() {
return (int) ((downloadLength / (double) totalLength) * PERCENTAGE_RATIO);
}
public String getProgressString() {
return downloadLength / BYTETOKB_RATIO + "KB/" + totalLength / BYTETOKB_RATIO + "KB";
}
/**
* 转化为字符串
*
* @return 字符串
*/
@Override
public String toString() {
return "name:" + name + ";download:" + getProgressString();
}
@Override
public boolean equals(Object obj) {
return obj instanceof DownloadItem
&& ComparatorUtils.equals(((DownloadItem) obj).name, name)
&& ComparatorUtils.equals(((DownloadItem) obj).url, url);
}
/**
* 返回一个hash码
*
* @return hash码
*/
@Override
public int hashCode() {
return name.hashCode();
}
}

195
designer-base/src/main/java/com/fr/design/update/ui/dialog/UpdateMainDialog.java

@ -1,5 +1,7 @@
package com.fr.design.update.ui.dialog;
import com.fr.decision.update.info.UpdateCallBack;
import com.fr.decision.update.info.UpdateProgressCallBack;
import com.fr.design.RestartHelper;
import com.fr.design.constants.LayoutConstants;
import com.fr.design.dialog.UIDialog;
@ -10,8 +12,7 @@ import com.fr.design.gui.itextfield.UITextField;
import com.fr.design.layout.TableLayout;
import com.fr.design.layout.TableLayoutHelper;
import com.fr.design.mainframe.DesignerContext;
import com.fr.design.update.actions.FileDownloader;
import com.fr.design.update.domain.DownloadItem;
import com.fr.design.update.actions.FileProcess;
import com.fr.design.update.domain.UpdateConstants;
import com.fr.design.update.domain.UpdateInfoCachePropertyManager;
import com.fr.design.update.factory.DirectoryOperationFactory;
@ -27,7 +28,6 @@ import com.fr.general.ComparatorUtils;
import com.fr.general.DateUtils;
import com.fr.general.GeneralContext;
import com.fr.general.GeneralUtils;
import com.fr.general.IOUtils;
import com.fr.general.SiteCenter;
import com.fr.general.http.HttpClient;
import com.fr.general.http.HttpToolbox;
@ -39,18 +39,10 @@ import com.fr.stable.EncodeConstants;
import com.fr.stable.ProductConstants;
import com.fr.stable.StableUtils;
import com.fr.stable.StringUtils;
import com.fr.stable.project.ProjectConstants;
import com.fr.third.org.apache.commons.codec.digest.DigestUtils;
import com.fr.workspace.WorkContext;
import com.sun.java.swing.plaf.motif.MotifProgressBarUI;
import javax.swing.BorderFactory;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.RowSorter;
import javax.swing.SortOrder;
import javax.swing.SwingConstants;
import javax.swing.SwingWorker;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.table.TableRowSorter;
@ -67,19 +59,14 @@ import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ExecutionException;
/**
@ -107,7 +94,6 @@ public class UpdateMainDialog extends UIDialog {
private static final SimpleDateFormat CHANGELOG_FORMAT = new SimpleDateFormat("M/d/y, h:m:s a", Locale.ENGLISH);
private static final SimpleDateFormat UPDATE_INFO_TABLE_FORMAT = new SimpleDateFormat("yyyy.MM.dd");
private Set<DownloadItem> downloadItems = new HashSet<DownloadItem>();
private JSONObject downloadFileConfig;
//最新版本标签
private LoadingLabel loadingLabel;
@ -166,14 +152,12 @@ public class UpdateMainDialog extends UIDialog {
public void setAutoUpdateAfterInit() {
autoUpdateAfterInit = true;
}
private void initUpdateActionPane() {
double[] rowUpdateSubContentPaneSize = {UPDATE_CONTENT_PANE_ROW_SIZE, TableLayout.PREFERRED, UPDATE_CONTENT_PANE_ROW_SIZE};
double[] rowUpdateContentPaneSize = {TableLayout.PREFERRED};
double[] columnUpdateSubContentPaneProgressSize = {TableLayout.FILL, TableLayout.PREFERRED};
double[] columnUpdateSubContentPaneSize = {UPDATE_CONTENT_PANE_COLUMN_SIZE, TableLayout.FILL, TableLayout.PREFERRED};
JPanel progressBarPane = new JPanel(new BorderLayout());
progressBar = new JProgressBar();
progressBar.setUI(new MotifProgressBarUI());
progressBar.setForeground(UpdateConstants.BAR_COLOR);
@ -601,62 +585,6 @@ public class UpdateMainDialog extends UIDialog {
}
break;
}
initMapWithInfo(downloadFileConfig);
}
public void initMapWithInfo(JSONObject result) {
addJarNameToMap(result, "designer");
addJarNameToMap(result, "server");
}
private void addJarNameToMap(JSONObject result, String category) {
JSONArray jsonArray = result.optJSONArray(category);
if (jsonArray != null) {
for (int i = 0, len = jsonArray.length(); i < len; i++) {
JSONObject jo = jsonArray.optJSONObject(i);
String downloadName = jo.optString("name");
String downloadUrl = jo.optString("url");
long downloadSize = jo.optLong("size");
if (ComparatorUtils.equals(category, "server")) {
File currentJAR = new File(StableUtils.pathJoin(WorkContext.getCurrent().getPath(), ProjectConstants.LIB_NAME, downloadName));
String currentMD5 = getCurrentJarMD5(currentJAR);
String downloadMD5 = jo.optString("md5");
boolean exist = currentJAR.exists() && ComparatorUtils.equals(currentJAR.length(), downloadSize) && ComparatorUtils.equals(currentMD5, downloadMD5);
if (exist) {
// 如果jar包存在且MD5值和大小与oss上的一致 不下载
continue;
}
}
downloadItems.add(new DownloadItem(downloadName, downloadUrl, downloadSize));
}
}
}
/**
* 获取当前jar的md5
*
* @param currentJAR
* @return
*/
private String getCurrentJarMD5(File currentJAR) {
String md5 = StringUtils.EMPTY;
FileInputStream input = null;
try {
input = new FileInputStream(currentJAR);
md5 = DigestUtils.md5Hex(input);
} catch (Exception ignore) {
} finally {
if (input != null) {
try {
input.close();
} catch (IOException e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
}
}
}
return md5;
}
/**
@ -669,31 +597,19 @@ public class UpdateMainDialog extends UIDialog {
if (updateSuccessful) {
RestartHelper.restart();
} else {
progressBar.setVisible(true);
UpdateCallBack callBack = new UpdateProgressCallBack(progressBar);
deletePreviousPropertyFile();
updateButton.setEnabled(false);
progressBar.setVisible(true);
updateLabel.setVisible(false);
new FileDownloader(
downloadItems.toArray(new DownloadItem[downloadItems.size()]),
StableUtils.pathJoin(StableUtils.getInstallHome(), UpdateConstants.DOWNLOAD_DIR)) {
@Override
protected void process(java.util.List<DownloadItem> chunks) {
DownloadItem fileInfo = chunks.get(chunks.size() - 1);
progressBar.setString(fileInfo.getName() + " " + fileInfo.getProgressString());
progressBar.setValue(fileInfo.getProgressValue());
}
new FileProcess(callBack) {
@Override
public void onDownloadSuccess() {
updateButton.setEnabled(true);
progressBar.setVisible(false);
backup();
putNewFiles();
updateSuccessful = true;
updateButton.setText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Updater_Restart_Designer"));
}
@Override
public void onDownloadFailed() {
progressBar.setVisible(false);
@ -719,109 +635,12 @@ public class UpdateMainDialog extends UIDialog {
}
}
/**
* JAR包更新的时候备份老的jar包包括设计器相关的和服务器相关的几个
*/
private void backup() {
String installHome = StableUtils.getInstallHome();
//jar包备份文件的目录为"backup/"+jar包当前版本号
String todayBackupDir = StableUtils.pathJoin(installHome, getBackupDirectory(), (GeneralUtils.readBuildNO()));
backupFilesFromInstallEnv(installHome, todayBackupDir, getJARList4Server());
backupFilesFromInstallLib(installHome, todayBackupDir, getJARList4Designer());
jarCurrentLabel.setText(downloadFileConfig.optString("buildNO"));
}
private void backupFilesFromInstallEnv(String installHome, String todayBackupDir, List<String> files) {
for (String file : files) {
try {
IOUtils.copy(
new File(StableUtils.pathJoin(installHome, UpdateConstants.APPS_FOLDER_NAME, ProductConstants.getAppFolderName(), ProjectConstants.WEBINF_NAME, ProjectConstants.LIB_NAME, file)),
new File(StableUtils.pathJoin(todayBackupDir)));
} catch (IOException e) {
FineLoggerFactory.getLogger().error(e.getMessage());
}
}
}
private void backupFilesFromInstallLib(String installHome, String todayBackupDir, List<String> files) {
for (String file : files) {
try {
IOUtils.copy(
new File(StableUtils.pathJoin(installHome, ProjectConstants.LIB_NAME, file)),
new File(StableUtils.pathJoin(todayBackupDir)));
} catch (IOException e) {
FineLoggerFactory.getLogger().error(e.getMessage());
}
}
}
private void putNewFiles() {
Map<String, String> map = new HashMap<String, String>();
java.util.List<String> list = new ArrayList<String>();
String installHome = StableUtils.getInstallHome();
putNewFilesToInstallLib(installHome, getDownLoadJAR4Designer(), map, list);
putNewFilesToInstallEnv(installHome, getDownLoadJAR4Server(), map, list);
RestartHelper.saveFilesWhichToMove(map);
RestartHelper.saveFilesWhichToDelete(list.toArray(new String[list.size()]));
}
private void putNewFilesToInstallLib(String installHome, String[] files, Map<String, String> map, java.util.List<String> list) {
for (String file : files) {
map.put(StableUtils.pathJoin(installHome, UpdateConstants.DOWNLOAD_DIR, file),
StableUtils.pathJoin(installHome, ProjectConstants.LIB_NAME, file));
list.add(StableUtils.pathJoin(installHome, ProjectConstants.LIB_NAME, file));
}
}
private void putNewFilesToInstallEnv(String installHome, String[] files, Map<String, String> map, java.util.List<String> list) {
for (String file : files) {
map.put(StableUtils.pathJoin(installHome, UpdateConstants.DOWNLOAD_DIR, file),
StableUtils.pathJoin(installHome, UpdateConstants.APPS_FOLDER_NAME, ProductConstants.getAppFolderName(), ProjectConstants.WEBINF_NAME, ProjectConstants.LIB_NAME, file));
list.add(StableUtils.pathJoin(installHome, UpdateConstants.APPS_FOLDER_NAME, ProductConstants.getAppFolderName(), ProjectConstants.WEBINF_NAME, ProjectConstants.LIB_NAME, file));
}
}
//获取备份目录
private String getBackupDirectory() {
return UpdateConstants.DESIGNER_BACKUP_DIR;
}
//获取服务器jar包列表
private List<String> getJARList4Server() {
return UpdateConstants.JARS_FOR_SERVER_X;
}
//获取设计器jar包列表
private List<String> getJARList4Designer() {
return UpdateConstants.JARS_FOR_DESIGNER_X;
}
//获取服务器jar包下载列表
private String[] getDownLoadJAR4Server() {
ArrayList<String> jarList = new ArrayList<String>();
List<String> serverItems = getJARList4Server();
for (DownloadItem downloadItem : downloadItems) {
String downloadItemName = downloadItem.getName();
if (serverItems.contains(downloadItemName)) {
jarList.add(downloadItemName);
}
}
return jarList.toArray(new String[jarList.size()]);
}
//获取设计器jar包下载列表
private String[] getDownLoadJAR4Designer() {
ArrayList<String> jarList = new ArrayList<String>();
List<String> designerJarItems = getJARList4Designer();
for (DownloadItem downloadItem : downloadItems) {
String downloadItemName = downloadItem.getName();
if (designerJarItems.contains(downloadItemName)) {
jarList.add(downloadItemName);
}
}
return jarList.toArray(new String[jarList.size()]);
}
//获取更新日志缓存配置文件名
private String getUpdateCacheConfig() {
return UpdateConstants.UPDATE_CACHE_CONFIG_X;

6
designer-base/src/main/java/com/fr/design/utils/gui/GUICoreUtils.java

@ -729,12 +729,16 @@ public final class GUICoreUtils {
* @return 布尔值
*/
public static boolean removeJListSelectedNodes(Window ancestorWindow, JList nodeList) {
return removeJListSelectedNodes(ancestorWindow, nodeList, "Fine-Design_Basic_Utils_Are_You_Sure_To_Remove_The_Selected_Item");
}
public static boolean removeJListSelectedNodes(Window ancestorWindow, JList nodeList, String key) {
int selectedIndex = nodeList.getSelectedIndex();
if (selectedIndex == -1) {
return false;
}
int returnVal = JOptionPane.showConfirmDialog(ancestorWindow, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Utils_Are_You_Sure_To_Remove_The_Selected_Item") + "?", com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Remove"),
int returnVal = JOptionPane.showConfirmDialog(ancestorWindow, com.fr.design.i18n.Toolkit.i18nText(key), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Remove"),
JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE);
if (returnVal == JOptionPane.OK_OPTION) {
int minSelectedIndex = nodeList.getMinSelectionIndex();

BIN
designer-base/src/main/resources/com/fr/design/remote/images/icon_Custom_Role_normal@1x.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 612 B

BIN
designer-base/src/main/resources/com/fr/design/remote/images/icon_Custom_Role_normal@2x.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

8
designer-form/src/main/java/com/fr/design/designer/properties/items/FRBorderConstraintsItems.java

@ -22,13 +22,13 @@ public class FRBorderConstraintsItems implements ItemProvider {
public static Item[] createItems(String[] directions) {
Item[] items = new Item[directions.length];
for (int i = 0; i < directions.length; i++) {
if (WBorderLayout.NORTH == directions[i]) {
if (WBorderLayout.NORTH.equals(directions[i])) {
items[i] = new Item(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_BorderLayout_North"), WBorderLayout.NORTH);
} else if (WBorderLayout.SOUTH == directions[i]) {
} else if (WBorderLayout.SOUTH.equals(directions[i])) {
items[i] = new Item(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_BorderLayout_South"), WBorderLayout.SOUTH);
} else if (WBorderLayout.WEST == directions[i]) {
} else if (WBorderLayout.WEST.equals(directions[i])) {
items[i] = new Item(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_BorderLayout_West"), WBorderLayout.WEST);
} else if (WBorderLayout.EAST == directions[i]) {
} else if (WBorderLayout.EAST.equals(directions[i])) {
items[i] = new Item(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_BorderLayout_East"), WBorderLayout.EAST);
}
}

Loading…
Cancel
Save