Browse Source

Merge remote-tracking branch 'origin/fbp/release' into fbp/release

fbp/release
Destiny.Lin 1 month ago
parent
commit
989e4d6734
  1. 85
      designer-base/src/main/java/com/fine/theme/utils/FineUIUtils.java
  2. 3
      designer-base/src/main/java/com/fr/design/ExtraDesignClassManager.java
  3. 85
      designer-base/src/main/java/com/fr/design/editor/editor/ColumnRowGroupEditor.java
  4. 6
      designer-base/src/main/java/com/fr/design/file/DefaultTemplateTreeDefineProcessor.java
  5. 23
      designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java
  6. 16
      designer-base/src/main/java/com/fr/design/gui/itree/refreshabletree/RefreshableJTree.java
  7. 3
      designer-base/src/main/java/com/fr/design/mainframe/CenterRegionContainerPane.java
  8. 23
      designer-base/src/main/java/com/fr/file/FILEChooserPane.java
  9. 13
      designer-base/src/main/resources/com/fine/theme/icon/editor/cell_group_popup.svg
  10. 13
      designer-base/src/main/resources/com/fine/theme/icon/editor/cell_group_popup_disable.svg
  11. 1
      designer-base/src/main/resources/com/fine/theme/light/ui/fine_light.icon.json
  12. 136
      designer-base/src/main/resources/com/fr/design/data/tabledata/datacenter/web/data-choose.main.js
  13. 16
      designer-realize/src/main/java/com/fanruan/boot/env/DesignEnvComponent.java
  14. 13
      designer-realize/src/main/java/com/fr/design/webattr/EventPane.java
  15. 18
      designer-realize/src/main/java/com/fr/design/webattr/ToolBarDragPane.java
  16. 10
      designer-realize/src/main/java/com/fr/design/webattr/WebSettingPane.java
  17. 4
      designer-realize/src/main/java/com/fr/start/MainDesigner.java

85
designer-base/src/main/java/com/fine/theme/utils/FineUIUtils.java

@ -18,6 +18,7 @@ import javax.swing.JLayer;
import javax.swing.ScrollPaneConstants;
import javax.swing.UIManager;
import javax.swing.JTextArea;
import javax.swing.JScrollBar;
import java.awt.Color;
import java.awt.Component;
import java.awt.Composite;
@ -517,4 +518,88 @@ public class FineUIUtils {
DesignerFrame parent = DesignerContext.getDesignerFrame();
return new Dimension((int) (parent.getWidth() * width),(int) (parent.getHeight() * height));
}
/**
* 处理子面板的滚动事件
* 根据滚动情况判断是否需要将事件传递给父面板或者由子面板自行处理滚动
*
* @param childScrollBar 子面板的滚动条
* @param parentScrollBar 父面板的滚动条
* @param scrollAmount 滚动增量通常是鼠标滚轮的滚动值
*/
public static void handleChildScrollEvent(JScrollBar childScrollBar, JScrollBar parentScrollBar, int scrollAmount) {
// 如果子面板的滚动条为空,返回
if (childScrollBar == null) {
return;
}
// 如果子面板没有显示滚动条,直接将滚动事件传递给父面板
if (!childScrollBar.isVisible()) {
propagateScrollToParent(parentScrollBar, scrollAmount);
return;
}
// 获取子面板当前的滚动值、最小值、最大值和可见区域的高度
int currentScrollValue = childScrollBar.getValue();
int minScrollValue = childScrollBar.getMinimum();
int maxScrollValue = childScrollBar.getMaximum();
int visibleAreaHeight = childScrollBar.getVisibleAmount();
// 如果滚动到顶部或到底部,将事件传递给父面板
if (isScrolledToTop(currentScrollValue, minScrollValue, scrollAmount)
|| isScrolledToBottom(currentScrollValue, maxScrollValue, visibleAreaHeight, scrollAmount)) {
propagateScrollToParent(parentScrollBar, scrollAmount);
} else {
// 否则由子面板自己处理滚动更新滚动值
childScrollBar.setValue(currentScrollValue + calculateScrollIncrement(childScrollBar, scrollAmount));
}
}
/**
* 判断是否滚动到顶部
*
* @param currentScrollValue 当前滚动条的位置
* @param minScrollValue 滚动条的最小值
* @param scrollAmount 滚动增量
* @return 如果滚动到顶部返回 true否则返回 false
*/
private static boolean isScrolledToTop(int currentScrollValue, int minScrollValue, int scrollAmount) {
return scrollAmount < 0 && currentScrollValue == minScrollValue;
}
/**
* 判断是否滚动到底部
*
* @param currentScrollValue 当前滚动条的位置
* @param maxScrollValue 滚动条的最大值
* @param visibleAreaHeight 可见区域的高度
* @param scrollAmount 滚动增量
* @return 如果滚动到底部返回 true否则返回 false
*/
private static boolean isScrolledToBottom(int currentScrollValue, int maxScrollValue, int visibleAreaHeight, int scrollAmount) {
return scrollAmount > 0 && currentScrollValue == maxScrollValue - visibleAreaHeight;
}
/**
* 将滚动事件传递给父面板处理父面板的滚动
*
* @param parentScrollBar 父面板的滚动条
* @param scrollAmount 滚动增量
*/
private static void propagateScrollToParent(JScrollBar parentScrollBar, int scrollAmount) {
if (parentScrollBar != null) {
// 根据滚动增量计算并更新父面板滚动条的位置
int scrollIncrement = calculateScrollIncrement(parentScrollBar, scrollAmount);
parentScrollBar.setValue(parentScrollBar.getValue() + scrollIncrement);
}
}
/**
* 计算滚动增量基于滚动条的单位增量和滚动的数量UIScrollPane中设置的30
*
* @param scrollBar 滚动条
* @param scrollAmount 滚动增量
* @return 计算出的增量值
*/
private static int calculateScrollIncrement(JScrollBar scrollBar, int scrollAmount) {
// 获取滚动条的单位增量,并计算实际的滚动增量
return scrollAmount * scrollBar.getUnitIncrement(1);
}
}

