diff --git a/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java b/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java index e7f747d81..563c1620e 100644 --- a/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java +++ b/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java @@ -64,6 +64,8 @@ import com.fr.workspace.server.vcs.VcsConfig; import com.fr.workspace.server.vcs.VcsOperator; import com.fr.workspace.server.vcs.git.config.GcConfig; import com.fr.workspace.server.vcs.v2.scheduler.VcsAutoCleanOperator; +import com.fr.workspace.server.vcs.v2.scheduler.VcsAutoCleanSchedule; +import com.fr.workspace.server.vcs.v2.scheduler.VcsAutoCleanService; import org.jetbrains.annotations.NotNull; import javax.swing.BorderFactory; @@ -1189,9 +1191,12 @@ public class PreferencePane extends BasicPane { } if (useVcsAutoCleanScheduleCheckBox.isSelected()) { FineLoggerFactory.getLogger().info("[VcsV2] start auto clean!"); - WorkContext.getCurrent().get(VcsAutoCleanOperator.class).addOrUpdateVcsAutoCleanJob(getDay(autoCleanIntervalComboBox.getSelectedIndex())); + WorkContext.getCurrent().get(VcsAutoCleanOperator.class).addOrUpdateVcsAutoCleanJob( + VcsAutoCleanService.VCS_AUTO_CLEAN_JOB_NAME, + getDay(autoCleanIntervalComboBox.getSelectedIndex()), + VcsAutoCleanSchedule.class); } else { - WorkContext.getCurrent().get(VcsAutoCleanOperator.class).stopVcsAutoCleanJob(); + WorkContext.getCurrent().get(VcsAutoCleanOperator.class).stopVcsAutoCleanJob(VcsAutoCleanService.VCS_AUTO_CLEAN_JOB_NAME); } } return null; diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/RecycleAction.java b/designer-base/src/main/java/com/fr/design/mainframe/vcs/RecycleAction.java index b074f17f8..acd89f668 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/vcs/RecycleAction.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/vcs/RecycleAction.java @@ -4,7 +4,7 @@ import com.fr.design.actions.UpdateAction; import com.fr.design.dialog.BasicDialog; import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.DesignerContext; -import com.fr.design.mainframe.vcs.ui.RecyclePane; +import com.fr.design.mainframe.vcs.ui.RecycleSettingPane; import java.awt.event.ActionEvent; @@ -24,7 +24,7 @@ public class RecycleAction extends UpdateAction { @Override public void actionPerformed(ActionEvent e) { - RecyclePane pane = new RecyclePane(); + RecycleSettingPane pane = new RecycleSettingPane(); BasicDialog dialog = pane.showWindow(DesignerContext.getDesignerFrame(), false); dialog.setVisible(true); } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/AbstractSupportSelectTablePane.java b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/AbstractSupportSelectTablePane.java index a4ee2623c..75733121d 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/AbstractSupportSelectTablePane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/AbstractSupportSelectTablePane.java @@ -220,6 +220,17 @@ public abstract class AbstractSupportSelectTablePane exte //更新表头的勾选框状态 HeaderRenderer renderer = (HeaderRenderer) table.getTableHeader().getDefaultRenderer(); renderer.refreshHeader(table, selectCount >= table.getRowCount()); + changeExtraComponentStatus(); + } + + /** + * 更新额外组件的状态 + */ + protected void changeExtraComponentStatus() { + } + + public int getSelectCount() { + return selectCount; } @@ -256,6 +267,7 @@ public abstract class AbstractSupportSelectTablePane exte selectBox.setSelected(value); selectAllOrNull(value); selectCount = value ? table.getRowCount() : 0; + changeExtraComponentStatus(); tableHeader.repaint(); model.fireTableDataChanged(); } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/RecyclePane.java b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/RecyclePane.java index e1a9bce62..f9e803c3f 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/RecyclePane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/RecyclePane.java @@ -39,8 +39,10 @@ import static com.fr.design.i18n.Toolkit.i18nText; */ public class RecyclePane extends AbstractSupportSelectTablePane { public static final Icon ICON_SEARCH = IconUtils.readIcon("/com/fr/design/standard/vcslist/vcs_recycle_search"); - public static final Icon ICON_REFRESH = IconUtils.readIcon("/com/fr/design/standard/vcslist/vcs_recycle_restore"); - public static final Icon ICON_DELETE = IconUtils.readIcon("/com/fr/design/standard/vcslist/vcs_recycle_delete"); + public static final Icon ICON_REFRESH = IconUtils.readSVGIcon("/com/fr/design/standard/vcslist/vcs_recycle_restore", IconUtils.ICON_TYPE_NORMAL); + public static final Icon ICON_REFRESH_DISABLE = IconUtils.readSVGIcon("/com/fr/design/standard/vcslist/vcs_recycle_restore", IconUtils.ICON_TYPE_DISABLED); + public static final Icon ICON_DELETE = IconUtils.readSVGIcon("/com/fr/design/standard/vcslist/vcs_recycle_delete", IconUtils.ICON_TYPE_NORMAL); + public static final Icon ICON_DELETE_DISABLE = IconUtils.readSVGIcon("/com/fr/design/standard/vcslist/vcs_recycle_delete", IconUtils.ICON_TYPE_DISABLED); protected UITextField searchTextField; @@ -77,7 +79,7 @@ public class RecyclePane extends AbstractSupportSelectTablePane Toolkit.i18nText("Fine-Design_Vcs_Recycle_Size"), Toolkit.i18nText("Fine-Design_Vcs_Delete_Time"), Toolkit.i18nText("Fine-Design_Vcs_Time") - }, true); + }, false); } public RecyclePane(String title, TableValueOperator operators, boolean needBorder) { @@ -115,17 +117,33 @@ public class RecyclePane extends AbstractSupportSelectTablePane if (isNeedRestore()) { restoreLabel = new UILabel(ICON_REFRESH); restoreLabel.setCursor(new Cursor(Cursor.HAND_CURSOR)); + restoreLabel.setDisabledIcon(ICON_REFRESH_DISABLE); + restoreLabel.setEnabled(false); rightPane.add(restoreLabel); } if (isNeedDelete()) { deleteLabel = new UILabel(ICON_DELETE); deleteLabel.setCursor(new Cursor(Cursor.HAND_CURSOR)); + deleteLabel.setDisabledIcon(ICON_DELETE_DISABLE); + deleteLabel.setEnabled(false); rightPane.add(deleteLabel); } tableTopPane.add(leftPane, BorderLayout.EAST); tableTopPane.add(rightPane, BorderLayout.WEST); } + + @Override + protected void changeExtraComponentStatus() { + boolean canUseLabel = getSelectCount() > 0; + if (restoreLabel != null) { + restoreLabel.setEnabled(canUseLabel); + } + if (deleteLabel != null) { + deleteLabel.setEnabled(canUseLabel); + } + } + @Override protected void initTopPaneListener() { initSearchTextFiledListener(); @@ -181,6 +199,7 @@ public class RecyclePane extends AbstractSupportSelectTablePane } + private void fireListener(VcsResponseListener listener, boolean isDelete) { List selectList = model.getList().stream().filter(TableEntity::isSelect).map(VcsTableEntity::getEntity).collect(Collectors.toList()); if (selectList.size() > 0) { diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/RecycleSettingPane.java b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/RecycleSettingPane.java new file mode 100644 index 000000000..7c41e64f2 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/RecycleSettingPane.java @@ -0,0 +1,119 @@ +package com.fr.design.mainframe.vcs.ui; + +import com.fr.design.dialog.BasicPane; +import com.fr.design.gui.frpane.UITabbedPane; +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.ispinner.UISpinner; +import com.fr.design.i18n.Toolkit; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.layout.VerticalFlowLayout; +import com.fr.transaction.Configurations; +import com.fr.transaction.WorkerAdaptor; +import com.fr.workspace.WorkContext; +import com.fr.workspace.server.vcs.VcsConfig; +import com.fr.workspace.server.vcs.v2.scheduler.VcsAutoCleanOperator; +import com.fr.workspace.server.vcs.v2.scheduler.VcsAutoCleanService; +import com.fr.workspace.server.vcs.v2.scheduler.VcsAutoRecycleSchedule; + +import javax.swing.JPanel; +import javax.swing.ScrollPaneConstants; +import javax.swing.border.EmptyBorder; + +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + + +/** + * 回收站配置面板 + * + * @author Destiny.Lin + * @since 11.0 + * Created on 2023/7/21 + */ +public class RecycleSettingPane extends BasicPane { + + private static final int MIN_VALUE = 1; + + private static final int MAX_VALUE = 999; + + private static final int STEP = 1; + + private static final int DEFAULT_VALUE = 30; + + private UISpinner spinner; + + private UIButton button; + + public RecycleSettingPane() { + init(); + } + + private void init() { + + this.setLayout(new BorderLayout()); + UITabbedPane tabbedPane = new UITabbedPane(); + //回收站内容 + JPanel recyclePane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_L_Pane(); + UIScrollPane recycleScrollPane = patchScroll(recyclePane); + tabbedPane.addTab(Toolkit.i18nText("Fine-Design_Vcs_Recycle_Content"), recycleScrollPane); + recyclePane.add(new RecyclePane()); + //通用设置 + JPanel settingPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_L_Pane(); + UIScrollPane settingScrollPane = patchScroll(settingPane); + tabbedPane.addTab(Toolkit.i18nText("Fine-Design_Basic_Carton_General_Settings"), settingScrollPane); + settingPane.add(createSchedulePane()); + this.add(tabbedPane, BorderLayout.CENTER); + } + + private JPanel createSchedulePane() { + JPanel schedulePane = FRGUIPaneFactory.createVerticalFlowLayout_Pane(true, VerticalFlowLayout.TOP, 0, 0); + JPanel spinnerPane = FRGUIPaneFactory.createBoxFlowInnerContainer_S_Pane_First0(); + JPanel buttonPane = FRGUIPaneFactory.createBoxFlowInnerContainer_S_Pane_First0(); + spinnerPane.add(new UILabel(Toolkit.i18nText("Fine-Design_Vcs_Recycle_Schedule"))); + spinner = new UISpinner(MIN_VALUE, MAX_VALUE, STEP, DEFAULT_VALUE); + spinner.setValue(VcsConfig.getInstance().getV2CleanRecycleInterval()); + spinnerPane.add(spinner); + spinnerPane.add(new UILabel(Toolkit.i18nText("Fine-Design_Vcs_Recycle_Schedule_Day"))); + schedulePane.add(spinnerPane); + button = new UIButton(Toolkit.i18nText("Fine-Design_Basic_Save")); + initButtonListener(); + buttonPane.add(button); + schedulePane.add(buttonPane); + return schedulePane; + } + + private void initButtonListener() { + button.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + new Thread(() -> { + Configurations.update(new WorkerAdaptor(VcsConfig.class) { + @Override + public void run() { + VcsConfig.getInstance().setV2CleanRecycleInterval((int) spinner.getValue()); + } + }); + WorkContext.getCurrent().get(VcsAutoCleanOperator.class).addOrUpdateVcsAutoCleanJob( + VcsAutoCleanService.VCS_AUTO_CLEAN_RECYCLE_JOB_NAME, + 1, + VcsAutoRecycleSchedule.class); + }).start(); + } + }); + } + + + private UIScrollPane patchScroll(JPanel generalPane) { + UIScrollPane generalPanelWithScroll = new UIScrollPane(generalPane, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); + generalPanelWithScroll.setBorder(new EmptyBorder(0, 0, 0, 0)); + return generalPanelWithScroll; + } + + @Override + protected String title4PopupWindow() { + return Toolkit.i18nText("Fine-Design_Vcs_Recycle"); + } +}