Browse Source

增加数据集lock特性

pull/1/head
richie 4 years ago
parent
commit
6df075061c
  1. 55
      src/main/java/com/fanruan/api/design/ui/component/UILockButton.java
  2. 61
      src/main/java/com/fanruan/api/design/work/ConnectionComboBoxPanel.java
  3. 50
      src/main/java/com/fanruan/api/design/work/compat/ConnectionLockHelper.java
  4. 122
      src/main/java/com/fanruan/api/design/work/component/ItemEditableComboBoxPanel.java

55
src/main/java/com/fanruan/api/design/ui/component/UILockButton.java

@ -0,0 +1,55 @@
package com.fanruan.api.design.ui.component;
import com.fr.design.editlock.EditLockChangeEvent;
import com.fr.design.editlock.EditLockChangeListener;
import com.fr.design.editlock.EditLockUtils;
import com.fr.report.LockItem;
import javax.swing.*;
/**
* @author Yvan
* @version 10.0
* Created by Yvan on 2021/1/20
*/
public class UILockButton extends UIButton implements EditLockChangeListener {
/**
* 锁定状态图标
*/
private final Icon lockedIcon;
/**
* 正常状态图标
*/
private final Icon normalIcon;
/**
* 锁定状态的提示信息
*/
private final String lockedTooltips;
/**
* 正常状态的提示信息
*/
private final String normalTooltips;
public UILockButton(Icon lockedIcon, Icon normalIcon, String lockedTooltips, String normalTooltips) {
super();
this.lockedIcon = lockedIcon;
this.normalIcon = normalIcon;
this.lockedTooltips = lockedTooltips;
this.normalTooltips = normalTooltips;
init();
}
private void init() {
boolean locked = EditLockUtils.isLocked(LockItem.CONNECTION);
this.setIcon(locked ? lockedIcon : normalIcon);
this.setToolTipText(locked ? lockedTooltips : normalTooltips);
}
@Override
public void updateLockedState(EditLockChangeEvent event) {
this.setIcon(event.isLocked() ? lockedIcon : normalIcon);
this.setToolTipText(event.isLocked() ? lockedTooltips : normalTooltips);
this.repaint();
}
}

61
src/main/java/com/fanruan/api/design/work/ConnectionComboBoxPanel.java