3
designer-base/src/main/java/com/fr/design/ExtraDesignClassManager.java

@ -4,6 +4,7 @@
package com.fr.design;
import com.fine.theme.icon.LazyIcon;
import com.fr.base.BaseUtils;
import com.fr.common.annotations.Open;
import com.fr.design.data.datapane.TableDataNameObjectCreator;
@ -143,7 +144,7 @@ public class ExtraDesignClassManager extends AbstractExtraClassManager implement
WidgetOption createT(ToolbarItemProvider provider) {
return WidgetOptionFactory.createByWidgetClass(
provider.nameForWidget(),
IOUtils.readIcon(provider.iconPathForWidget()),
new LazyIcon(provider.iconPathForWidget()),
provider.classForWidget()
);
}

85
designer-base/src/main/java/com/fr/design/editor/editor/ColumnRowGroupEditor.java

@ -1 +1,84 @@
package com.fr.design.editor.editor; import com.fr.design.gui.itextfield.UITextField; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.stable.ColumnRowGroup; import java.awt.*; /** * Author : Shockway * Date: 14-1-10 * Time: 下午1:46 */ public class ColumnRowGroupEditor extends Editor<ColumnRowGroup> { private UITextField crEditor; public ColumnRowGroupEditor() { this(""); } public ColumnRowGroupEditor(String name) { this(null, name); } public ColumnRowGroupEditor(ColumnRowGroup value) { this(value, ""); } public ColumnRowGroupEditor(ColumnRowGroup value, String name) { this.setLayout(FRGUIPaneFactory.createBorderLayout()); crEditor = new UITextField(); this.add(crEditor, BorderLayout.CENTER); this.setValue(value); this.setName(name); } @Override public ColumnRowGroup getValue() { return new ColumnRowGroup(this.crEditor.getText()); } @Override public void setValue(ColumnRowGroup value) { if (value == null) { this.crEditor.setText(""); } else { this.crEditor.setText(value.toString()); } } @Override public void setEnabled(boolean enabled) { super.setEnabled(enabled); this.crEditor.setEnabled(enabled); } /** * 获取焦点 */ public void requestFocus() { this.crEditor.requestFocus(); } public String getIconName() { return "cell_group"; } /** * 是否接收/支持这个对象 * @param object 检测对象 * @return 是否支持 */ public boolean accept(Object object) { return object instanceof ColumnRowGroup; } }
package com.fr.design.editor.editor;
import com.fr.design.gui.itextfield.UITextField;
import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.stable.ColumnRowGroup;
import java.awt.*;
/**
* 单元格组编辑
*
* @author Shockway
* @since 2014-01-10
* Created on 2024-01-10
*/
public class ColumnRowGroupEditor extends Editor<ColumnRowGroup> {
private UITextField crEditor;
public ColumnRowGroupEditor() {
this("");
}
public ColumnRowGroupEditor(String name) {
this(null, name);
}
public ColumnRowGroupEditor(ColumnRowGroup value) {
this(value, "");
}
public ColumnRowGroupEditor(ColumnRowGroup value, String name) {
this.setLayout(FRGUIPaneFactory.createBorderLayout());
crEditor = new UITextField();
this.add(crEditor, BorderLayout.CENTER);
this.setValue(value);
this.setName(name);
}
@Override
public ColumnRowGroup getValue() {
return new ColumnRowGroup(this.crEditor.getText());
}
@Override
public void setValue(ColumnRowGroup value) {
if (value == null) {
this.crEditor.setText("");
} else {
this.crEditor.setText(value.toString());
}
}
@Override
public void setEnabled(boolean enabled) {
super.setEnabled(enabled);
this.crEditor.setEnabled(enabled);
}
/**
* 获取焦点
*/
public void requestFocus() {
this.crEditor.requestFocus();
}
public String getIconName() {
return "cell_group";
}
public String getIconId() {
return "cell_group_popup";
}
/**
* 是否接收/支持这个对象
* @param object 检测对象
* @return 是否支持
*/
public boolean accept(Object object) {
return object instanceof ColumnRowGroup;
}
}