@ -5,34 +5,28 @@ import com.fanruan.api.data.ConnectionKit;
import com.fanruan.api.data.open.BaseConnection;
import com.fanruan.api.design.DesignKit;
import com.fanruan.api.design.macro.DataSourceConstants;
import com.fanruan.api.design.ui.component.UIButton;
import com.fanruan.api.design.work.compat.ConnectionLockHelper;
import com.fanruan.api.design.work.component.ItemEditableComboBoxPanel;
import com.fanruan.api.generic.Runner;
import com.fanruan.api.util.AssistKit;
import com.fanruan.api.util.StringKit;
import com.fr.base.svg.IconUtils;
import com.fr.data.impl.Connection;
import com.fr.design.DesignerEnvManager;
import com.fr.design.data.datapane.connect.ConnectionListPane;
import com.fr.design.data.datapane.connect.ConnectionShowPane;
import com.fr.design.data.datapane.connect.ItemEditableComboBoxPanel;
import com.fr.design.dialog.BasicDialog;
import com.fr.design.dialog.DialogActionAdapter;
import com.fr.design.editlock.ConnectionLockChangeChecker;
import com.fr.design.editlock.EditLockUtils;
import com.fr.design.gui.ibutton.UIButton;
import com.fr.design.gui.ibutton.UILockButton;
import com.fr.file.ConnectionConfig;
import com.fr.report.LockItem;
import com.fr.general.GeneralUtils;
import com.fr.stable.NameReference;
import com.fr.stable.StringUtils;
import com.fr.transaction.WorkerCallBack;
import com.fr.workspace.WorkContext;
import com.fr.workspace.server.connection.DBConnectAuth;
import org.jetbrains.annotations.Nullable;
import javax.swing.SwingUtilities;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.ArrayList;
@ -66,20 +60,15 @@ public class ConnectionComboBoxPanel extends ItemEditableComboBoxPanel {
@Override
protected UIButton initEditButton(UIButton editButton, Dimension buttonSize) {
editButton = new UILockButton(
EditLockUtils.CONNECTION_LOCKED_ICON,
IconUtils.readIcon("/com/fr/design/images/m_web/connection"),
EditLockUtils.CONNECTION_LOCKED_TOOLTIPS,
null
);
editButton.setPreferredSize(buttonSize);
editButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
editItems();
if (isChangedVersion()) {
return ConnectionLockHelper.generateLockButton(buttonSize, e -> editItems());
} else {
return super.initEditButton(editButton, buttonSize);
}
});
ConnectionLockChangeChecker.getInstance().addEditLockChangeListener((UILockButton) editButton);
return editButton;
}
private boolean isChangedVersion() {
return GeneralUtils.readBuildNO().compareTo("2021.03.15") > 0;
}
protected Iterator<String> items() {
@ -120,14 +109,12 @@ public class ConnectionComboBoxPanel extends ItemEditableComboBoxPanel {
protected void editItems() {
// 尝试为数据连接加锁
boolean actionLock = EditLockUtils.lock(LockItem.CONNECTION);
if (!actionLock) {
// 锁定失败,代表已经被其他用户锁定,跳出弹窗提示
EditLockUtils.showLockMessage(this);
if (isChangedVersion()) {
boolean lock = ConnectionLockHelper.doLock(this);
if (lock) {
return;
}
// 锁定成功,执行后续操作
}
final ConnectionListPane connectionListPane = new ConnectionListPane();
final ConnectionConfig connectionConfig = ConnectionConfig.getInstance();
ConnectionConfig cloned = connectionConfig.mirror();
@ -155,8 +142,7 @@ public class ConnectionComboBoxPanel extends ItemEditableComboBoxPanel {
@Override
public void afterCommit() {
DesignKit.getDesignerBean("databasename").refreshBeanElement();
// 关闭定义数据连接页面,为其解锁
EditLockUtils.unlock(LockItem.CONNECTION);
unlock();
}
@Override
@ -169,14 +155,19 @@ public class ConnectionComboBoxPanel extends ItemEditableComboBoxPanel {
@Override
public void doCancel() {
super.doCancel();
// 关闭定义数据连接页面,为其解锁
EditLockUtils.unlock(LockItem.CONNECTION);
unlock();
}
});
connectionListDialog.setVisible(true);
refreshItems();
}
private void unlock() {
if (isChangedVersion()) {
ConnectionLockHelper.unlock();
}
}
/**
* @param connection 数据库链接
*/

50
src/main/java/com/fanruan/api/design/work/compat/ConnectionLockHelper.java

@ -0,0 +1,50 @@
package com.fanruan.api.design.work.compat;
import com.fanruan.api.design.ui.component.UIButton;
import com.fanruan.api.design.ui.component.UILockButton;
import com.fr.base.svg.IconUtils;
import com.fr.design.editlock.ConnectionLockChangeChecker;
import com.fr.design.editlock.EditLockUtils;
import com.fr.report.LockItem;
import java.awt.*;
import java.awt.event.ActionListener;
/**
* @author richie
* @version 10.0
* Created by richie on 2021/3/18
* 用于兼容没有数据连接lock的版本
*/
public class ConnectionLockHelper {
public static UIButton generateLockButton(Dimension buttonSize, ActionListener listener) {
UILockButton editButton = new UILockButton(
EditLockUtils.CONNECTION_LOCKED_ICON,
IconUtils.readIcon("/com/fr/design/images/m_web/connection"),
EditLockUtils.CONNECTION_LOCKED_TOOLTIPS,
null
);
editButton.setPreferredSize(buttonSize);
editButton.addActionListener(listener);
ConnectionLockChangeChecker.getInstance().addEditLockChangeListener(editButton);
return editButton;
}
public static boolean doLock(Component component) {
// 尝试为数据连接加锁
boolean actionLock = EditLockUtils.lock(LockItem.CONNECTION);
if (!actionLock) {
// 锁定失败,代表已经被其他用户锁定,跳出弹窗提示
EditLockUtils.showLockMessage(component);
return true;
}
return false;
}
public static void unlock() {
// 关闭定义数据连接页面,为其解锁
EditLockUtils.unlock(LockItem.CONNECTION);
}
}

122
src/main/java/com/fanruan/api/design/work/component/ItemEditableComboBoxPanel.java

@ -0,0 +1,122 @@
package com.fanruan.api.design.work.component;
import com.fanruan.api.design.ui.component.UIButton;
import com.fanruan.api.design.ui.component.UIComboBox;
import com.fanruan.api.util.IOKit;
import com.fanruan.api.util.StringKit;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
/**
* @author richie
* @version 10.0
* Created by richie on 2021/3/18
*/
public abstract class ItemEditableComboBoxPanel extends JPanel {
private static final long serialVersionUID = 1L;
protected static final Object EMPTY = new Object() {
public String toString() {
return StringKit.EMPTY;
}
};
protected UIComboBox<?> itemComboBox;
protected UIButton editButton;
protected UIButton refreshButton;
public ItemEditableComboBoxPanel() {
super();
initComponents();
}
protected void initComponents() {
this.setLayout(new BorderLayout(4, 4));
Dimension buttonSize = new Dimension(26, 20);
itemComboBox = new UIComboBox<>();
itemComboBox.setEnabled(true);
this.add(itemComboBox, BorderLayout.CENTER);
refreshButton = new UIButton(IOKit.readIcon("/com/fr/design/images/control/refresh.png"));
JPanel jPanel = new JPanel(new GridLayout(0, 2, 4, 4));
editButton = initEditButton(editButton, buttonSize);
jPanel.add(editButton);
jPanel.add(refreshButton);
this.add(jPanel, BorderLayout.EAST);
refreshButton.setPreferredSize(buttonSize);
refreshButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
refreshItems();
}
});
}
protected UIButton initEditButton(UIButton editButton, Dimension buttonSize) {
editButton = new UIButton(IOKit.readIcon("/com/fr/design/images/control/control-center2.png"));
editButton.setPreferredSize(buttonSize);
editButton.addActionListener(evt -> editItems());
return editButton;
}
/**
* 给itemComboBox添加ActionListener
*/
public void addComboBoxActionListener(ActionListener l) {
itemComboBox.addActionListener(l);
}
protected void refreshItems() {
// 记录原来选中的Item,重新加载后需要再次选中
Object lastSelectedItem = itemComboBox.getSelectedItem();
DefaultComboBoxModel<Object> model = ((DefaultComboBoxModel<Object>) itemComboBox.getModel());
model.removeAllElements();
// 先加EMPTY,再加items
model.addElement(EMPTY);
java.util.Iterator<String> itemIt = items();
while (itemIt.hasNext()) {
model.addElement(itemIt.next());
}
// 再次选中之前选中的Item
int idx = model.getIndexOf(lastSelectedItem);
if (idx < 0) {
idx = 0;
}
itemComboBox.setSelectedIndex(idx);
}
/*
* 得到其中的itemComboBox所选中的Item
*/
public String getSelectedItem() {
Object selected = itemComboBox.getSelectedItem();
return selected instanceof String ? (String) selected : null;
}
/*
* 选中name项
*/
public void setSelectedItem(String name) {
DefaultComboBoxModel model = ((DefaultComboBoxModel) itemComboBox.getModel());
model.setSelectedItem(name);
}
/*
* 刷新ComboBox.items
*/
protected abstract java.util.Iterator<String> items();
/*
* 弹出对话框编辑Items
*/
protected abstract void editItems();
}
Loading…
Cancel
Save