6
designer-base/src/main/java/com/fr/design/file/DefaultTemplateTreeDefineProcessor.java

@ -404,11 +404,9 @@ public class DefaultTemplateTreeDefineProcessor extends AbstractTemplateTreeDefi
if (moveSuccess) {
ToastMsgDialog dialog = DesignerToastMsgUtil.createPromptDialog(Toolkit.i18nText("Fine-Design_Basic_Template_Moved_Success"));
dialog.setVisible(true);
DesignerFrameFileDealerPane.getInstance().getSelectedOperation().refresh();
SwingUtilities.invokeLater(() -> {
NodeAuthProcessor.getInstance().refresh();
DesignerFrameFileDealerPane.getInstance().refreshRightToolBarBy(null);
LocateAction.gotoEditingTemplateLeaf(targetFile);
});
}
}

23
designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java

@ -116,7 +116,6 @@ public class MultiTemplateTabPane extends Row {
private boolean hoverMoreAction = false;
private Icon clodeIcon = new LazyIcon("clear");
private boolean isShowList = false;
private JButton leadingActionButton;
private final UIToolbar leadingToolBar = new UIToolbar();
//自动新建的模板B若没有进行任何编辑,切换到其他
@ -203,17 +202,6 @@ public class MultiTemplateTabPane extends Row {
updateLeadingToolBar();
}
/**
* 为前导动作添加监听
*
* @param l 监听器
*/
public void addLeadingAction(ActionListener l) {
newTemplateAction = l;
leadingActionButton.removeActionListener(newTemplateAction);
leadingActionButton.addActionListener(newTemplateAction);
}
public void setToolBarEnable(boolean enable) {
leadingToolBar.setEnabled(enable);
}
@ -787,7 +775,9 @@ public class MultiTemplateTabPane extends Row {
public void mouseClicked(MouseEvent e) {
// 双击添加模板
if (e.getClickCount() == DOUBLE_CLICK
&& isOverBlank(e.getX())) {
&& isOverBlank(e.getX())
&& newTemplateAction != null
) {
newTemplateAction.actionPerformed(null);
}
}
@ -1003,6 +993,7 @@ public class MultiTemplateTabPane extends Row {
/**
* 创建新建模板的前导区工具按钮
*
* @return
*/
private ToolBarDef createLeadingToolBarDef() {
@ -1013,17 +1004,21 @@ public class MultiTemplateTabPane extends Row {
/**
* 创建新建文件的按钮数组
*
* @return
*/
public ShortCut[] createNewTemplateShortCuts() {
ArrayList<ShortCut> shortCuts = new ArrayList<ShortCut>();
shortCuts.add(new NewWorkBookToolButtonAction());
NewWorkBookToolButtonAction action = new NewWorkBookToolButtonAction();
shortCuts.add(action);
newTemplateAction = action;
return shortCuts.toArray(new ShortCut[0]);
}
/**
* 插入插件中的按钮
*
* @return
*/
protected void insertLeadingToolButton(ToolBarDef toolBarDef, String anchor) {

16
designer-base/src/main/java/com/fr/design/gui/itree/refreshabletree/RefreshableJTree.java

@ -316,4 +316,20 @@ public abstract class RefreshableJTree extends CheckBoxTree {
tip.setOpaque(false);
return tip;
}
@Override
public TreePath getPathForLocation(int x, int y) {
// NewUI树组件全选行,仅考虑y坐标即可
TreePath closestPath = getClosestPathForLocation(x, y);
if (closestPath != null) {
Rectangle pathBounds = getPathBounds(closestPath);
if(pathBounds != null &&
y >= pathBounds.y && y < (pathBounds.y + pathBounds.height)) {
return closestPath;
}
}
return null;
}
}

3
designer-base/src/main/java/com/fr/design/mainframe/CenterRegionContainerPane.java

@ -98,8 +98,7 @@ public class CenterRegionContainerPane extends JPanel {
}
private MultiTemplateTabPane initTemplateTabPane() {
MultiTemplateTabPane templateTabPane = MultiTemplateTabPane.getInstance();
return templateTabPane;
return MultiTemplateTabPane.getInstance();
}
public ToolBarMenuDock getToolBarMenuDock() {

23
designer-base/src/main/java/com/fr/file/FILEChooserPane.java

@ -1926,15 +1926,15 @@ public class FILEChooserPane extends BasicPane {
nameField.getDocument().addDocumentListener(new DocumentListener() {
public void changedUpdate(DocumentEvent e) {
validInput();
resetInputChecker();
}
public void insertUpdate(DocumentEvent e) {
validInput();
resetInputChecker();
}
public void removeUpdate(DocumentEvent e) {
validInput();
resetInputChecker();
}
});
nameField.selectAll();
@ -1993,7 +1993,9 @@ public class FILEChooserPane extends BasicPane {
}
private void confirmClose() {
if (!validInput()) {
return;
};
String userInput = nameField.getText().trim();
// 处理不合法的文件夹名称
@ -2028,12 +2030,13 @@ public class FILEChooserPane extends BasicPane {
}
private void validInput() {
private boolean validInput() {
boolean valid = true;
String userInput = nameField.getText().trim();
if (StringUtils.isEmpty(userInput)) {
confirmButton.setEnabled(false);
valid = false;
}
boolean duplicate = false;
@ -2045,7 +2048,7 @@ public class FILEChooserPane extends BasicPane {
break;
}
}
valid = valid && !duplicate;
if (duplicate) {
nameField.selectAll();
// 如果文件名已存在,则灰掉确认按钮
@ -2059,6 +2062,12 @@ public class FILEChooserPane extends BasicPane {
warnLabel.setVisible(false);
confirmButton.setEnabled(true);
}
return valid;
}
private void resetInputChecker() {
warnLabel.setVisible(false);
confirmButton.setEnabled(true);
}
}
}

13
designer-base/src/main/resources/com/fine/theme/icon/editor/cell_group_popup.svg

@ -0,0 +1,13 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_13814_85902)">
<path fill-rule="evenodd" clip-rule="evenodd" d="M1.90625 3.53125C1.90625 2.53023 2.71773 1.71875 3.71875 1.71875H14.5V3.53125H3.71875V13.5H1.90625V3.53125ZM25.2812 23.4688V13.5H27.0938V23.4688C27.0938 24.4698 26.2823 25.2812 25.2812 25.2812H14.5V23.4688H25.2812Z" fill="#0A1C38" fill-opacity="0.9"/>
<path d="M1.90625 13.5H14.5V25.2812H3.71875C2.71773 25.2812 1.90625 24.4698 1.90625 23.4688V13.5Z" fill="#2576EF"/>
<path d="M27.0938 13.5H14.5V1.71875H25.2812C26.2823 1.71875 27.0938 2.53023 27.0938 3.53125V13.5Z" fill="#2576EF"/>
<path d="M24.2851 30C24.0316 30 23.9047 29.6935 24.0839 29.5143L29.5143 24.0839C29.6935 23.9047 30 24.0316 30 24.2851V29.6C30 29.8209 29.8209 30 29.6 30H24.2851Z" fill="#0A1C38" fill-opacity="0.9"/>
</g>
<defs>
<clipPath id="clip0_13814_85902">
<rect width="32" height="32" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 985 B

13
designer-base/src/main/resources/com/fine/theme/icon/editor/cell_group_popup_disable.svg

@ -0,0 +1,13 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_13814_85916)">
<path fill-rule="evenodd" clip-rule="evenodd" d="M1.90625 3.53125C1.90625 2.53023 2.71773 1.71875 3.71875 1.71875H14.5V3.53125H3.71875V13.5H1.90625V3.53125ZM25.2812 23.4688V13.5H27.0938V23.4688C27.0938 24.4698 26.2823 25.2812 25.2812 25.2812H14.5V23.4688H25.2812Z" fill="#0A1C38" fill-opacity="0.29"/>
<path d="M1.90625 13.5H14.5V25.2812H3.71875C2.71773 25.2812 1.90625 24.4698 1.90625 23.4688V13.5Z" fill="#0A1C38" fill-opacity="0.29"/>
<path d="M27.0938 13.5H14.5V1.71875H25.2812C26.2823 1.71875 27.0938 2.53023 27.0938 3.53125V13.5Z" fill="#0A1C38" fill-opacity="0.29"/>
<path d="M24.2851 30C24.0316 30 23.9047 29.6935 24.0839 29.5143L29.5143 24.0839C29.6935 23.9047 30 24.0316 30 24.2851V29.6C30 29.8209 29.8209 30 29.6 30H24.2851Z" fill="#0A1C38" fill-opacity="0.29"/>
</g>
<defs>
<clipPath id="clip0_13814_85916">
<rect width="32" height="32" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

1
designer-base/src/main/resources/com/fine/theme/light/ui/fine_light.icon.json

@ -393,6 +393,7 @@
"date_popup": "editor/date_popup.svg",
"param_popup": "editor/param_popup.svg",
"cellelement_popup": "editor/cellelement_popup.svg",
"cell_group_popup": "editor/cell_group_popup.svg",
"bind_column_popup": "editor/bind_column_popup.svg",
"preview_mobile": "preview/preview_mobile.svg",
"preview_paging": "preview/preview_paging.svg",

136
designer-base/src/main/resources/com/fr/design/data/tabledata/datacenter/web/data-choose.main.js

File diff suppressed because one or more lines are too long

16
designer-realize/src/main/java/com/fanruan/boot/env/DesignEnvComponent.java vendored

@ -23,6 +23,7 @@ import com.fanruan.fs.DesignFileRepository;
import com.fanruan.fs.FileServer;
import com.fanruan.fs.RepositoryFactory;
import com.fanruan.fs.repository.local.LocalFileRepository;
import com.fanruan.gui.utils.Reflect;
import com.fanruan.kv.CarinaKV;
import com.fanruan.kv.factory.KVStoreFactory;
import com.fanruan.kv.manager.CarinaKVManager;
@ -60,7 +61,6 @@ import com.fr.event.EventDispatcher;
import com.fr.general.FRLogger;
import com.fr.general.log.Log4jConfig;
import com.fr.general.log.Log4jConfigFactory;
import com.fr.general.log.Log4jUtils;
import com.fr.intelli.metrics.Compute;
import com.fr.intelli.metrics.DBMonitorInterceptor;
import com.fr.intelli.metrics.MonitorInterceptor;
@ -68,7 +68,6 @@ import com.fr.intelli.record.Focus;
import com.fr.intelli.record.FocusInterceptor;
import com.fr.intelli.record.PerformancePoint;
import com.fr.intelli.record.PerformancePointInterceptor;
import com.fr.invoke.Reflect;
import com.fr.io.base.ResourcePaths;
import com.fr.io.repository.ResourceRepository;
import com.fr.io.repository.ResourceRepositoryWrapper;
@ -93,7 +92,6 @@ import com.fr.stable.project.ProjectConstants;
import com.fr.tenant.context.TenantContext;
import com.fr.tenant.context.provider.CurrentTenantKey;
import com.fr.third.apache.logging.log4j.Level;
import com.fr.third.apache.logging.log4j.core.config.Configurator;
import com.fr.third.net.bytebuddy.implementation.MethodDelegation;
import com.fr.third.net.bytebuddy.matcher.ElementMatchers;
import com.fr.third.org.hibernate.jdbc.AbstractWork;
@ -106,7 +104,6 @@ import com.fr.transaction.RemoteTransactor;
import com.fr.transaction.TransactorFactory;
import com.fr.workspace.WorkContext;
import java.net.URI;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
@ -247,16 +244,12 @@ public class DesignEnvComponent {
* ----------- logger --------
*/
private void startLogger() {
// 获取本地的日志级别配置
Level localLogPreferLevel = Log4jConfig.getInstance().getRootLevel();
// 刷新到本地配置
Log4jConfigFactory.getInstance().updateConfigLoggerLevel(localLogPreferLevel.name());
URI uri = Log4jUtils.buildUserConfigURI(StringUtils.EMPTY);
FRLogger.getLogger().config(uri);
Level localLogPreferLevel = Log4jConfig.getInstance().getRootLevel();
Log4jConfigFactory.getInstance().updateMemoryLoggerLevel(localLogPreferLevel.name());
// 刷新到carina的配置,防止 portal service 启动的时候覆盖了
// 配置对象都是默认都文件读取的,设计器本地启动的阶段反射修改一下
Reflect.on(Carina.properties(LoggerProperties.class)).set("level", localLogPreferLevel.name());
// 日志配置更新的监听在FRLogger里面,fbp去掉了但是设计器本地还是需要这个监听的,初始化的时候监听一下
listenConfig();
}
@ -270,8 +263,7 @@ public class DesignEnvComponent {
@Override
public void change() {
// The root logger is the topmost logger with a name of "" (the empty string).
Configurator.setAllLevels("", Log4jConfig.getInstance().getRootLevel());
Log4jConfigFactory.getInstance().updateMemoryLoggerLevel(Log4jConfig.getInstance().getRootLevel().name());
}
});
}

13
designer-realize/src/main/java/com/fr/design/webattr/EventPane.java

@ -49,6 +49,7 @@ public class EventPane extends BasicPane {
private EditAction editAction;
private RemoveAction removeAction;
private String[] eventName;
private UIScrollPane scrollPane;
private int itemHeight = 20;
@ -76,12 +77,22 @@ public class EventPane extends BasicPane {
eventList.setCellRenderer(render);
eventList.addMouseListener(editListener);
eventList.setBackground(FlatUIUtils.getUIColor("fill.normal", Color.WHITE));
JScrollPane scrollPane = new UIScrollPane(eventList);
scrollPane = new UIScrollPane(eventList);
scrollPane.setBorder(new FineRoundBorder());
//让事件设置列表铺满,有特殊设置在外层调用处修改
this.add(column(LayoutConstants.VGAP_SMALL, cell(toolBar), cell(scrollPane).weight(1)).getComponent());
}
/**
* 获取当前面板的滚动面板UIScrollPane
* 用于获取滚动条或进行其他基于滚动面板的操作
*
* @return 当前组件的 UIScrollPane 实例
*/
public UIScrollPane getScrollPane() {
return scrollPane;
}
@Override
public void setEnabled(boolean enabled) {
super.setEnabled(enabled);

18
designer-realize/src/main/java/com/fr/design/webattr/ToolBarDragPane.java

@ -11,6 +11,7 @@ import com.fr.design.constants.LayoutConstants;
import com.fr.design.gui.core.WidgetOption;
import com.fr.design.gui.ibutton.UIButton;
import com.fr.design.gui.icheckbox.UICheckBox;
import com.fr.design.gui.icontainer.UIScrollPane;
import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.mainframe.DesignerContext;
import com.fr.design.utils.gui.GUICoreUtils;
@ -29,7 +30,6 @@ import java.awt.image.ImageObserver;
import javax.swing.Icon;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.SwingUtilities;
@ -61,6 +61,7 @@ public class ToolBarDragPane extends WidgetToolBarPane {
private JTable layoutTable;
private UICheckBox isUseToolBarCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Use_ToolBar")); // 是否使用工具栏
private boolean isEnabled;
private UIScrollPane scrollPane;
/**
* 工具栏Pane
@ -191,15 +192,26 @@ public class ToolBarDragPane extends WidgetToolBarPane {
//工具栏面板center布局:顶部工具栏-上移动按钮-图标面板-下移动按钮-底部工具栏
JPanel movePane = FRGUIPaneFactory.createBorderLayout_S_Pane();
scrollPane = new UIScrollPane(buttonTablePanel);
movePane.add(column(1,
cell(topToolbarPanel),
cell(topButton),
cell(buttonTablePanel),
cell(scrollPane),
cell(downButton),
cell(bottomToolbarPanel)
).getComponent());
//工具栏整体面板
this.add(column(LayoutConstants.VERTICAL_GAP, cell(northPanel), cell(new JScrollPane(movePane))).getComponent());
this.add(column(LayoutConstants.VERTICAL_GAP, cell(northPanel), cell(movePane)).getComponent());
}
/**
* 获取当前面板的滚动面板UIScrollPane
* 用于获取滚动条或进行其他基于滚动面板的操作
*
* @return 当前组件的 UIScrollPane 实例
*/
public UIScrollPane getScrollPane() {
return scrollPane;
}
/**

10
designer-realize/src/main/java/com/fr/design/webattr/WebSettingPane.java

@ -1,6 +1,7 @@
package com.fr.design.webattr;
import com.fine.theme.utils.FineUIScale;
import com.fine.theme.utils.FineUIUtils;
import com.formdev.flatlaf.util.ScaledEmptyBorder;
import com.fr.design.beans.BasicBeanPane;
import com.fr.design.border.FineBorderFactory;
@ -62,6 +63,7 @@ public abstract class WebSettingPane<T extends WebContent> extends BasicBeanPane
//事件设置
JPanel eventPanel = new JPanel(new BorderLayout());
eventPane = new EventPane(getEventNames());
eventPane.setPreferredSize(new Dimension(super.getPreferredSize().width, FineUIScale.scale(180)));
UILabel label = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Event_Set"));
wrapBoldLabelWithUnderline(label);
eventPanel.add(column(LayoutConstants.VGAP_SMALL, cell(label), cell(eventPane)).getComponent());
@ -94,7 +96,13 @@ public abstract class WebSettingPane<T extends WebContent> extends BasicBeanPane
).getComponent());
}
this.setLayout(new BorderLayout());
this.add(new UIScrollPane(panel));
UIScrollPane parentScrollPane = new UIScrollPane(panel);
this.add(parentScrollPane);
// 存在子区域也是滚动面板,需要处理滚动事件传递给父面板
UIScrollPane buttonTablePane = dragToolBarPane.getScrollPane();
buttonTablePane.addMouseWheelListener(e -> FineUIUtils.handleChildScrollEvent(buttonTablePane.getVerticalScrollBar(), parentScrollPane.getVerticalScrollBar(), e.getWheelRotation()));
UIScrollPane eventList = eventPane.getScrollPane();
eventList.addMouseWheelListener(e -> FineUIUtils.handleChildScrollEvent(eventList.getVerticalScrollBar(), parentScrollPane.getVerticalScrollBar(), e.getWheelRotation()));
}
ItemListener itemListener = new ItemListener() {

4
designer-realize/src/main/java/com/fr/start/MainDesigner.java

@ -337,8 +337,8 @@ public class MainDesigner extends BaseDesigner {
}
private UICombinationButton createRunButton() {
run = new UICombinationButton(new UISaveForbiddenButton(Toolkit.i18nText("Fine-Design_Basic_Preview"), new LazyIcon("run").white()),
new UISaveForbiddenButton(new LazyIcon("triangle_down").white()));
run = new UICombinationButton(new UIButton(Toolkit.i18nText("Fine-Design_Basic_Preview"), new LazyIcon("run").white()),
new UIButton(new LazyIcon("triangle_down").white()));
run.addLeftClickLister(mouseEvent -> {
JTemplate<?, ?> jt = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate();
if (jt == null || jt.isSaving()) {

Loading…
Cancel
Save