Browse Source
# Conflicts: # designer-base/src/main/java/com/fr/design/update/push/DesignerPushUpdateConfigManager.javafinal/11.0
Destiny.Lin
11 months ago
98 changed files with 5478 additions and 266 deletions
@ -0,0 +1,159 @@
|
||||
package com.fr.design; |
||||
|
||||
import com.fr.design.dialog.FineJOptionPane; |
||||
import com.fr.design.i18n.Toolkit; |
||||
import com.fr.design.mainframe.DesignerContext; |
||||
import com.fr.design.ui.util.UIUtil; |
||||
import com.fr.event.Event; |
||||
import com.fr.event.EventDispatcher; |
||||
import com.fr.event.Listener; |
||||
import com.fr.log.FineLoggerFactory; |
||||
import com.fr.stable.StableUtils; |
||||
import com.fr.third.org.apache.http.client.config.RequestConfig; |
||||
import com.fr.third.org.apache.http.client.methods.CloseableHttpResponse; |
||||
import com.fr.third.org.apache.http.client.methods.HttpGet; |
||||
import com.fr.third.org.apache.http.impl.client.CloseableHttpClient; |
||||
import com.fr.third.org.apache.http.impl.client.HttpClients; |
||||
import com.fr.workspace.WorkContext; |
||||
import com.fr.workspace.Workspace; |
||||
import com.fr.workspace.WorkspaceEvent; |
||||
import com.fr.workspace.base.WorkspaceConstants; |
||||
import com.fr.workspace.connect.WorkspaceConnectionInfo; |
||||
import com.fr.workspace.engine.channel.WorkspaceChannelFactory; |
||||
import com.fr.workspace.engine.exception.WorkspaceConnectionException; |
||||
|
||||
import javax.swing.JOptionPane; |
||||
import javax.swing.UIManager; |
||||
|
||||
/** |
||||
* RPC连接处理中心 |
||||
* |
||||
* @author Roger |
||||
* @since 11.0 |
||||
* Created on 2023/12/13 |
||||
*/ |
||||
public class RPCConnectHandlerCenter { |
||||
|
||||
private static volatile boolean alerting = false; |
||||
private static final int TIMEOUT = 5000; |
||||
|
||||
private static Listener<Workspace> listener = new Listener<Workspace>() { |
||||
@Override |
||||
public void on(Event event, Workspace workspace) { |
||||
//暂时先不做重连处理,3次RPC连接失败后提示切换工作目录
|
||||
showRPCDisconnectDialog(); |
||||
} |
||||
}; |
||||
|
||||
/** |
||||
* 开启事件监听 |
||||
*/ |
||||
public static void startListener() { |
||||
if (!WorkContext.getCurrent().isLocal()) { |
||||
EventDispatcher.listen(WorkspaceEvent.LostConnect, listener); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 弹窗提示连接断开 |
||||
*/ |
||||
public static void showRPCDisconnectDialog() { |
||||
UIUtil.invokeLaterIfNeeded(RPCConnectHandlerCenter::showDialog); |
||||
} |
||||
|
||||
/** |
||||
* RPC连接测试 |
||||
* |
||||
* @param info 连接信息 |
||||
* @return 是否连接成功 |
||||
*/ |
||||
public static boolean checkRPCConnect(WorkspaceConnectionInfo info) { |
||||
try { |
||||
return WorkspaceChannelFactory.testConnection(info); |
||||
} catch (Exception e) { |
||||
FineLoggerFactory.getLogger().error(e, e.getMessage()); |
||||
return false; |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* http连接检测,从DesignerSocketIO中移过来的,先保留着 |
||||
* |
||||
* @param info 连接信息 |
||||
* @return 是否连接成功 |
||||
*/ |
||||
public static boolean checkHttpConnect(WorkspaceConnectionInfo info) { |
||||
CloseableHttpClient httpclient = HttpClients.createDefault(); |
||||
HttpGet httpGet = new HttpGet(StableUtils.pathJoin(info.getUrl(), WorkspaceConstants.CONTROLLER_PREFIX, WorkspaceConstants.VT)); |
||||
RequestConfig requestConfig = RequestConfig |
||||
.custom() |
||||
.setConnectTimeout(TIMEOUT) |
||||
.setConnectionRequestTimeout(TIMEOUT) |
||||
.build(); |
||||
httpGet.setConfig(requestConfig); |
||||
try { |
||||
CloseableHttpResponse response = httpclient.execute(httpGet); |
||||
if (isErrorStatus(response.getStatusLine().getStatusCode())) { |
||||
//这边nginx做负载,服务器被kill掉,返回的是502,不会抛错,导致checkRPCConnect通过
|
||||
//针对500-600的错误码加个判断,其他类型的状态码暂不考虑,如果有遇到再处理,不然怕影响范围大
|
||||
throw new WorkspaceConnectionException("Response " + response.getStatusLine().toString()); |
||||
} |
||||
} catch (Exception e) { |
||||
FineLoggerFactory.getLogger().error(e, e.getMessage()); |
||||
return false; |
||||
} |
||||
return true; |
||||
} |
||||
|
||||
/** |
||||
* 提示连接已经断开,如果已经在提示中了就直接返回 |
||||
*/ |
||||
private static void showDialog() { |
||||
if (alerting) { |
||||
return; |
||||
} |
||||
synchronized (RPCConnectHandlerCenter.class) { |
||||
if (alerting) { |
||||
return; |
||||
} |
||||
alerting = true; |
||||
try { |
||||
FineJOptionPane.showMessageDialog( |
||||
DesignerContext.getDesignerFrame(), |
||||
Toolkit.i18nText("Fine-Design_Basic_Remote_Disconnected"), |
||||
UIManager.getString("OptionPane.messageDialogTitle"), |
||||
JOptionPane.ERROR_MESSAGE, |
||||
UIManager.getIcon("OptionPane.errorIcon")); |
||||
EnvChangeEntrance.getInstance().chooseEnv(); |
||||
} finally { |
||||
alerting = false; |
||||
} |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 错误状态码 |
||||
* 5xx(服务器错误)这些状态代码表示服务器在尝试处理请求时发生内部错误。 这些错误可能是服务器本身的错误,而不是请求出错。代码 说明 |
||||
* 500 (服务器内部错误) 服务器遇到错误,无法完成请求。 |
||||
* 501 (尚未实施) 服务器不具备完成请求的功能。 例如,服务器无法识别请求方法时可能会返回此代码。 |
||||
* 502 (错误网关) 服务器作为网关或代理,从上游服务器收到无效响应。 |
||||
* 503 (服务不可用) 服务器目前无法使用(由于超载或停机维护)。 通常,这只是暂时状态。 |
||||
* 504 (网关超时) 服务器作为网关或代理,但是没有及时从上游服务器收到请求。 |
||||
* 505 (HTTP 版本不受支持) 服务器不支持请求中所用的 HTTP 协议版本。 |
||||
* |
||||
* @param status 错误状态码 |
||||
* @return 是否是错误状态码 |
||||
*/ |
||||
private static boolean isErrorStatus(int status) { |
||||
return status >= 500 && status <= 600; |
||||
} |
||||
|
||||
/** |
||||
* 停止事件监听 |
||||
*/ |
||||
public static void stopListener() { |
||||
if (!WorkContext.getCurrent().isLocal()) { |
||||
EventDispatcher.stopListen(listener); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,64 @@
|
||||
package com.fr.design.lock; |
||||
|
||||
import com.fr.design.file.HistoryTemplateListCache; |
||||
import com.fr.design.file.TemplateTreePane; |
||||
import com.fr.design.i18n.Toolkit; |
||||
import com.fr.design.mainframe.JTemplate; |
||||
import com.fr.design.utils.TemplateUtils; |
||||
import com.fr.file.FileNodeFILE; |
||||
import com.fr.file.filetree.FileNode; |
||||
import com.fr.stable.StableUtils; |
||||
import com.fr.stable.project.ProjectConstants; |
||||
|
||||
/** |
||||
* 被锁住的文件重新保存副本时的处理枚举类 |
||||
* |
||||
* @author Roger |
||||
* @since 11.0 |
||||
* Created on 2023/12/21 |
||||
*/ |
||||
public enum LockFileReSaveEnum { |
||||
|
||||
/** |
||||
* 保存目录树里面的模板副本 |
||||
*/ |
||||
TEMPLATE_TREE() { |
||||
@Override |
||||
public void action() { |
||||
FileNode node = TemplateTreePane.getInstance().getFileNode(); |
||||
if (node == null) { |
||||
return; |
||||
} |
||||
final String selectedFilePath = StableUtils.pathJoin(ProjectConstants.REPORTLETS_NAME, TemplateTreePane.getInstance().getFilePath()); |
||||
TemplateUtils.createAndReOpenTemplate( |
||||
Toolkit.i18nText("Fine_Design_Template_Lock_Copy"), |
||||
new FileNodeFILE(new FileNode(selectedFilePath, false)), |
||||
false, |
||||
true); |
||||
} |
||||
}, |
||||
|
||||
/** |
||||
* 保存设计器里面已经打开的模板副本 |
||||
*/ |
||||
HISTORY_TEMPLATE_CACHE() { |
||||
@Override |
||||
public void action() { |
||||
JTemplate<?, ?> template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); |
||||
if (JTemplate.isValid(template)) { |
||||
TemplateUtils.createAndOpenTemplate( |
||||
Toolkit.i18nText("Fine_Design_Template_Backup"), |
||||
new FileNodeFILE(new FileNode(template.getPath(), false)), |
||||
true, |
||||
true, |
||||
//另存之后需要关闭的模板
|
||||
template); |
||||
} |
||||
} |
||||
}; |
||||
|
||||
/** |
||||
* 如何保存模板副本 |
||||
*/ |
||||
public abstract void action(); |
||||
} |
@ -0,0 +1,56 @@
|
||||
package com.fr.design.lock; |
||||
|
||||
import com.fr.design.file.HistoryTemplateListCache; |
||||
import com.fr.design.mainframe.JTemplate; |
||||
import com.fr.event.Event; |
||||
import com.fr.event.EventDispatcher; |
||||
import com.fr.event.Listener; |
||||
import com.fr.log.FineLoggerFactory; |
||||
import com.fr.report.lock.LockInfoOperator; |
||||
import com.fr.stable.collections.CollectionUtils; |
||||
import com.fr.workspace.WorkContext; |
||||
import com.fr.workspace.Workspace; |
||||
import com.fr.workspace.WorkspaceEvent; |
||||
|
||||
import java.util.List; |
||||
|
||||
/** |
||||
* 更新模板锁信息 |
||||
* |
||||
* @author Roger |
||||
* @since 11.0 |
||||
* Created on 2023/12/11 |
||||
*/ |
||||
public class TemplateLockInfoReSave { |
||||
|
||||
private static Listener<Workspace> listener = new Listener<Workspace>() { |
||||
@Override |
||||
public void on(Event event, Workspace workspace) { |
||||
List<JTemplate<?, ?>> templates = HistoryTemplateListCache.getInstance().getHistoryList(); |
||||
if (CollectionUtils.isEmpty(templates)) { |
||||
return; |
||||
} |
||||
String[] paths = templates.stream().map(JTemplate::getPath).toArray(String[]::new); |
||||
String[] lockedPath = WorkContext.getCurrent().get(LockInfoOperator.class).lockTemplates(paths); |
||||
FineLoggerFactory.getLogger().warn("template lock failed:{}", String.join(";", lockedPath)); |
||||
} |
||||
}; |
||||
|
||||
/** |
||||
* 启动监听 |
||||
*/ |
||||
public static void startListener() { |
||||
if (!WorkContext.getCurrent().isLocal()) { |
||||
EventDispatcher.listen(WorkspaceEvent.ConnectSuccess, listener); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 停止事件监听 |
||||
*/ |
||||
public static void stopListener() { |
||||
if (!WorkContext.getCurrent().isLocal()) { |
||||
EventDispatcher.stopListen(listener); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,102 @@
|
||||
package com.fr.widgettheme; |
||||
|
||||
import com.fr.base.theme.TemplateTheme; |
||||
import com.fr.design.beans.BasicBeanPane; |
||||
import com.fr.design.constants.LayoutConstants; |
||||
import com.fr.design.file.HistoryTemplateListCache; |
||||
import com.fr.design.gui.ibutton.UIButtonGroup; |
||||
import com.fr.design.i18n.Toolkit; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.design.mainframe.JTemplate; |
||||
import com.fr.design.mainframe.widget.accessibles.AccessibleBackgroundEditor; |
||||
import com.fr.form.ui.container.WParameterLayout; |
||||
import com.fr.general.Background; |
||||
import org.jetbrains.annotations.Nullable; |
||||
|
||||
import javax.swing.JPanel; |
||||
import java.awt.BorderLayout; |
||||
|
||||
/** |
||||
* 设计器参数面板的“高级”设置增加背景的主题样式设置 |
||||
* |
||||
* @author Bruce.Deng |
||||
* @since 11.0 |
||||
* Created on 2023/2/20 |
||||
*/ |
||||
public class ParameterBackgroundStyleSettingPane extends BasicBeanPane<WParameterLayout> { |
||||
|
||||
public static final String[] FOLLOWING_THEME_STRING_ARRAYS = new String[]{ |
||||
Toolkit.i18nText("Fine-Design_Widget_Follow_Theme"), |
||||
Toolkit.i18nText("Fine-Design_Widget_Theme_Custom") |
||||
}; |
||||
|
||||
private UIButtonGroup head; |
||||
private JPanel customPane; |
||||
private AccessibleBackgroundEditor background; |
||||
|
||||
public ParameterBackgroundStyleSettingPane() { |
||||
this.setLayout(new BorderLayout(0, LayoutConstants.VGAP_SMALL)); |
||||
head = new UIButtonGroup(FOLLOWING_THEME_STRING_ARRAYS) { |
||||
@Override |
||||
public void setSelectedIndex(int newSelectedIndex, boolean fireChanged) { |
||||
//表示从跟随主题切换到自定义
|
||||
if (selectedIndex != newSelectedIndex && newSelectedIndex == 1) { |
||||
background.setValue(getThemeBackground()); |
||||
} |
||||
super.setSelectedIndex(newSelectedIndex, fireChanged); |
||||
} |
||||
}; |
||||
customPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||
background = new AccessibleBackgroundEditor(); |
||||
customPane.add(background); |
||||
this.add(head, BorderLayout.NORTH); |
||||
this.add(customPane, BorderLayout.CENTER); |
||||
} |
||||
|
||||
private void attributeChange() { |
||||
customPane.setVisible(head.getSelectedIndex() == 1); |
||||
} |
||||
|
||||
@Override |
||||
public void populateBean(WParameterLayout wParameterLayout) { |
||||
if (wParameterLayout.isBackgroundFollowTheme()) { |
||||
head.setSelectedIndex(0); |
||||
} else { |
||||
head.setSelectedIndex(1); |
||||
background.setValue(wParameterLayout.getBackground()); |
||||
} |
||||
attributeChange(); |
||||
} |
||||
|
||||
@Override |
||||
@Nullable |
||||
public WParameterLayout updateBean() { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public void updateBean(WParameterLayout wParameterLayout) { |
||||
attributeChange(); |
||||
if (head.getSelectedIndex() != 1) { |
||||
wParameterLayout.setBackgroundFollowTheme(true); |
||||
wParameterLayout.setBackground(getThemeBackground()); |
||||
} else { |
||||
wParameterLayout.setBackgroundFollowTheme(false); |
||||
wParameterLayout.setBackground((Background) background.getValue()); |
||||
} |
||||
} |
||||
|
||||
private Background getThemeBackground() { |
||||
JTemplate<?, ?> template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); |
||||
if (JTemplate.isValid(template)) { |
||||
TemplateTheme theme = template.getTemplateTheme(); |
||||
return theme.getParamContainerStyle().getBackground(); |
||||
} |
||||
return (Background) background.getValue(); |
||||
} |
||||
|
||||
@Override |
||||
protected String title4PopupWindow() { |
||||
return Toolkit.i18nText("Fine-Design_Widget_Theme_ParamContainer_Background"); |
||||
} |
||||
} |
@ -0,0 +1,50 @@
|
||||
package com.fr.widgettheme.designer; |
||||
|
||||
import com.fr.base.io.BaseBook; |
||||
import com.fr.base.svg.IconUtils; |
||||
import com.fr.design.actions.JTemplateAction; |
||||
import com.fr.widgettheme.util.WidgetThemeDesignerUtils; |
||||
import com.fr.design.dialog.DialogActionAdapter; |
||||
import com.fr.design.file.HistoryTemplateListCache; |
||||
import com.fr.design.i18n.Toolkit; |
||||
import com.fr.design.mainframe.DesignerContext; |
||||
import com.fr.design.mainframe.JTemplate; |
||||
import com.fr.widgettheme.control.attr.WidgetDisplayEnhanceMarkAttr; |
||||
|
||||
import java.awt.event.ActionEvent; |
||||
|
||||
/** |
||||
* 控件主题显示增强菜单action |
||||
* |
||||
* @author Bruce.Deng |
||||
* @since 11.0 |
||||
* Created on 2022/11/28 |
||||
*/ |
||||
public class WidgetThemeDisplayAction<T extends JTemplate<?, ?>> extends JTemplateAction<T> { |
||||
|
||||
public WidgetThemeDisplayAction(T jwb) { |
||||
super(jwb); |
||||
setName(Toolkit.i18nText("Fine-Design_Widget_Display_Enhance")); |
||||
this.setSmallIcon(IconUtils.readIcon("/com/fr/widgettheme/menu.svg")); |
||||
} |
||||
|
||||
@Override |
||||
public void actionPerformed(ActionEvent e) { |
||||
final T jTemplate = getEditingComponent(); |
||||
if (!JTemplate.isValid(jTemplate)) { |
||||
return; |
||||
} |
||||
BaseBook baseBook = jTemplate.getTarget(); |
||||
WidgetDisplayEnhanceMarkAttr attr = WidgetThemeDesignerUtils.getStrongestControlAttrFromTemplate(baseBook); |
||||
final WidgetThemeDisplayConfigPane configPane = new WidgetThemeDisplayConfigPane(); |
||||
configPane.populate(attr); |
||||
configPane.showSmallWindow(DesignerContext.getDesignerFrame(), new DialogActionAdapter() { |
||||
@Override |
||||
public void doOk() { |
||||
baseBook.addAttrMark(configPane.update()); |
||||
jTemplate.fireTargetModified(); |
||||
HistoryTemplateListCache.getInstance().getCurrentEditingTemplate().activeOldJTemplate(); |
||||
} |
||||
}).setVisible(true); |
||||
} |
||||
} |
@ -0,0 +1,81 @@
|
||||
package com.fr.widgettheme.designer; |
||||
|
||||
import com.fr.design.dialog.BasicPane; |
||||
import com.fr.design.gui.icheckbox.UICheckBox; |
||||
import com.fr.design.gui.ilable.UILabel; |
||||
import com.fr.design.i18n.Toolkit; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.design.layout.VerticalFlowLayout; |
||||
import com.fr.widgettheme.control.attr.WidgetDisplayEnhanceMarkAttr; |
||||
|
||||
import javax.swing.JPanel; |
||||
import java.awt.Color; |
||||
|
||||
/** |
||||
* 控件主题显示增强配置窗口 |
||||
* |
||||
* @author Bruce.Deng |
||||
* @since 11.0 |
||||
* Created on 2022/11/28 |
||||
*/ |
||||
public class WidgetThemeDisplayConfigPane extends BasicPane { |
||||
|
||||
private UICheckBox widgetEnhance; |
||||
|
||||
public WidgetThemeDisplayConfigPane() { |
||||
initComponents(); |
||||
} |
||||
|
||||
private void initComponents() { |
||||
VerticalFlowLayout layout = new VerticalFlowLayout(); |
||||
layout.setAlignLeft(true); |
||||
this.setLayout(layout); |
||||
JPanel northPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||
this.add(northPane); |
||||
widgetEnhance = new UICheckBox(Toolkit.i18nText("Fine-Design_Widget_Enable_Display_Enhance")); |
||||
widgetEnhance.setSelected(true); |
||||
northPane.add(widgetEnhance); |
||||
|
||||
JPanel southPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||
this.add(southPane); |
||||
UILabel label = new UILabel(Toolkit.i18nText("Fine-Design_Widget_Display_Enhance_Tip")); |
||||
label.setForeground(Color.GRAY); |
||||
southPane.add(label); |
||||
} |
||||
|
||||
@Override |
||||
protected String title4PopupWindow() { |
||||
return Toolkit.i18nText("Fine-Design_Widget_Display_Enhance"); |
||||
} |
||||
|
||||
/** |
||||
* 根据属性填充pane选项 |
||||
* |
||||
* @param widgetDisplayEnhanceMarkAttr 控件显示增强属性 |
||||
*/ |
||||
public void populate(WidgetDisplayEnhanceMarkAttr widgetDisplayEnhanceMarkAttr) { |
||||
if (widgetDisplayEnhanceMarkAttr == null) { |
||||
widgetDisplayEnhanceMarkAttr = new WidgetDisplayEnhanceMarkAttr(); |
||||
} |
||||
widgetEnhance.setSelected(widgetDisplayEnhanceMarkAttr.isWidgetEnhance()); |
||||
} |
||||
|
||||
/** |
||||
* 更新 |
||||
*/ |
||||
public WidgetDisplayEnhanceMarkAttr update() { |
||||
WidgetDisplayEnhanceMarkAttr attr = new WidgetDisplayEnhanceMarkAttr(); |
||||
attr.setWidgetEnhance(widgetEnhance.isSelected()); |
||||
if (widgetEnhance.isSelected()) { |
||||
collectWidgetDisplayEnhanceRecord(); |
||||
} |
||||
return attr; |
||||
} |
||||
|
||||
/** |
||||
* 记录埋点信息,具体实现在云端运维插件,这里只作为切入点 |
||||
*/ |
||||
private void collectWidgetDisplayEnhanceRecord() { |
||||
//记录埋点
|
||||
} |
||||
} |
@ -0,0 +1,88 @@
|
||||
package com.fr.widgettheme.theme.edit; |
||||
|
||||
import com.fr.design.ExtraDesignClassManager; |
||||
import com.fr.design.event.UIObserverListener; |
||||
import com.fr.design.fun.BackgroundQuickUIProvider; |
||||
import com.fr.design.gui.style.BackgroundPane; |
||||
import com.fr.design.mainframe.backgroundpane.BackgroundQuickPane; |
||||
import com.fr.design.mainframe.backgroundpane.ColorBackgroundQuickPane; |
||||
import com.fr.design.mainframe.backgroundpane.GradientBackgroundQuickPane; |
||||
import com.fr.design.mainframe.backgroundpane.ImageBackgroundQuickPane; |
||||
import com.fr.design.mainframe.backgroundpane.NullBackgroundQuickPane; |
||||
import com.fr.design.mainframe.backgroundpane.PatternBackgroundQuickPane; |
||||
import com.fr.design.mainframe.backgroundpane.TextureBackgroundQuickPane; |
||||
|
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
import java.util.Set; |
||||
|
||||
/** |
||||
* 参数面板背景编辑窗口 |
||||
* |
||||
* @author Bruce.Deng |
||||
* @since 11.0 |
||||
* Created on 2023/1/5 |
||||
*/ |
||||
public class ParamContainerBackgroundPane extends BackgroundPane { |
||||
|
||||
private NullBackgroundQuickPane nullBackgroundPane; |
||||
private ColorBackgroundQuickPane colorBackgroundPane; |
||||
private ImageBackgroundQuickPane imageBackgroundPane; |
||||
private GradientBackgroundQuickPane gradientBackgroundPane; |
||||
private TextureBackgroundQuickPane textureBackgroundPane; |
||||
private PatternBackgroundQuickPane patternBackgroundPane; |
||||
|
||||
public ParamContainerBackgroundPane() { |
||||
super(); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
protected BackgroundQuickPane[] supportKindsOfBackgroundUI() { |
||||
nullBackgroundPane = new NullBackgroundQuickPane(); |
||||
|
||||
colorBackgroundPane = new ColorBackgroundQuickPane(true); |
||||
colorBackgroundPane.registerChangeListener(this::fireStateChanged); |
||||
|
||||
imageBackgroundPane = new ImageBackgroundQuickPane(); |
||||
imageBackgroundPane.registerChangeListener(this::fireStateChanged); |
||||
|
||||
gradientBackgroundPane = createGradientBackgroundQuickPane(); |
||||
gradientBackgroundPane.registerChangeListener(this::fireStateChanged); |
||||
|
||||
textureBackgroundPane = new TextureBackgroundQuickPane(); |
||||
textureBackgroundPane.registerChangeListener(this::fireStateChanged); |
||||
|
||||
patternBackgroundPane = new PatternBackgroundQuickPane(); |
||||
patternBackgroundPane.registerChangeListener(this::fireStateChanged); |
||||
|
||||
|
||||
return createBackgroundQuickPanes(); |
||||
} |
||||
|
||||
private BackgroundQuickPane[] createBackgroundQuickPanes() { |
||||
List<BackgroundQuickPane> kinds = new ArrayList<>(); |
||||
|
||||
kinds.add(nullBackgroundPane); |
||||
kinds.add(colorBackgroundPane); |
||||
kinds.add(imageBackgroundPane); |
||||
kinds.add(gradientBackgroundPane); |
||||
kinds.add(textureBackgroundPane); |
||||
kinds.add(patternBackgroundPane); |
||||
|
||||
Set<BackgroundQuickUIProvider> providers = ExtraDesignClassManager.getInstance().getArray(BackgroundQuickUIProvider.MARK_STRING); |
||||
for (BackgroundQuickUIProvider provider : providers) { |
||||
BackgroundQuickPane newTypePane = provider.appearanceForBackground(); |
||||
newTypePane.registerChangeListener(this::fireStateChanged); |
||||
kinds.add(newTypePane); |
||||
} |
||||
|
||||
return kinds.toArray(new BackgroundQuickPane[kinds.size()]); |
||||
} |
||||
|
||||
|
||||
protected GradientBackgroundQuickPane createGradientBackgroundQuickPane() { |
||||
// 使用默认的150宽度构建渐变条
|
||||
return new GradientBackgroundQuickPane(); |
||||
} |
||||
} |
@ -0,0 +1,84 @@
|
||||
package com.fr.widgettheme.theme.edit; |
||||
|
||||
import com.fr.base.theme.TemplateTheme; |
||||
import com.fr.base.theme.settings.AbstractThemedParamContainerStyle; |
||||
import com.fr.base.theme.settings.DefaultThemedParamContainerStyle; |
||||
import com.fr.widgettheme.theme.widget.style.ThemedParamContainerStyle; |
||||
import com.fr.design.beans.BasicBeanPane; |
||||
import com.fr.design.designer.IntervalConstants; |
||||
import com.fr.design.gui.ilable.UILabel; |
||||
import com.fr.design.i18n.Toolkit; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.design.layout.TableLayout; |
||||
import com.fr.design.layout.TableLayoutHelper; |
||||
|
||||
import javax.swing.BorderFactory; |
||||
import javax.swing.JPanel; |
||||
import java.awt.BorderLayout; |
||||
import java.awt.Component; |
||||
|
||||
/** |
||||
* 参数面板样式编辑pane |
||||
* |
||||
* @author Bruce.Deng |
||||
* @since 11.0 |
||||
* Created on 2022/12/16 |
||||
*/ |
||||
public class ParamContainerStyleEditPane<T extends TemplateTheme> extends BasicBeanPane<T> { |
||||
public static final int LABEL_WIDTH = 60; |
||||
public static final int SETTING_WIDTH = 193; |
||||
|
||||
private final ParamContainerBackgroundPane backgroundPane; |
||||
|
||||
public ParamContainerStyleEditPane() { |
||||
backgroundPane = new ParamContainerBackgroundPane(); |
||||
|
||||
double p = TableLayout.PREFERRED; |
||||
|
||||
JPanel uiLabelPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||
uiLabelPane.add(new UILabel(Toolkit.i18nText("Fine-Design_Widget_Theme_Background")), BorderLayout.NORTH); |
||||
uiLabelPane.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0)); |
||||
JPanel backgroundLabeledPane = TableLayoutHelper.createCommonTableLayoutPane( |
||||
new Component[][]{ new Component[] { uiLabelPane, backgroundPane } }, |
||||
new double[] { p }, new double[] { LABEL_WIDTH, SETTING_WIDTH}, IntervalConstants.INTERVAL_L1 |
||||
); |
||||
backgroundLabeledPane.setBorder(BorderFactory.createEmptyBorder( |
||||
IntervalConstants.INTERVAL_L1, |
||||
IntervalConstants.INTERVAL_L1, |
||||
IntervalConstants.INTERVAL_L1, |
||||
IntervalConstants.INTERVAL_L1 |
||||
)); |
||||
this.add(backgroundLabeledPane); |
||||
setBorder(BorderFactory.createEmptyBorder()); |
||||
} |
||||
|
||||
@Override |
||||
public void populateBean(T t) { |
||||
AbstractThemedParamContainerStyle paramContainerStyle = t.getParamContainerStyle(); |
||||
if (paramContainerStyle == null || paramContainerStyle instanceof DefaultThemedParamContainerStyle) { |
||||
paramContainerStyle = new ThemedParamContainerStyle(); |
||||
t.setParamContainerStyle(paramContainerStyle); |
||||
} |
||||
backgroundPane.populateBean(paramContainerStyle.getBackground()); |
||||
} |
||||
|
||||
@Override |
||||
public T updateBean() { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public void updateBean(T t) { |
||||
ThemedParamContainerStyle style = (ThemedParamContainerStyle) t.getParamContainerStyle(); |
||||
if (style == null) { |
||||
style = new ThemedParamContainerStyle(); |
||||
t.setParamContainerStyle(style); |
||||
} |
||||
style.setBackground(backgroundPane.update()); |
||||
} |
||||
|
||||
@Override |
||||
protected String title4PopupWindow() { |
||||
return Toolkit.i18nText("Fine-Design_Widget_Theme_ParamContainer"); |
||||
} |
||||
} |
@ -0,0 +1,121 @@
|
||||
package com.fr.widgettheme.theme.edit.widget; |
||||
|
||||
import com.fr.base.background.ColorBackground; |
||||
import com.fr.base.theme.TemplateTheme; |
||||
import com.fr.design.style.color.NewColorSelectBox; |
||||
import com.fr.widgettheme.theme.widget.style.BorderStyle; |
||||
import com.fr.widgettheme.theme.widget.style.ButtonBackgroundStyle; |
||||
import com.fr.widgettheme.theme.widget.style.ThemeTextStyle; |
||||
import com.fr.widgettheme.theme.widget.style.ThemedWidgetStyle; |
||||
import com.fr.design.gui.ibutton.UIRadioButton; |
||||
import com.fr.design.gui.ilable.UILabel; |
||||
import com.fr.design.i18n.Toolkit; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.widgettheme.theme.widget.theme.WidgetThemeDisplayConstants; |
||||
import com.fr.widgettheme.util.ThemeTextStylePaneCreator; |
||||
|
||||
import javax.swing.ButtonGroup; |
||||
import javax.swing.JPanel; |
||||
import java.awt.Component; |
||||
|
||||
|
||||
/** |
||||
* 桌面端主题面板 |
||||
* |
||||
* @author Coral.Chen |
||||
* @since 11.0 |
||||
* Created on 2023/3/28 |
||||
*/ |
||||
public class DesktopWidgetStyleEditPane<T extends TemplateTheme> extends WidgetStyleEditPane<T> { |
||||
// 风格1
|
||||
protected UIRadioButton style1; |
||||
// 风格2
|
||||
protected UIRadioButton style2; |
||||
|
||||
/** |
||||
* 下拉面板背景颜色 |
||||
*/ |
||||
private NewColorSelectBox selectBackgroundColorBox; |
||||
public DesktopWidgetStyleEditPane() { |
||||
super(); |
||||
} |
||||
|
||||
@Override |
||||
public Component[][] generateComponent() { |
||||
initStyleEditor(); |
||||
initSelectBackgroundColorBox(); |
||||
// 容纳风格1和风格2的panel
|
||||
JPanel stylePane = new JPanel(FRGUIPaneFactory.createBoxFlowLayout()); |
||||
stylePane.add(style1); |
||||
stylePane.add(style2); |
||||
|
||||
return new Component[][]{ |
||||
new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Widget_Theme_Color")), colorSelectBox}, |
||||
new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Widget_Theme_Style")), stylePane}, |
||||
new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Widget_Theme_Border_Line")), lineComboBox}, |
||||
new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Widget_Theme_Border_Radius")), borderRadiusSpinner}, |
||||
new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Widget_Theme_Text_Style")), ThemeTextStylePaneCreator.create(fontSizePane, fontColorButton)}, |
||||
new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Widget_Background_Select_Box")), selectBackgroundColorBox} |
||||
}; |
||||
} |
||||
|
||||
|
||||
private void initStyleEditor() { |
||||
style1 = new UIRadioButton(Toolkit.i18nText("Fine-Design_Widget_Theme_Style_1")); |
||||
style2 = new UIRadioButton(Toolkit.i18nText("Fine-Design_Widget_Theme_Style_2")); |
||||
ButtonGroup buttonGroup = new ButtonGroup(); |
||||
buttonGroup.add(style1); |
||||
buttonGroup.add(style2); |
||||
} |
||||
|
||||
private void initSelectBackgroundColorBox() { |
||||
selectBackgroundColorBox = new NewColorSelectBox(140, true); |
||||
selectBackgroundColorBox.setSelectObject(WidgetThemeDisplayConstants.DEFAULT_THEME_COLOR); |
||||
} |
||||
|
||||
@Override |
||||
public void populateBean(T t) { |
||||
ThemedWidgetStyle style = (ThemedWidgetStyle) t.getWidgetStyle(); |
||||
if (style == null) { |
||||
style = new ThemedWidgetStyle(); |
||||
t.setWidgetStyle(style); |
||||
} |
||||
if (style.getStyleType() == 1) { |
||||
style1.setSelected(true); |
||||
} else { |
||||
style2.setSelected(true); |
||||
} |
||||
colorSelectBox.setSelectObject(style.getThemeColor()); |
||||
lineComboBox.setSelectedLineStyle(style.getBorderStyle().getLineType()); |
||||
borderRadiusSpinner.setValue(style.getBorderStyle().getRadius()); |
||||
fontSizePane.setValue(style.getTextStyle().getFontSize()); |
||||
fontColorButton.setColor(style.getTextStyle().getFontColor()); |
||||
selectBackgroundColorBox.setSelectObject(style.getSelectBackgroundColor()); |
||||
} |
||||
|
||||
@Override |
||||
public void updateBean(T t) { |
||||
ThemedWidgetStyle style = (ThemedWidgetStyle) t.getWidgetStyle(); |
||||
if (style == null) { |
||||
style = new ThemedWidgetStyle(); |
||||
t.setWidgetStyle(style); |
||||
} |
||||
style.setThemeColor(colorSelectBox.getSelectObject()); |
||||
BorderStyle borderStyle = new BorderStyle(); |
||||
borderStyle.setLineType(lineComboBox.getSelectedLineStyle()); |
||||
borderStyle.setRadius((int) borderRadiusSpinner.getValue()); |
||||
style.setBorderStyle(borderStyle); |
||||
ThemeTextStyle textStyle = new ThemeTextStyle(); |
||||
textStyle.setFontSize(fontSizePane.getValue()); |
||||
textStyle.setFontColor(fontColorButton.getColor()); |
||||
style.setTextStyle(textStyle); |
||||
ButtonBackgroundStyle buttonBackgroundStyle = new ButtonBackgroundStyle(); |
||||
ColorBackground buttonBackground = ColorBackground.getInstance(style.getThemeColor()); |
||||
buttonBackgroundStyle.setInitialBackground(buttonBackground); |
||||
buttonBackgroundStyle.setOverBackground(buttonBackground); |
||||
buttonBackgroundStyle.setClickBackground(buttonBackground); |
||||
style.setButtonBackgroundStyle(buttonBackgroundStyle); |
||||
style.setStyleType(style1.isSelected() ? 1 : 2); |
||||
style.setSelectBackgroundColor(selectBackgroundColorBox.getSelectObject()); |
||||
} |
||||
} |
@ -0,0 +1,78 @@
|
||||
package com.fr.widgettheme.theme.edit.widget; |
||||
|
||||
import com.fr.base.theme.TemplateTheme; |
||||
import com.fr.design.gui.frpane.FontSizeComboPane; |
||||
import com.fr.widgettheme.theme.widget.style.BorderStyle; |
||||
import com.fr.widgettheme.theme.widget.style.MobileThemedWidgetStyle; |
||||
import com.fr.design.gui.icombobox.LineComboBox; |
||||
import com.fr.widgettheme.theme.widget.style.ThemeTextStyle; |
||||
import com.fr.widgettheme.theme.widget.theme.WidgetThemeDisplayConstants; |
||||
|
||||
import java.util.Arrays; |
||||
import java.util.Vector; |
||||
|
||||
/** |
||||
* 移动端控件样式编辑面板 |
||||
* |
||||
* @author Coral.Chen |
||||
* @since 11.0 |
||||
* Created on 2023/3/28 |
||||
*/ |
||||
public class MobileWidgetStyleEditPane<T extends TemplateTheme> extends WidgetStyleEditPane<T> { |
||||
/** |
||||
* 移动端字体列表 12-18 |
||||
*/ |
||||
private static Vector<Integer> FONT_SIZES = new Vector<Integer>() { |
||||
{ |
||||
addAll(Arrays.asList(12, 13, 14, 15, 16, 17, 18)); |
||||
} |
||||
}; |
||||
|
||||
public MobileWidgetStyleEditPane() { |
||||
super(); |
||||
} |
||||
|
||||
@Override |
||||
public void initLineBox() { |
||||
lineComboBox = new LineComboBox(WidgetThemeDisplayConstants.MOBILE_BORDER_LINE_STYLE_ARRAY); |
||||
lineComboBox.setSelectedLineStyle(com.fr.stable.Constants.LINE_THIN); |
||||
} |
||||
|
||||
@Override |
||||
protected void initFontSizePane() { |
||||
fontSizePane = new FontSizeComboPane(FONT_SIZES); |
||||
} |
||||
|
||||
@Override |
||||
public void populateBean(T t) { |
||||
MobileThemedWidgetStyle style = (MobileThemedWidgetStyle) t.getMobileWidgetStyle(); |
||||
if (style == null) { |
||||
style = new MobileThemedWidgetStyle(); |
||||
t.setMobileWidgetStyle(style); |
||||
} |
||||
colorSelectBox.setSelectObject(style.getThemeColor()); |
||||
lineComboBox.setSelectedLineStyle(style.getBorderStyle().getLineType()); |
||||
borderRadiusSpinner.setValue(style.getBorderStyle().getRadius()); |
||||
fontSizePane.setValue(style.getTextStyle().getFontSize()); |
||||
fontColorButton.setColor(style.getTextStyle().getFontColor()); |
||||
} |
||||
|
||||
@Override |
||||
public void updateBean(T t) { |
||||
MobileThemedWidgetStyle style = (MobileThemedWidgetStyle) t.getMobileWidgetStyle(); |
||||
if (style == null) { |
||||
style = new MobileThemedWidgetStyle(); |
||||
t.setMobileWidgetStyle(style); |
||||
} |
||||
style.setThemeColor(colorSelectBox.getSelectObject()); |
||||
BorderStyle borderStyle = new BorderStyle(); |
||||
borderStyle.setLineType(lineComboBox.getSelectedLineStyle()); |
||||
borderStyle.setRadius((int) borderRadiusSpinner.getValue()); |
||||
style.setBorderStyle(borderStyle); |
||||
ThemeTextStyle textStyle = new ThemeTextStyle(); |
||||
textStyle.setFontSize(fontSizePane.getValue()); |
||||
textStyle.setFontColor(fontColorButton.getColor()); |
||||
style.setTextStyle(textStyle); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,136 @@
|
||||
package com.fr.widgettheme.theme.edit.widget; |
||||
|
||||
import com.fr.base.theme.TemplateTheme; |
||||
import com.fr.design.beans.BasicBeanPane; |
||||
import com.fr.design.designer.IntervalConstants; |
||||
import com.fr.design.gui.ibutton.UIButtonGroup; |
||||
import com.fr.design.i18n.Toolkit; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.design.layout.TableLayout; |
||||
import com.fr.design.layout.TableLayoutHelper; |
||||
import org.jetbrains.annotations.Nullable; |
||||
|
||||
import javax.swing.JPanel; |
||||
import java.awt.BorderLayout; |
||||
import java.awt.Component; |
||||
import java.awt.event.ActionEvent; |
||||
import java.awt.event.ActionListener; |
||||
|
||||
/** |
||||
* 组件主题编辑容器,包含移动端控制面板和桌面端控制面板 |
||||
* 默认展开桌面端 |
||||
* |
||||
* @author Coral.Chen |
||||
* @since 11.0 |
||||
* Created on 2023/3/28 |
||||
*/ |
||||
public class WidgetStyleEditContainerPane<T extends TemplateTheme> extends BasicBeanPane<T> { |
||||
private UIButtonGroup<Integer> terminalStyleGroup; |
||||
private WidgetStyleEditPane<T> desktop; |
||||
private WidgetStyleEditPane<T> mobile; |
||||
|
||||
public WidgetStyleEditContainerPane() { |
||||
initComponent(); |
||||
} |
||||
|
||||
private void initComponent() { |
||||
this.setLayout(FRGUIPaneFactory.createBorderLayout()); |
||||
// 初始化按钮组,桌面端&移动端
|
||||
initButtonGroup(); |
||||
// 创建按钮组面板
|
||||
createButtonGroupPane(); |
||||
// 默认选中桌面端
|
||||
terminalStyleGroup.setSelectedIndex(0); |
||||
// cardLayout用来切换面板
|
||||
// 桌面端
|
||||
initDesktopPanel(); |
||||
// 移动端
|
||||
initMobilePanel(); |
||||
createCardContainer(); |
||||
initListener(); |
||||
} |
||||
|
||||
private void createCardContainer() { |
||||
JPanel cardPanel = FRGUIPaneFactory.createCardLayout_S_Pane(); |
||||
cardPanel.add(desktop, BorderLayout.CENTER); |
||||
cardPanel.add(mobile, BorderLayout.CENTER); |
||||
this.add(cardPanel, BorderLayout.CENTER); |
||||
} |
||||
|
||||
private void initMobilePanel() { |
||||
mobile = new MobileWidgetStyleEditPane<>(); |
||||
mobile.setVisible(false); |
||||
} |
||||
|
||||
private void initDesktopPanel() { |
||||
desktop = new DesktopWidgetStyleEditPane<>(); |
||||
// 默认可见性
|
||||
desktop.setVisible(true); |
||||
} |
||||
|
||||
private void createButtonGroupPane() { |
||||
Component[][] components = { |
||||
new Component[]{terminalStyleGroup}, |
||||
}; |
||||
final double p = TableLayout.PREFERRED; |
||||
double[] rowSize = {p}; |
||||
double[] columnSize = {p, p}; |
||||
int[][] rowCount = {{1, 1}}; |
||||
JPanel groupPane = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, IntervalConstants.INTERVAL_W1, IntervalConstants.INTERVAL_L1); |
||||
this.add(groupPane, BorderLayout.NORTH); |
||||
} |
||||
|
||||
/** |
||||
* 初始化按钮组 |
||||
*/ |
||||
private void initButtonGroup() { |
||||
terminalStyleGroup = new UIButtonGroup<>(new String[]{ |
||||
Toolkit.i18nText("Fine-Design_Widget_Terminal_Desktop"), |
||||
Toolkit.i18nText("Fine-Design_Widget_Terminal_Mobile")}); |
||||
this.add(terminalStyleGroup, BorderLayout.NORTH); |
||||
terminalStyleGroup.setSelectedIndex(0); |
||||
} |
||||
|
||||
/** |
||||
* 初始化按钮组的listener |
||||
*/ |
||||
private void initListener() { |
||||
terminalStyleGroup.addActionListener(new ActionListener() { |
||||
@Override |
||||
public void actionPerformed(ActionEvent e) { |
||||
showTerminalPane(); |
||||
} |
||||
}); |
||||
} |
||||
|
||||
/** |
||||
* 展示具体面板 |
||||
*/ |
||||
private void showTerminalPane() { |
||||
desktop.setVisible(terminalStyleGroup.getSelectedIndex() == 0); |
||||
mobile.setVisible(terminalStyleGroup.getSelectedIndex() == 1); |
||||
} |
||||
|
||||
@Override |
||||
public void populateBean(T ob) { |
||||
desktop.populateBean(ob); |
||||
mobile.populateBean(ob); |
||||
} |
||||
|
||||
@Nullable |
||||
@Override |
||||
public T updateBean() { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public void updateBean(T ob) { |
||||
desktop.updateBean(ob); |
||||
mobile.updateBean(ob); |
||||
} |
||||
|
||||
@Override |
||||
protected String title4PopupWindow() { |
||||
return Toolkit.i18nText("Fine-Design_Theme_Widget_Style"); |
||||
} |
||||
} |
@ -0,0 +1,125 @@
|
||||
package com.fr.widgettheme.theme.edit.widget; |
||||
|
||||
import com.fr.base.theme.TemplateTheme; |
||||
import com.fr.design.beans.BasicBeanPane; |
||||
import com.fr.design.designer.IntervalConstants; |
||||
import com.fr.design.gui.frpane.FontSizeComboPane; |
||||
import com.fr.design.gui.ibutton.UIColorButton; |
||||
import com.fr.design.gui.icombobox.LineComboBox; |
||||
import com.fr.design.gui.ilable.UILabel; |
||||
import com.fr.design.gui.ispinner.UISpinner; |
||||
import com.fr.design.gui.style.FRFontPane; |
||||
import com.fr.design.i18n.Toolkit; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.design.layout.TableLayout; |
||||
import com.fr.design.layout.TableLayoutHelper; |
||||
import com.fr.design.style.color.NewColorSelectBox; |
||||
import com.fr.stable.StringUtils; |
||||
import com.fr.widgettheme.theme.widget.theme.WidgetThemeDisplayConstants; |
||||
import com.fr.widgettheme.util.ThemeTextStylePaneCreator; |
||||
import org.jetbrains.annotations.Nullable; |
||||
|
||||
import javax.swing.BorderFactory; |
||||
import javax.swing.JPanel; |
||||
import java.awt.BorderLayout; |
||||
import java.awt.Component; |
||||
|
||||
|
||||
/** |
||||
* 组件样式编辑基础类 |
||||
* |
||||
* @author Coral.Chen |
||||
* @since 11.0 |
||||
* Created on 2023/5/22 |
||||
*/ |
||||
public class WidgetStyleEditPane<T extends TemplateTheme> extends BasicBeanPane<T> { |
||||
|
||||
// 主题色
|
||||
protected NewColorSelectBox colorSelectBox; |
||||
|
||||
// 边框线型
|
||||
protected LineComboBox lineComboBox; |
||||
// 圆角边框
|
||||
protected UISpinner borderRadiusSpinner; |
||||
/** |
||||
* 文本样式面板 |
||||
*/ |
||||
protected FontSizeComboPane fontSizePane; |
||||
|
||||
protected UIColorButton fontColorButton; |
||||
|
||||
public WidgetStyleEditPane() { |
||||
initComponents(); |
||||
} |
||||
|
||||
private void initComponents() { |
||||
this.setLayout(FRGUIPaneFactory.createBorderLayout()); |
||||
initCommonStyleEditor(); |
||||
double f = TableLayout.PREFERRED; |
||||
final double p = TableLayout.PREFERRED; |
||||
double[] rowSize = {p, p, p, p, p, p}; |
||||
double[] columnSize = {p, p}; |
||||
int[][] rowCount = {{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}}; |
||||
Component[][] components = generateComponent(); |
||||
JPanel customPane = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, IntervalConstants.INTERVAL_W1, IntervalConstants.INTERVAL_L1); |
||||
customPane.setBorder(BorderFactory.createEmptyBorder(20, 10, 0, 10)); |
||||
this.add(customPane, BorderLayout.NORTH); |
||||
} |
||||
|
||||
/** |
||||
* 初始化标签 |
||||
* |
||||
* @return components |
||||
*/ |
||||
public Component[][] generateComponent() { |
||||
return new Component[][]{new Component[]{ |
||||
new UILabel(Toolkit.i18nText("Fine-Design_Widget_Theme_Color")), colorSelectBox}, |
||||
new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Widget_Theme_Border_Line")), lineComboBox}, |
||||
new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Widget_Theme_Border_Radius")), borderRadiusSpinner}, |
||||
new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Widget_Theme_Text_Style")), ThemeTextStylePaneCreator.create(fontSizePane, fontColorButton)} |
||||
}; |
||||
} |
||||
|
||||
private void initCommonStyleEditor() { |
||||
colorSelectBox = new NewColorSelectBox(WidgetThemeDisplayConstants.THEME_WIDGET_COMPONENT_WIDTH, true); |
||||
colorSelectBox.setSelectObject(WidgetThemeDisplayConstants.DEFAULT_THEME_COLOR); |
||||
initLineBox(); |
||||
borderRadiusSpinner = new UISpinner(0, Integer.MAX_VALUE, 1); |
||||
initFontSizePane(); |
||||
fontColorButton = new UIColorButton(); |
||||
} |
||||
|
||||
protected void initFontSizePane() { |
||||
fontSizePane = new FontSizeComboPane(FRFontPane.getFontSizes()); |
||||
} |
||||
|
||||
/** |
||||
* 初始化边框线型 |
||||
*/ |
||||
public void initLineBox() { |
||||
lineComboBox = new LineComboBox(WidgetThemeDisplayConstants.BORDER_LINE_STYLE_ARRAY); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public void populateBean(T t) { |
||||
|
||||
} |
||||
|
||||
@Nullable |
||||
@Override |
||||
public T updateBean() { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public void updateBean(T t) { |
||||
} |
||||
|
||||
|
||||
@Override |
||||
protected String title4PopupWindow() { |
||||
return StringUtils.EMPTY; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,77 @@
|
||||
package com.fr.widgettheme.theme.panel; |
||||
|
||||
import com.fr.widgettheme.theme.widget.style.ButtonBackgroundStyle; |
||||
import com.fr.design.dialog.BasicPane; |
||||
import com.fr.design.gui.ilable.UILabel; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.design.layout.TableLayout; |
||||
import com.fr.design.layout.TableLayoutHelper; |
||||
import com.fr.widgettheme.theme.bean.ButtonBackground; |
||||
import com.fr.design.mainframe.widget.accessibles.AccessibleImgBackgroundEditor; |
||||
import com.fr.general.Background; |
||||
|
||||
import javax.swing.BorderFactory; |
||||
import javax.swing.JPanel; |
||||
import java.awt.BorderLayout; |
||||
import java.awt.Component; |
||||
|
||||
/** |
||||
* 按钮样式定义窗口 |
||||
* |
||||
* @author obo |
||||
* @since 11.0 |
||||
* Created on 2023/11/13 |
||||
*/ |
||||
public class ButtonStyleDefinedPane extends BasicPane { |
||||
|
||||
protected AccessibleImgBackgroundEditor initBackgroundPane; |
||||
protected AccessibleImgBackgroundEditor overBackgroundPane; |
||||
protected AccessibleImgBackgroundEditor clickBackgroundPane; |
||||
|
||||
public ButtonStyleDefinedPane() { |
||||
this.initComponents(); |
||||
} |
||||
|
||||
protected void initComponents() { |
||||
this.setLayout(FRGUIPaneFactory.createBorderLayout()); |
||||
initBackgroundPane = new AccessibleImgBackgroundEditor(); |
||||
overBackgroundPane = new AccessibleImgBackgroundEditor(); |
||||
clickBackgroundPane = new AccessibleImgBackgroundEditor(); |
||||
double f = TableLayout.FILL; |
||||
final double p = TableLayout.PREFERRED; |
||||
double[] rowSize = {p, p, p}; |
||||
double[] columnSize = {p, f}; |
||||
int[][] rowCount = {{1, 1},{1, 1},{1, 1}}; |
||||
Component[][] components = new Component[][]{ |
||||
new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Background_Initial")), initBackgroundPane}, |
||||
new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Background_Over")), overBackgroundPane}, |
||||
new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Background_Click")), clickBackgroundPane}, |
||||
}; |
||||
JPanel panel = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, 7, 7); |
||||
panel.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0)); |
||||
this.add(panel, BorderLayout.CENTER); |
||||
|
||||
} |
||||
|
||||
/** |
||||
* 填充 |
||||
*/ |
||||
public void populate(ButtonBackground buttonBackground) { |
||||
initBackgroundPane.setValue(buttonBackground.getInitialBackground()); |
||||
overBackgroundPane.setValue(buttonBackground.getOverBackground()); |
||||
clickBackgroundPane.setValue(buttonBackground.getClickBackground()); |
||||
} |
||||
|
||||
/** |
||||
* 更新 |
||||
*/ |
||||
public ButtonBackgroundStyle update() { |
||||
return new ButtonBackgroundStyle((Background) initBackgroundPane.getValue(), (Background) overBackgroundPane.getValue(), (Background) clickBackgroundPane.getValue()); |
||||
} |
||||
|
||||
@Override |
||||
protected String title4PopupWindow() { |
||||
return null; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,141 @@
|
||||
package com.fr.widgettheme.theme.panel; |
||||
|
||||
import com.fr.base.BaseUtils; |
||||
import com.fr.base.Style; |
||||
import com.fr.base.theme.TemplateTheme; |
||||
import com.fr.widgettheme.theme.widget.style.ThemedWidgetStyle; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.general.FRFont; |
||||
import com.fr.stable.Constants; |
||||
|
||||
import javax.swing.Icon; |
||||
import javax.swing.ImageIcon; |
||||
import javax.swing.JPanel; |
||||
import java.awt.Color; |
||||
import java.awt.Dimension; |
||||
import java.awt.Font; |
||||
import java.awt.Graphics; |
||||
import java.awt.Graphics2D; |
||||
import java.awt.LayoutManager; |
||||
import java.awt.image.BufferedImage; |
||||
|
||||
/** |
||||
* 主题界面预览单元格子 |
||||
* |
||||
* @author John.Ying |
||||
* @since 11.0 |
||||
* Created on 2023/3/18 |
||||
*/ |
||||
public class ControlPreviewCell extends JPanel { |
||||
protected static final LayoutManager DEFAULT = FRGUIPaneFactory.createRightFlowLayout(); |
||||
protected static final Color DEFAULT_COLOR = new Color(210, 210, 210); |
||||
protected static final Color DEFAULT_THEME_COLOR = new Color(54, 133, 242); |
||||
protected static final String DEFAULT_MESSAGE = ""; |
||||
protected static final int NO_SCALE_RESOLUTION = 100; |
||||
protected static final int DEFAULT_ALPHA = 255; |
||||
/** |
||||
* 格子文本数据 |
||||
*/ |
||||
protected String value; |
||||
protected TemplateTheme reportTheme; |
||||
/** |
||||
* 字体的颜色 |
||||
*/ |
||||
protected Color textColor = DEFAULT_COLOR; |
||||
|
||||
public Color getTextColor() { |
||||
return textColor; |
||||
} |
||||
|
||||
public void setTextColor(Color textColor) { |
||||
this.textColor = textColor; |
||||
} |
||||
|
||||
public ControlPreviewCell() { |
||||
this(DEFAULT, DEFAULT_MESSAGE); |
||||
} |
||||
|
||||
public ControlPreviewCell(String value) { |
||||
this(DEFAULT, value); |
||||
} |
||||
|
||||
public ControlPreviewCell(LayoutManager layoutManager, String value) { |
||||
this.setLayout(layoutManager); |
||||
this.setOpaque(false); |
||||
this.value = value; |
||||
this.setPreferredSize(new Dimension(80, 30)); |
||||
} |
||||
|
||||
/** |
||||
* 主题样式变化后监听改变 |
||||
*/ |
||||
public void refresh(TemplateTheme reportTheme) { |
||||
this.reportTheme = reportTheme; |
||||
ThemedWidgetStyle widgetStyle = (ThemedWidgetStyle) this.reportTheme.getWidgetStyle(); |
||||
//主题色设置为透明或者插件启动前已有的主题启动插件后主题色为null
|
||||
if (widgetStyle.getThemeColor() == null) { |
||||
widgetStyle.setThemeColor(DEFAULT_THEME_COLOR); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 填充圆角矩形背景色 |
||||
*/ |
||||
public void paintBgColor(Graphics g, ThemedWidgetStyle widgetStyle) { |
||||
this.paintBgColor(g, widgetStyle, DEFAULT_ALPHA); |
||||
} |
||||
|
||||
public boolean isDefaultStyle() { |
||||
ThemedWidgetStyle widgetStyle = (ThemedWidgetStyle) reportTheme.getWidgetStyle(); |
||||
return widgetStyle.getStyleType() == ThemedWidgetStyle.DEFAULT_STYLE; |
||||
} |
||||
|
||||
public Color getThemeColor() { |
||||
|
||||
ThemedWidgetStyle widgetStyle = (ThemedWidgetStyle) reportTheme.getWidgetStyle(); |
||||
return widgetStyle.getThemeColor(); |
||||
|
||||
} |
||||
|
||||
protected Icon setStyleTwoIcon(Icon icon, Icon defaultIcon) { |
||||
if (this.reportTheme != null && !isDefaultStyle()) { |
||||
|
||||
if (icon instanceof ImageIcon) { |
||||
ImageIcon imageIcon = (ImageIcon) icon; |
||||
BufferedImage bufferedImage = ImageUtils.colorImage(ImageUtils.imageIconToBufferedImage(imageIcon), getThemeColor()); |
||||
return new ImageIcon(bufferedImage); |
||||
} |
||||
} |
||||
return defaultIcon; |
||||
} |
||||
|
||||
/** |
||||
* 填充圆角矩形背景色 |
||||
*/ |
||||
public void paintBgColor(Graphics g, ThemedWidgetStyle widgetStyle, int alpha) { |
||||
Color themeColor = widgetStyle.getThemeColor(); |
||||
g.setColor(new Color(themeColor.getRed(), themeColor.getGreen(), themeColor.getBlue(), alpha)); |
||||
g.fillRoundRect(0, 0, getSize().width - 1, getSize().height - 1, widgetStyle.getBorderStyle().getRadius(), widgetStyle.getBorderStyle().getRadius()); |
||||
//需要重新绘制一遍字体,否则会被颜色填充给遮住
|
||||
Graphics2D g2d = (Graphics2D) g.create(); |
||||
FRFont font = FRFont.getInstance(FRFont.DEFAULT_FONTNAME, Font.PLAIN, widgetStyle.getTextStyle().getFontSize(), textColor); |
||||
BaseUtils.drawStringStyleInRotation(g2d, getWidth(), getHeight(), this.value, |
||||
Style.getInstance(font).deriveHorizontalAlignment(Constants.LEFT) |
||||
.deriveTextStyle(Style.TEXTSTYLE_SINGLELINE), NO_SCALE_RESOLUTION); |
||||
} |
||||
|
||||
@Override |
||||
public void paintComponent(Graphics g) { |
||||
super.paintComponent(g); |
||||
if (this.reportTheme == null) { |
||||
return; |
||||
} |
||||
Graphics2D g2d = (Graphics2D) g.create(); |
||||
ThemedWidgetStyle widgetStyle = (ThemedWidgetStyle) reportTheme.getWidgetStyle(); |
||||
FRFont font = FRFont.getInstance(FRFont.DEFAULT_FONTNAME, Font.PLAIN, widgetStyle.getTextStyle().getFontSize(), textColor); |
||||
//每个预览格子通用的字体绘制
|
||||
BaseUtils.drawStringStyleInRotation(g2d, getWidth(), getHeight(), this.value, |
||||
Style.getInstance(font).deriveHorizontalAlignment(Constants.LEFT) |
||||
.deriveTextStyle(Style.TEXTSTYLE_SINGLELINE), NO_SCALE_RESOLUTION); |
||||
} |
||||
} |
@ -0,0 +1,77 @@
|
||||
package com.fr.widgettheme.theme.panel; |
||||
|
||||
|
||||
import com.fr.base.svg.IconUtils; |
||||
import com.fr.widgettheme.theme.widget.style.ThemedWidgetStyle; |
||||
import com.fr.design.border.UIRoundedBorder; |
||||
import com.fr.stable.StringUtils; |
||||
import com.fr.widgettheme.theme.widget.theme.WidgetThemeDisplayConstants; |
||||
|
||||
import javax.swing.Icon; |
||||
import javax.swing.JLabel; |
||||
import java.awt.BorderLayout; |
||||
import java.awt.Color; |
||||
import java.awt.Dimension; |
||||
import java.awt.Graphics; |
||||
import java.awt.LayoutManager; |
||||
|
||||
/** |
||||
* 主题界面预览控件单元格子,控件图表直接用icon |
||||
* |
||||
* @author John.Ying |
||||
* @since 11.0 |
||||
* Created on 2023/3/18 |
||||
*/ |
||||
public class ControlPreviewCellWithIcon extends ControlPreviewCell { |
||||
private static final int CONTROL_ALPHA = 16; |
||||
|
||||
JLabel jLabel; |
||||
Icon icon; |
||||
Icon defaultIcon; |
||||
|
||||
public ControlPreviewCellWithIcon() { |
||||
this(DEFAULT, DEFAULT_MESSAGE); |
||||
} |
||||
|
||||
public ControlPreviewCellWithIcon(String value) { |
||||
this(DEFAULT, value); |
||||
} |
||||
|
||||
public ControlPreviewCellWithIcon(LayoutManager layoutManager, String value) { |
||||
this.setLayout(layoutManager); |
||||
this.value = value; |
||||
this.setPreferredSize(new Dimension(100, 27)); |
||||
} |
||||
|
||||
/** |
||||
* 根据icon地址绘制一个图标,用jlabel进行展示 |
||||
* |
||||
* @param url icon地址 |
||||
*/ |
||||
public void drawIcon(String url) { |
||||
if (StringUtils.isEmpty(url)) { |
||||
return; |
||||
} |
||||
defaultIcon = IconUtils.readIcon(url); |
||||
icon = setStyleTwoIcon(icon, defaultIcon); |
||||
this.jLabel = new JLabel(icon); |
||||
jLabel.setPreferredSize(new Dimension(21, 17)); |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void paintComponent(Graphics g) { |
||||
super.paintComponent(g); |
||||
ThemedWidgetStyle widgetStyle = (ThemedWidgetStyle) reportTheme.getWidgetStyle(); |
||||
//风格一边框不显示主题色
|
||||
Color borderColor = isDefaultStyle() ? DEFAULT_COLOR : widgetStyle.getThemeColor(); |
||||
this.setBorder(new UIRoundedBorder(widgetStyle.getBorderStyle().getLineType() |
||||
, borderColor, widgetStyle.getBorderStyle().getRadius())); |
||||
icon = setStyleTwoIcon(icon, defaultIcon); |
||||
this.jLabel.setIcon(icon); |
||||
this.add(jLabel, BorderLayout.EAST); |
||||
if (widgetStyle.getStyleType() != ThemedWidgetStyle.DEFAULT_STYLE) { |
||||
paintBgColor(g, widgetStyle, CONTROL_ALPHA); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,133 @@
|
||||
package com.fr.widgettheme.theme.panel; |
||||
|
||||
import com.fr.base.background.ColorBackground; |
||||
import com.fr.base.theme.TemplateTheme; |
||||
import com.fr.design.i18n.Toolkit; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.design.mainframe.theme.preview.ThemePreviewed; |
||||
import com.fr.general.Background; |
||||
|
||||
import javax.swing.JPanel; |
||||
import java.awt.Color; |
||||
import java.awt.Dimension; |
||||
import java.awt.Graphics; |
||||
import java.awt.Graphics2D; |
||||
import java.awt.geom.Rectangle2D; |
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
|
||||
/** |
||||
* 主题界面页面中的参数界面 |
||||
* |
||||
* @author John.Ying |
||||
* @since 11.0 |
||||
* Created on 2023/3/18 |
||||
*/ |
||||
public class ControlPreviewPane extends JPanel implements ThemePreviewed<TemplateTheme> { |
||||
|
||||
public static final int PREVIEW_WIDTH = 615; |
||||
|
||||
public static final int PREVIEW_HEIGHT = 62; |
||||
|
||||
/** |
||||
* 参数界面中放置的所有cell,用于监听主题样式变更 |
||||
*/ |
||||
public final List<ControlPreviewCell> list = new ArrayList<>(); |
||||
|
||||
private Background background; |
||||
|
||||
private static final String DATE_ICON_URL = "/com/fr/web/images/form/resources/date_16.png"; |
||||
|
||||
private static final String COMBOBOX_ICON_URL = "/com/fr/widgettheme/combobox.png"; |
||||
|
||||
@Override |
||||
public void refresh(TemplateTheme style) { |
||||
this.background = style.getParamContainerStyle().getBackground(); |
||||
for (ControlPreviewCell controlPreviewCell : list) { |
||||
controlPreviewCell.refresh(style); |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public void paintComponent(Graphics g) { |
||||
super.paintComponent(g); |
||||
paintBackground((Graphics2D) g); |
||||
} |
||||
|
||||
protected void paintBackground(Graphics2D g2d) { |
||||
if (background == null) { |
||||
background = ColorBackground.getInstance(Color.WHITE); |
||||
} |
||||
background.paint(g2d, new Rectangle2D.Double(0, 0, PREVIEW_WIDTH, PREVIEW_HEIGHT)); |
||||
} |
||||
|
||||
/** |
||||
* 初始化参数界面,往里面添加各种cell |
||||
*/ |
||||
public void initControlPreviewPane() { |
||||
initDateControlPane(); |
||||
initComboboxControlPane(); |
||||
initRadioButtonControlPane(); |
||||
initNormalButtonControlPane(); |
||||
} |
||||
|
||||
/** |
||||
* 初始化日期控件包括文字跟控件 |
||||
*/ |
||||
private void initDateControlPane() { |
||||
TextPreviewCell dateTextCell = new TextPreviewCell(Toolkit.i18nText("Fine-Design_Theme_Control_Date_Text")); |
||||
dateTextCell.setPreferredSize(new Dimension(80, 30)); |
||||
ControlPreviewCellWithIcon dateEditorCell = new ControlPreviewCellWithIcon(Toolkit.i18nText("Fine-Design_Theme_Control_Date_Editor_Text")); |
||||
dateEditorCell.drawIcon(DATE_ICON_URL); |
||||
dateEditorCell.setTextColor(ControlPreviewCell.DEFAULT_COLOR); |
||||
this.add(dateTextCell); |
||||
this.add(dateEditorCell); |
||||
this.list.add(dateTextCell); |
||||
this.list.add(dateEditorCell); |
||||
} |
||||
|
||||
/** |
||||
* 初始化下拉框控件包括文件跟控件 |
||||
*/ |
||||
private void initComboboxControlPane() { |
||||
TextPreviewCell comboBoxTextCell = new TextPreviewCell(Toolkit.i18nText("Fine-Design_Theme_Control_ComboBox_Text")); |
||||
comboBoxTextCell.setPreferredSize(new Dimension(60, 30)); |
||||
ControlPreviewCellWithIcon comboBoxControlPreviewCell = new ControlPreviewCellWithIcon(Toolkit.i18nText("Fine-Design_Theme_Control_ComboBox_Editor_Text")); |
||||
comboBoxControlPreviewCell.drawIcon(COMBOBOX_ICON_URL); |
||||
comboBoxControlPreviewCell.setTextColor(ControlPreviewCell.DEFAULT_COLOR); |
||||
this.add(comboBoxTextCell); |
||||
this.add(comboBoxControlPreviewCell); |
||||
this.list.add(comboBoxControlPreviewCell); |
||||
this.list.add(comboBoxTextCell); |
||||
} |
||||
|
||||
/** |
||||
* 初始化单选按钮组控件 |
||||
*/ |
||||
private void initRadioButtonControlPane() { |
||||
RingControlPreviewCell ringControlPreviewCell = new RingControlPreviewCell(); |
||||
RoundControlPreviewCell roundControlPreviewCell = new RoundControlPreviewCell(); |
||||
|
||||
TextPreviewCell yearTextFieldCell = new TextPreviewCell(Toolkit.i18nText("Fine-Design_Theme_Control_Radio_Year")); |
||||
yearTextFieldCell.setPreferredSize(new Dimension(38, 30)); |
||||
TextPreviewCell monthTextFieldCell = new TextPreviewCell(Toolkit.i18nText("Fine-Design_Theme_Control_Radio_Month")); |
||||
monthTextFieldCell.setPreferredSize(new Dimension(38, 30)); |
||||
this.add(ringControlPreviewCell); |
||||
this.add(yearTextFieldCell); |
||||
this.add(roundControlPreviewCell); |
||||
this.add(monthTextFieldCell); |
||||
this.list.add(ringControlPreviewCell); |
||||
this.list.add(roundControlPreviewCell); |
||||
this.list.add(yearTextFieldCell); |
||||
this.list.add(monthTextFieldCell); |
||||
} |
||||
|
||||
/** |
||||
* 初始化按钮预览格子 |
||||
*/ |
||||
private void initNormalButtonControlPane() { |
||||
NormalButtonPreviewCell normalButton = new NormalButtonPreviewCell(FRGUIPaneFactory.createCenterFlowLayout(), ControlPreviewCell.DEFAULT_MESSAGE); |
||||
this.add(normalButton); |
||||
this.list.add(normalButton); |
||||
} |
||||
} |
@ -0,0 +1,89 @@
|
||||
package com.fr.widgettheme.theme.panel; |
||||
|
||||
import javax.swing.ImageIcon; |
||||
import java.awt.Color; |
||||
import java.awt.Graphics; |
||||
import java.awt.image.BufferedImage; |
||||
import java.awt.image.WritableRaster; |
||||
|
||||
/** |
||||
* 控件主题Image处理工具类 |
||||
* |
||||
* @author obo |
||||
* @since 11.0 |
||||
* Created on 2023/11/13 |
||||
*/ |
||||
public class ImageUtils { |
||||
|
||||
/** |
||||
* 根据主题色处理image |
||||
* |
||||
* @param image 图像 |
||||
* @param color 主题色 |
||||
* @return 处理结果 |
||||
*/ |
||||
public static BufferedImage colorImage(BufferedImage image, Color color) { |
||||
int width = image.getWidth(); |
||||
int height = image.getHeight(); |
||||
WritableRaster raster = image.getRaster(); |
||||
|
||||
for (int xx = 0; xx < width; xx++) { |
||||
for (int yy = 0; yy < height; yy++) { |
||||
int[] pixels = raster.getPixel(xx, yy, (int[]) null); |
||||
setRedPixels(pixels, color); |
||||
setGreenPixels(pixels, color); |
||||
setBluePixels(pixels, color); |
||||
raster.setPixel(xx, yy, pixels); |
||||
} |
||||
} |
||||
return image; |
||||
} |
||||
|
||||
/** |
||||
* 处理红像素 |
||||
* |
||||
* @param pixels 像素数组 |
||||
* @param color 颜色 |
||||
*/ |
||||
private static void setRedPixels(int[] pixels, Color color) { |
||||
pixels[0] = pixels[0] > 0 && pixels[0] < 255 ? color.getRed() : 255; |
||||
} |
||||
|
||||
/** |
||||
* 处理绿像素 |
||||
* |
||||
* @param pixels 像素数组 |
||||
* @param color 颜色 |
||||
*/ |
||||
private static void setGreenPixels(int[] pixels, Color color) { |
||||
pixels[1] = pixels[1] > 0 && pixels[1] < 255 ? color.getGreen() : 255; |
||||
} |
||||
|
||||
/** |
||||
* 处理蓝像素 |
||||
* |
||||
* @param pixels 像素数组 |
||||
* @param color 颜色 |
||||
*/ |
||||
private static void setBluePixels(int[] pixels, Color color) { |
||||
pixels[2] = pixels[2] > 0 && pixels[2] < 255 ? color.getBlue() : 255; |
||||
} |
||||
|
||||
/** |
||||
* ImageIcon转换为BufferImage |
||||
* |
||||
* @param icon imageIcon |
||||
* @return BufferedImage |
||||
*/ |
||||
public static BufferedImage imageIconToBufferedImage(ImageIcon icon) { |
||||
BufferedImage bi = new BufferedImage( |
||||
icon.getIconWidth(), |
||||
icon.getIconHeight(), |
||||
BufferedImage.TYPE_INT_ARGB); |
||||
Graphics g = bi.createGraphics(); |
||||
icon.paintIcon(null, g, 0, 0); |
||||
g.dispose(); |
||||
return bi; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,50 @@
|
||||
package com.fr.widgettheme.theme.panel; |
||||
|
||||
|
||||
import com.fr.widgettheme.theme.widget.style.ThemedWidgetStyle; |
||||
import com.fr.design.gui.ilable.UILabel; |
||||
import com.fr.design.i18n.Toolkit; |
||||
import com.fr.general.FRFont; |
||||
|
||||
import java.awt.*; |
||||
|
||||
/** |
||||
* 主题参数面板按钮预览格子 |
||||
* |
||||
* @author John.Ying |
||||
* @since 11.0 |
||||
* Created on 2023/3/27 |
||||
*/ |
||||
public class NormalButtonPreviewCell extends ControlPreviewCell { |
||||
|
||||
/** |
||||
* 按钮上的label |
||||
*/ |
||||
private UILabel uiLabel; |
||||
|
||||
public NormalButtonPreviewCell() { |
||||
this(DEFAULT, DEFAULT_MESSAGE); |
||||
} |
||||
|
||||
public NormalButtonPreviewCell(String value) { |
||||
this(DEFAULT, value); |
||||
} |
||||
|
||||
public NormalButtonPreviewCell(LayoutManager layoutManager, String value) { |
||||
this.setLayout(layoutManager); |
||||
this.value = value; |
||||
this.uiLabel = new UILabel(Toolkit.i18nText("Fine-Design_Theme_Control_Normal_Button")); |
||||
this.setPreferredSize(new Dimension(80, 27)); |
||||
} |
||||
|
||||
@Override |
||||
public void paintComponent(Graphics g) { |
||||
super.paintComponent(g); |
||||
ThemedWidgetStyle widgetStyle = (ThemedWidgetStyle) reportTheme.getWidgetStyle(); |
||||
paintBgColor(g, widgetStyle); |
||||
uiLabel.setForeground(Color.WHITE); |
||||
FRFont font = FRFont.getInstance(FRFont.DEFAULT_FONTNAME, Font.PLAIN, widgetStyle.getTextStyle().getFontSize(), Color.WHITE); |
||||
uiLabel.setFont(font); |
||||
this.add(uiLabel, BorderLayout.CENTER); |
||||
} |
||||
} |
@ -0,0 +1,51 @@
|
||||
package com.fr.widgettheme.theme.panel; |
||||
|
||||
|
||||
import com.fr.widgettheme.theme.widget.style.ThemedWidgetStyle; |
||||
|
||||
import java.awt.Dimension; |
||||
import java.awt.LayoutManager; |
||||
import java.awt.Graphics2D; |
||||
import java.awt.Graphics; |
||||
import java.awt.Color; |
||||
|
||||
/** |
||||
* 主题界面预览控件单元格子,单选按钮组被选中的样子 |
||||
* |
||||
* @author John.Ying |
||||
* @since 11.0 |
||||
* Created on 2023/3/18 |
||||
*/ |
||||
public class RingControlPreviewCell extends ControlPreviewCell { |
||||
/** |
||||
* 圆环厚度 |
||||
*/ |
||||
private static final int THICK_NESS = 4; |
||||
|
||||
public RingControlPreviewCell() { |
||||
this(DEFAULT, DEFAULT_MESSAGE); |
||||
} |
||||
|
||||
public RingControlPreviewCell(String value) { |
||||
this(DEFAULT, value); |
||||
} |
||||
|
||||
public RingControlPreviewCell(LayoutManager layoutManager, String value) { |
||||
this.setLayout(layoutManager); |
||||
this.setOpaque(false); |
||||
this.value = value; |
||||
this.setPreferredSize(new Dimension(20, 30)); |
||||
} |
||||
|
||||
@Override |
||||
public void paintComponent(Graphics g) { |
||||
super.paintComponent(g); |
||||
ThemedWidgetStyle widgetStyle = (ThemedWidgetStyle) reportTheme.getWidgetStyle(); |
||||
Graphics2D g2d = (Graphics2D) g.create(); |
||||
g2d.setColor(widgetStyle.getThemeColor()); |
||||
g2d.fillOval(5, 9, 15, 15); |
||||
g2d.setColor(Color.WHITE); |
||||
g2d.fillOval(5 + THICK_NESS, 9 + THICK_NESS, 15 - 2 * THICK_NESS, 15 - 2 * THICK_NESS); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,45 @@
|
||||
package com.fr.widgettheme.theme.panel; |
||||
|
||||
|
||||
import com.fr.widgettheme.theme.widget.style.ThemedWidgetStyle; |
||||
|
||||
import java.awt.Color; |
||||
import java.awt.Dimension; |
||||
import java.awt.Graphics; |
||||
import java.awt.Graphics2D; |
||||
import java.awt.LayoutManager; |
||||
|
||||
/** |
||||
* 主题界面预览控件单元格子,单选按钮组未被选中的样子 |
||||
* |
||||
* @author John.Ying |
||||
* @since 11.0 |
||||
* Created on 2023/3/18 |
||||
*/ |
||||
public class RoundControlPreviewCell extends ControlPreviewCell { |
||||
public RoundControlPreviewCell() { |
||||
this(DEFAULT, DEFAULT_MESSAGE); |
||||
} |
||||
|
||||
public RoundControlPreviewCell(String value) { |
||||
this(DEFAULT, value); |
||||
} |
||||
|
||||
public RoundControlPreviewCell(LayoutManager layoutManager, String value) { |
||||
this.setLayout(layoutManager); |
||||
this.setOpaque(false); |
||||
this.value = value; |
||||
this.setPreferredSize(new Dimension(23, 30)); |
||||
} |
||||
|
||||
@Override |
||||
public void paintComponent(Graphics g) { |
||||
super.paintComponent(g); |
||||
ThemedWidgetStyle widgetStyle = (ThemedWidgetStyle) reportTheme.getWidgetStyle(); |
||||
//风格一边框不显示主题色
|
||||
Color borderColor = isDefaultStyle() ? DEFAULT_COLOR : widgetStyle.getThemeColor(); |
||||
Graphics2D g2d = (Graphics2D) g.create(); |
||||
g2d.setColor(borderColor); |
||||
g2d.drawOval(5, 9, 15, 15); |
||||
} |
||||
} |
@ -0,0 +1,36 @@
|
||||
package com.fr.widgettheme.theme.panel; |
||||
|
||||
|
||||
import com.fr.base.theme.TemplateTheme; |
||||
|
||||
import java.awt.*; |
||||
|
||||
/** |
||||
* 文字预览格子 |
||||
* |
||||
* @author John.Ying |
||||
* @since 11.0 |
||||
* Created on 2023/3/27 |
||||
*/ |
||||
public class TextPreviewCell extends ControlPreviewCell { |
||||
|
||||
public TextPreviewCell(String value) { |
||||
this(DEFAULT, value); |
||||
} |
||||
|
||||
public TextPreviewCell(LayoutManager layoutManager, String value) { |
||||
this.setLayout(layoutManager); |
||||
this.value = value; |
||||
} |
||||
|
||||
@Override |
||||
public void refresh(TemplateTheme reportTheme) { |
||||
super.refresh(reportTheme); |
||||
// 文字根据是否深色主题自适应改变
|
||||
if (reportTheme.isDark()) { |
||||
textColor = Color.WHITE; |
||||
} else { |
||||
textColor = Color.BLACK; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,202 @@
|
||||
package com.fr.widgettheme.theme.panel; |
||||
|
||||
import com.fr.base.background.ColorBackground; |
||||
import com.fr.base.theme.FormTheme; |
||||
import com.fr.chart.chartattr.ChartCollection; |
||||
import com.fr.chart.chartdata.NormalChartData; |
||||
import com.fr.chart.charttypes.ChartTypeManager; |
||||
import com.fr.design.i18n.Toolkit; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.design.mainframe.theme.TemplateThemePreviewPane; |
||||
import com.fr.design.mainframe.theme.preview.ChartComponentPreviewPane; |
||||
import com.fr.design.mainframe.theme.preview.UINoOpaquePanel; |
||||
import com.fr.general.Background; |
||||
import com.fr.log.FineLoggerFactory; |
||||
import com.fr.plugin.chart.PiePlot4VanChart; |
||||
import com.fr.plugin.chart.attr.VanChartLegend; |
||||
import com.fr.plugin.chart.base.VanChartTools; |
||||
import com.fr.plugin.chart.column.VanChartColumnPlot; |
||||
import com.fr.plugin.chart.type.GradientType; |
||||
import com.fr.plugin.chart.type.RadiusType; |
||||
import com.fr.plugin.chart.vanchart.VanChart; |
||||
import com.fr.stable.Constants; |
||||
import com.fr.stable.StringUtils; |
||||
|
||||
import javax.swing.JPanel; |
||||
import java.awt.AlphaComposite; |
||||
import java.awt.BorderLayout; |
||||
import java.awt.Color; |
||||
import java.awt.Composite; |
||||
import java.awt.Dimension; |
||||
import java.awt.Graphics2D; |
||||
import java.awt.geom.Rectangle2D; |
||||
|
||||
import static com.fr.design.i18n.Toolkit.i18nText; |
||||
import static com.fr.widgettheme.util.ThemePreviewPaneInitHelper.initColumnPlot; |
||||
import static com.fr.widgettheme.util.ThemePreviewPaneInitHelper.initVanChartYAxis; |
||||
import static com.fr.widgettheme.util.ThemePreviewPaneInitHelper.initVanChartsTools; |
||||
|
||||
/** |
||||
* 主题界面预览控frm界面,就是主jar里的那个界面,做了简单的修改 |
||||
* |
||||
* @author John.Ying |
||||
* @since 11.0 |
||||
* Created on 2023/3/18 |
||||
*/ |
||||
public class WidgetDisplayFormThemePreviewPane extends TemplateThemePreviewPane<FormTheme> { |
||||
private WidgetThemeECComponentPreviewPane elementCasePane; |
||||
private Background background; |
||||
private ChartComponentPreviewPane columnChartPreviewPane; |
||||
private ChartComponentPreviewPane pieChartPreviewPane; |
||||
private ControlPreviewPane controlPreviewPane; |
||||
private float alpha = 1.0F; |
||||
|
||||
public WidgetDisplayFormThemePreviewPane() { |
||||
setLayout(FRGUIPaneFactory.createBorderLayout()); |
||||
controlPreviewPane = new ControlPreviewPane(); |
||||
controlPreviewPane.setLayout(FRGUIPaneFactory.createLabelFlowLayout()); |
||||
controlPreviewPane.setPreferredSize(new Dimension(615, 40)); |
||||
controlPreviewPane.initControlPreviewPane(); |
||||
JPanel content = new UINoOpaquePanel(); |
||||
content.setLayout(new BorderLayout()); |
||||
add(controlPreviewPane, BorderLayout.NORTH); |
||||
JPanel chartContent = createChartContent(); |
||||
content.add(chartContent, BorderLayout.CENTER); |
||||
content.add(elementCasePane = new WidgetThemeECComponentPreviewPane(), BorderLayout.SOUTH); |
||||
add(content, BorderLayout.CENTER); |
||||
} |
||||
|
||||
private JPanel createChartContent() { |
||||
JPanel chartContent = new UINoOpaquePanel(); |
||||
chartContent.setLayout(new BorderLayout()); |
||||
JPanel columnChartPanel = new UINoOpaquePanel() { |
||||
public Dimension getPreferredSize() { |
||||
return new Dimension(379, 314); |
||||
} |
||||
}; |
||||
columnChartPanel.setLayout(new BorderLayout()); |
||||
columnChartPreviewPane = createChartPreviewPane(initColumnChart(), i18nText("Fine-Design_Basic_Template_Theme_Profile_Pane_Comp_Title1")); |
||||
columnChartPanel.add(columnChartPreviewPane, BorderLayout.CENTER); |
||||
|
||||
JPanel pieChartPanel = new UINoOpaquePanel() { |
||||
public Dimension getPreferredSize() { |
||||
return new Dimension(236, 314); |
||||
} |
||||
}; |
||||
pieChartPanel.setLayout(new BorderLayout()); |
||||
pieChartPreviewPane = createChartPreviewPane(initPieChart(), i18nText("Fine-Design_Basic_Template_Theme_Profile_Pane_Comp_Title2")); |
||||
pieChartPanel.add(pieChartPreviewPane, BorderLayout.CENTER); |
||||
chartContent.add(columnChartPanel, BorderLayout.CENTER); |
||||
chartContent.add(pieChartPanel, BorderLayout.EAST); |
||||
return chartContent; |
||||
} |
||||
|
||||
private ChartComponentPreviewPane createChartPreviewPane(ChartCollection chartCollection, String title) { |
||||
ChartComponentPreviewPane chartComponentPreviewPane = new ChartComponentPreviewPane(title); |
||||
chartComponentPreviewPane.getContentPane().populate(chartCollection); |
||||
chartComponentPreviewPane.getContentPane().setCallbackEvent(this); |
||||
return chartComponentPreviewPane; |
||||
} |
||||
|
||||
@Override |
||||
public void refresh(FormTheme theme) { |
||||
background = theme.getBodyStyle().getStyle().getBackground(); |
||||
alpha = theme.getBodyStyle().getStyle().getAlpha(); |
||||
elementCasePane.refresh(theme); |
||||
columnChartPreviewPane.refresh(theme); |
||||
pieChartPreviewPane.refresh(theme); |
||||
controlPreviewPane.refresh(theme); |
||||
repaint(); |
||||
} |
||||
|
||||
|
||||
protected void paintBackground(Graphics2D g2d) { |
||||
if (background == null) { |
||||
background = ColorBackground.getInstance(Color.WHITE); |
||||
} |
||||
Composite oldComposite = g2d.getComposite(); |
||||
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha)); |
||||
background.paint(g2d, new Rectangle2D.Double(0, 0, PREVIEW_WIDTH, PREVIEW_HEIGHT)); |
||||
g2d.setComposite(oldComposite); |
||||
} |
||||
|
||||
/** |
||||
* 初始化柱形图 |
||||
* |
||||
* @return 存放图表 |
||||
*/ |
||||
private ChartCollection initColumnChart() { |
||||
try { |
||||
VanChart chart = (VanChart) ChartTypeManager.getInstance().getCharts(VanChartColumnPlot.VAN_CHART_COLUMN_PLOT_ID)[0].clone(); |
||||
initColumnChartDetail(chart); |
||||
Object[] category = { |
||||
Toolkit.i18nText("Fine-Design_Chart_Category") + "1", |
||||
Toolkit.i18nText("Fine-Design_Chart_Category") + "2", |
||||
Toolkit.i18nText("Fine-Design_Chart_Category") + "3", |
||||
Toolkit.i18nText("Fine-Design_Chart_Category") + "4" |
||||
}; |
||||
Object[] series = { |
||||
Toolkit.i18nText("Fine-Design_Chart_Series") + "1", |
||||
Toolkit.i18nText("Fine-Design_Chart_Series") + "2" |
||||
}; |
||||
Object[][] value = { |
||||
{"250", "540", "300", "410"}, |
||||
{"180", "190", "170", "100"}, |
||||
}; |
||||
NormalChartData normalChartData = new NormalChartData(category, series, value); |
||||
chart.setPreViewChartData(normalChartData); |
||||
ChartCollection chartCollection = new ChartCollection(chart); |
||||
return chartCollection; |
||||
} catch (Exception ex) { |
||||
FineLoggerFactory.getLogger().error(ex.getMessage(), ex); |
||||
} |
||||
return null; |
||||
} |
||||
|
||||
private void initColumnChartDetail(VanChart chart) { |
||||
chart.getTitle().setTitleVisible(false); |
||||
initVanChartsTools(chart.getVanChartTools()); |
||||
VanChartColumnPlot plot = chart.getPlot(); |
||||
//Form中独有的setPosition,和Report中不同,先单独放在这里,不写在initPlot中
|
||||
plot.getLegend().setPosition(Constants.TOP); |
||||
initColumnPlot(plot); |
||||
initVanChartYAxis(plot.getDefaultYAxis()); |
||||
} |
||||
|
||||
/** |
||||
* 初始化饼图 |
||||
* |
||||
* @return chartCollection |
||||
*/ |
||||
private ChartCollection initPieChart() { |
||||
try { |
||||
VanChart chart = (VanChart) ChartTypeManager.getInstance().getCharts(PiePlot4VanChart.VAN_CHART_PIE_PLOT)[0].clone(); |
||||
chart.getTitle().setTitleVisible(false); |
||||
VanChartTools vanChartTools = chart.getVanChartTools(); |
||||
vanChartTools.setSort(false); |
||||
vanChartTools.setExport(false); |
||||
vanChartTools.setFullScreen(false); |
||||
|
||||
PiePlot4VanChart plot = chart.getPlot(); |
||||
VanChartLegend legend = (VanChartLegend) plot.getLegend(); |
||||
legend.setPosition(Constants.BOTTOM); |
||||
legend.setCustomSize(true); |
||||
legend.setMaxHeight(28); |
||||
plot.getGradientStyle().setGradientType(GradientType.NONE); |
||||
plot.setInnerRadiusPercent(75); |
||||
plot.getRadius().setRadiusType(RadiusType.FIXED); |
||||
plot.getRadius().setRadius(70); |
||||
|
||||
Object[] category = {StringUtils.EMPTY}; |
||||
Object[] series = {"A1", "B1", "C1", "D1", "E1", "F1", "G1", "H1"}; |
||||
Object[][] value = {{45}, {24}, {12}, {8}, {5}, {3}, {2}, {1},}; |
||||
NormalChartData normalChartData = new NormalChartData(category, series, value); |
||||
chart.setPreViewChartData(normalChartData); |
||||
ChartCollection chartCollection = new ChartCollection(chart); |
||||
return chartCollection; |
||||
} catch (Exception ex) { |
||||
FineLoggerFactory.getLogger().error(ex.getMessage(), ex); |
||||
} |
||||
return null; |
||||
} |
||||
} |
@ -0,0 +1,119 @@
|
||||
package com.fr.widgettheme.theme.panel; |
||||
|
||||
import com.fr.base.background.ColorBackground; |
||||
import com.fr.base.theme.ReportTheme; |
||||
import com.fr.chart.chartattr.ChartCollection; |
||||
import com.fr.chart.chartdata.NormalChartData; |
||||
import com.fr.chart.charttypes.ChartTypeManager; |
||||
import com.fr.design.i18n.Toolkit; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.design.mainframe.theme.TemplateThemePreviewPane; |
||||
import com.fr.design.mainframe.theme.preview.ChartPreviewPane; |
||||
import com.fr.general.Background; |
||||
import com.fr.log.FineLoggerFactory; |
||||
import com.fr.plugin.chart.column.VanChartColumnPlot; |
||||
import com.fr.plugin.chart.vanchart.VanChart; |
||||
|
||||
import java.awt.BorderLayout; |
||||
import java.awt.Color; |
||||
import java.awt.Dimension; |
||||
import java.awt.Graphics2D; |
||||
import java.awt.geom.Rectangle2D; |
||||
|
||||
import static com.fr.widgettheme.util.ThemePreviewPaneInitHelper.initColumnPlot; |
||||
import static com.fr.widgettheme.util.ThemePreviewPaneInitHelper.initVanChartYAxis; |
||||
import static com.fr.widgettheme.util.ThemePreviewPaneInitHelper.initVanChartsTools; |
||||
|
||||
/** |
||||
* 主题界面预览控cpt界面,就是主jar里的那个界面,做了简单的修改 |
||||
* |
||||
* @author John.Ying |
||||
* @since 11.0 |
||||
* Created on 2023/3/18 |
||||
*/ |
||||
public class WidgetDisplayReportThemePreviewPane extends TemplateThemePreviewPane<ReportTheme> { |
||||
private Background background; |
||||
|
||||
private final WidgetThemeECReportPreviewPane reportPreviewPane; |
||||
|
||||
private final ChartPreviewPane chartPreviewPane; |
||||
|
||||
private final ControlPreviewPane controlPreviewPane; |
||||
|
||||
public WidgetDisplayReportThemePreviewPane() { |
||||
setLayout(FRGUIPaneFactory.createBorderLayout()); |
||||
chartPreviewPane = new ChartPreviewPane(); |
||||
chartPreviewPane.setPreferredSize(new Dimension(615, 207)); |
||||
chartPreviewPane.populate(initColumnChart()); |
||||
chartPreviewPane.setCallbackEvent(this); |
||||
reportPreviewPane = new WidgetThemeECReportPreviewPane(); |
||||
reportPreviewPane.setPreferredSize(new Dimension(615, 257)); |
||||
controlPreviewPane = new ControlPreviewPane(); |
||||
controlPreviewPane.setLayout(FRGUIPaneFactory.createLabelFlowLayout()); |
||||
controlPreviewPane.setPreferredSize(new Dimension(615, 40)); |
||||
controlPreviewPane.initControlPreviewPane(); |
||||
this.add(reportPreviewPane, BorderLayout.CENTER); |
||||
this.add(chartPreviewPane, BorderLayout.SOUTH); |
||||
this.add(controlPreviewPane, BorderLayout.NORTH); |
||||
} |
||||
|
||||
@Override |
||||
public void refresh(ReportTheme theme) { |
||||
background = theme.getBodyStyle().getBackground(); |
||||
reportPreviewPane.refresh(theme); |
||||
chartPreviewPane.refresh(theme); |
||||
controlPreviewPane.refresh(theme); |
||||
repaint(); |
||||
} |
||||
|
||||
|
||||
protected void paintBackground(Graphics2D g2d) { |
||||
if (background == null) { |
||||
background = ColorBackground.getInstance(Color.WHITE); |
||||
} |
||||
background.paint(g2d, new Rectangle2D.Double(0, 0, PREVIEW_WIDTH, PREVIEW_HEIGHT)); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* 初始化柱形图 |
||||
* |
||||
* @return chartCollection |
||||
*/ |
||||
private ChartCollection initColumnChart() { |
||||
try { |
||||
VanChart chart = (VanChart) ChartTypeManager.getInstance().getCharts(VanChartColumnPlot.VAN_CHART_COLUMN_PLOT_ID)[0].clone(); |
||||
initColumnChartDetail(chart); |
||||
Object[] category = { |
||||
Toolkit.i18nText("Fine-Design_Chart_Category") + "1", |
||||
Toolkit.i18nText("Fine-Design_Chart_Category") + "2", |
||||
Toolkit.i18nText("Fine-Design_Chart_Category") + "3", |
||||
Toolkit.i18nText("Fine-Design_Chart_Category") + "4" |
||||
}; |
||||
Object[] series = { |
||||
Toolkit.i18nText("Fine-Design_Chart_Series") + "1", |
||||
Toolkit.i18nText("Fine-Design_Chart_Series") + "2", |
||||
Toolkit.i18nText("Fine-Design_Chart_Series") + "3" |
||||
}; |
||||
Object[][] value = { |
||||
{"340", "510", "300", "250"}, |
||||
{"180", "360", "170", "100"}, |
||||
{"210", "205", "405", "190"} |
||||
}; |
||||
NormalChartData normalChartData = new NormalChartData(category, series, value); |
||||
chart.setPreViewChartData(normalChartData); |
||||
ChartCollection chartCollection = new ChartCollection(chart); |
||||
return chartCollection; |
||||
} catch (Exception ex) { |
||||
FineLoggerFactory.getLogger().error(ex.getMessage(), ex); |
||||
} |
||||
return null; |
||||
} |
||||
|
||||
private void initColumnChartDetail(VanChart chart) { |
||||
initVanChartsTools(chart.getVanChartTools()); |
||||
VanChartColumnPlot plot = chart.getPlot(); |
||||
initColumnPlot(plot); |
||||
initVanChartYAxis(plot.getDefaultYAxis()); |
||||
} |
||||
} |
@ -0,0 +1,35 @@
|
||||
package com.fr.widgettheme.theme.panel; |
||||
|
||||
import com.fr.base.theme.FormTheme; |
||||
import com.fr.design.mainframe.theme.preview.ComponentPreviewPane; |
||||
|
||||
import java.awt.Component; |
||||
|
||||
import static com.fr.design.i18n.Toolkit.i18nText; |
||||
|
||||
/** |
||||
* 决策报表主题界面的那个表格+标题部分 |
||||
* |
||||
* @author John.Ying |
||||
* @since 1.0 |
||||
* Created on 2021/3/18 |
||||
*/ |
||||
public class WidgetThemeECComponentPreviewPane extends ComponentPreviewPane { |
||||
private WidgetThemeECPreviewPane contentPane; |
||||
|
||||
public WidgetThemeECComponentPreviewPane() { |
||||
super(i18nText("Fine-Design_Basic_Template_Theme_Profile_Pane_EC_Title")); |
||||
} |
||||
|
||||
@Override |
||||
protected Component createContentPane() { |
||||
contentPane = new WidgetThemeECPreviewPane(); |
||||
return contentPane; |
||||
} |
||||
|
||||
@Override |
||||
public void refresh(FormTheme theme) { |
||||
super.refresh(theme); |
||||
contentPane.refresh(theme); |
||||
} |
||||
} |
@ -0,0 +1,112 @@
|
||||
package com.fr.widgettheme.theme.panel; |
||||
|
||||
import com.fr.base.CellBorderSourceFlag; |
||||
import com.fr.base.theme.TemplateTheme; |
||||
import com.fr.base.theme.settings.ThemedCellStyleList; |
||||
import com.fr.design.i18n.Toolkit; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.design.mainframe.theme.preview.UINoOpaquePanel; |
||||
import com.fr.design.mainframe.theme.preview.ecpreview.AbstractECPreviewPane; |
||||
import com.fr.design.mainframe.theme.preview.ecpreview.cell.AbstractPreviewCell; |
||||
import com.fr.design.mainframe.theme.preview.ecpreview.cell.PreviewCell; |
||||
|
||||
import javax.swing.BorderFactory; |
||||
import javax.swing.JPanel; |
||||
import java.awt.BorderLayout; |
||||
import java.awt.Dimension; |
||||
import java.awt.GridLayout; |
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
|
||||
/** |
||||
* 主题界面frm里的那个表格,做了简单修改,削减了几行重复内容,腾出控件参数面板的空间 |
||||
* |
||||
* @author John.Ying |
||||
* @since 11.0 |
||||
* Created on 2021/3/18 |
||||
*/ |
||||
public class WidgetThemeECPreviewPane extends AbstractECPreviewPane { |
||||
private final List<AbstractPreviewCell> headerCellList = new ArrayList<>(); |
||||
private final List<AbstractPreviewCell> contentCellList = new ArrayList<>(); |
||||
private final List<AbstractPreviewCell> highLightCellList = new ArrayList<>(); |
||||
private final List<AbstractPreviewCell> assistCellList = new ArrayList<>(); |
||||
private static final int COL_COUNT = 5; |
||||
private static final int CONTENT_ROW_COUNT = 1; |
||||
|
||||
public WidgetThemeECPreviewPane() { |
||||
this.setPreferredSize(new Dimension(517, 158 - 36)); |
||||
this.setBorder(BorderFactory.createEmptyBorder(0, 1, 2, 1)); |
||||
this.setLayout(FRGUIPaneFactory.createBorderLayout()); |
||||
JPanel titlePane = new UINoOpaquePanel(new GridLayout()); |
||||
JPanel extCenterPane = FRGUIPaneFactory.createBorderLayout_NO_Opaque_Pane(); |
||||
this.add(extCenterPane, BorderLayout.CENTER); |
||||
extCenterPane.add(titlePane, BorderLayout.NORTH); |
||||
for (int c = 0; c < COL_COUNT; c++) { |
||||
PreviewCell cell = new PreviewCell(Toolkit.i18nText("Fine-Design_Basic_Predefined_Style_Header")); |
||||
int flag = CellBorderSourceFlag.ALL_BORDER_SOURCE_OUTER; |
||||
if (c > 0) { |
||||
flag |= CellBorderSourceFlag.LEFT_BORDER_SOURCE_INNER; |
||||
} |
||||
if (c < COL_COUNT - 1) { |
||||
flag |= CellBorderSourceFlag.RIGHT_BORDER_SOURCE_INNER; |
||||
} |
||||
cell.setBorderSourceFlag(flag); |
||||
cell.setPreferredSize(new Dimension(103, 36)); |
||||
titlePane.add(cell); |
||||
headerCellList.add(cell); |
||||
} |
||||
JPanel contentPane = new UINoOpaquePanel(new GridLayout(1, 5, 0, 0)); |
||||
extCenterPane.add(contentPane, BorderLayout.CENTER); |
||||
for (int i = 0; i < COL_COUNT * CONTENT_ROW_COUNT; i++) { |
||||
PreviewCell cell = new PreviewCell(Toolkit.i18nText("Fine-Design_Basic_Predefined_Style_Main_Text")); |
||||
int c = i % COL_COUNT; |
||||
int flag = CellBorderSourceFlag.ALL_BORDER_SOURCE_OUTER; |
||||
if (c > 0) { |
||||
flag |= CellBorderSourceFlag.LEFT_BORDER_SOURCE_INNER; |
||||
} |
||||
if (c < COL_COUNT - 1) { |
||||
flag |= CellBorderSourceFlag.RIGHT_BORDER_SOURCE_INNER; |
||||
} |
||||
cell.setBorderSourceFlag(flag); |
||||
cell.setPreferredSize(new Dimension(103, 30)); |
||||
contentPane.add(cell); |
||||
contentCellList.add(cell); |
||||
} |
||||
|
||||
JPanel endPane = new UINoOpaquePanel(new GridLayout()); |
||||
extCenterPane.add(endPane, BorderLayout.SOUTH); |
||||
for (int c = 0; c < COL_COUNT; c++) { |
||||
PreviewCell cell = new PreviewCell(Toolkit.i18nText("Fine-Design_Basic_Predefined_Style_Highlight_Text")); |
||||
int flag = CellBorderSourceFlag.ALL_BORDER_SOURCE_OUTER; |
||||
if (c > 0) { |
||||
flag |= CellBorderSourceFlag.LEFT_BORDER_SOURCE_INNER; |
||||
} |
||||
if (c < COL_COUNT - 1) { |
||||
flag |= CellBorderSourceFlag.RIGHT_BORDER_SOURCE_INNER; |
||||
} |
||||
cell.setBorderSourceFlag(flag); |
||||
cell.setPreferredSize(new Dimension(103, 30)); |
||||
endPane.add(cell); |
||||
highLightCellList.add(cell); |
||||
} |
||||
|
||||
JPanel extSouthPane = FRGUIPaneFactory.createBorderLayout_NO_Opaque_Pane(); |
||||
PreviewCell assistCell = new PreviewCell(Toolkit.i18nText("Fine-Design_Basic_Predefined_Style_Assist_Text")); |
||||
assistCell.setBorderSourceFlag(CellBorderSourceFlag.ALL_BORDER_SOURCE_OUTER); |
||||
assistCell.setPreferredSize(new Dimension(123, 30)); |
||||
assistCellList.add(assistCell); |
||||
extSouthPane.add(assistCell); |
||||
this.add(extSouthPane, BorderLayout.SOUTH); |
||||
} |
||||
|
||||
@Override |
||||
public void refresh(TemplateTheme theme) { |
||||
ThemedCellStyleList cellStyleConfig = theme.getCellStyleList(); |
||||
refresh(headerCellList, cellStyleConfig.getUse4Header()); |
||||
refresh(contentCellList, cellStyleConfig.getUse4MainText()); |
||||
refresh(highLightCellList, cellStyleConfig.getUse4HighlightText()); |
||||
refresh(assistCellList, cellStyleConfig.getUse4SupportInfo()); |
||||
} |
||||
|
||||
|
||||
} |
@ -0,0 +1,248 @@
|
||||
package com.fr.widgettheme.theme.panel; |
||||
|
||||
import com.fr.base.CellBorderSourceFlag; |
||||
import com.fr.base.theme.ReportTheme; |
||||
import com.fr.base.theme.TemplateTheme; |
||||
import com.fr.base.theme.settings.ThemedCellStyleList; |
||||
import com.fr.design.i18n.Toolkit; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.design.mainframe.theme.preview.ThemePreviewed; |
||||
import com.fr.design.mainframe.theme.preview.UINoOpaquePanel; |
||||
import com.fr.design.mainframe.theme.preview.ecpreview.AbstractECPreviewPane; |
||||
import com.fr.design.mainframe.theme.preview.ecpreview.cell.AbstractPreviewCell; |
||||
import com.fr.design.mainframe.theme.preview.ecpreview.cell.CornerPreviewCell; |
||||
import com.fr.design.mainframe.theme.preview.ecpreview.cell.PreviewCell; |
||||
|
||||
import javax.swing.BorderFactory; |
||||
import javax.swing.JPanel; |
||||
import java.awt.BorderLayout; |
||||
import java.awt.Dimension; |
||||
import java.awt.GridLayout; |
||||
import java.awt.Point; |
||||
import java.awt.geom.Point2D; |
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
|
||||
/** |
||||
* 主题界面report里的那个表格,做了简单修改,削减了几行重复内容,腾出控件参数面板的空间 |
||||
* |
||||
* @author John.Ying |
||||
* @since 1.0 |
||||
* Created on 2021/3/18 |
||||
*/ |
||||
public class WidgetThemeECReportPreviewPane extends UINoOpaquePanel implements ThemePreviewed<ReportTheme> { |
||||
private final List<AbstractPreviewCell> headerTitleCellList = new ArrayList<>(); // 大标题样式单元格
|
||||
private final List<AbstractPreviewCell> headerCellList = new ArrayList<>(); // 表头样式单元格
|
||||
private final List<AbstractPreviewCell> titleCellList = new ArrayList<>(); // 小标题样式单元格
|
||||
private final List<AbstractPreviewCell> contentCellList = new ArrayList<>(); // 正文样式单元格
|
||||
private final List<AbstractPreviewCell> highLightCellList = new ArrayList<>(); // 高亮文本样式单元格
|
||||
private final List<AbstractPreviewCell> assistCellList = new ArrayList<>(); // 辅助信息样式单元格
|
||||
private static final int CONTENT_ROW_COUNT = 3; |
||||
private static final int COL_COUNT = 3; |
||||
|
||||
private final PreviewPane previewPane; |
||||
|
||||
public WidgetThemeECReportPreviewPane() { |
||||
this.setLayout(FRGUIPaneFactory.createBorderLayout()); |
||||
previewPane = new PreviewPane(); |
||||
this.add(previewPane, BorderLayout.CENTER); |
||||
} |
||||
|
||||
@Override |
||||
public void refresh(ReportTheme theme) { |
||||
previewPane.refresh(theme); |
||||
} |
||||
|
||||
|
||||
class PreviewPane extends AbstractECPreviewPane { |
||||
|
||||
|
||||
public PreviewPane() { |
||||
this.setPreferredSize(new Dimension(517, 208)); |
||||
this.setBorder(BorderFactory.createEmptyBorder(5, 10, 5, 10)); |
||||
|
||||
this.setLayout(FRGUIPaneFactory.createBorderLayout()); |
||||
JPanel northPane = createNorthPane(); |
||||
JPanel centerPane = createCenterPane(); |
||||
JPanel southPane = createSouthPane(); |
||||
this.add(northPane, BorderLayout.NORTH); |
||||
this.add(centerPane, BorderLayout.CENTER); |
||||
this.add(southPane, BorderLayout.SOUTH); |
||||
} |
||||
|
||||
private JPanel createNorthPane() { |
||||
JPanel northPane = FRGUIPaneFactory.createBorderLayout_NO_Opaque_Pane(); |
||||
AbstractPreviewCell bigTitleCell = new PreviewCell(Toolkit.i18nText("Fine-Design_Basic_Template_Theme_Profile_Pane_Cell_Style_Big_Title")); |
||||
bigTitleCell.setBorderSourceFlag(CellBorderSourceFlag.ALL_BORDER_SOURCE_OUTER); |
||||
bigTitleCell.setPreferredSize(new Dimension(615, 46)); |
||||
headerTitleCellList.add(bigTitleCell); |
||||
northPane.add(bigTitleCell, BorderLayout.NORTH); |
||||
CornerPreviewCell cornerCell = createCornerPreviewCell(); |
||||
titleCellList.add(cornerCell); |
||||
northPane.add(cornerCell, BorderLayout.WEST); |
||||
JPanel centerPane = FRGUIPaneFactory.createBorderLayout_NO_Opaque_Pane(); |
||||
northPane.add(centerPane, BorderLayout.CENTER); |
||||
PreviewCell cell = new PreviewCell(Toolkit.i18nText("Fine-Design_Basic_Predefined_Style_Small_Title")); |
||||
cell.setBorderSourceFlag(CellBorderSourceFlag.ALL_BORDER_SOURCE_OUTER); |
||||
titleCellList.add(cell); |
||||
cell.setPreferredSize(new Dimension(308, 38)); |
||||
centerPane.add(cell, BorderLayout.NORTH); |
||||
JPanel eastSouthPane = new UINoOpaquePanel(new GridLayout()); |
||||
for (int c = 0; c < CONTENT_ROW_COUNT; c++) { |
||||
PreviewCell headerCell = createPreviewCellHeader(c); |
||||
headerCellList.add(headerCell); |
||||
eastSouthPane.add(headerCell); |
||||
} |
||||
centerPane.add(eastSouthPane, BorderLayout.CENTER); |
||||
return northPane; |
||||
} |
||||
|
||||
/** |
||||
* 创建CornerPreviewCell |
||||
*/ |
||||
private CornerPreviewCell createCornerPreviewCell() { |
||||
CornerPreviewCell cornerCell = new CornerPreviewCell(new String[]{Toolkit.i18nText("Fine-Design_Basic_Column_Name"), |
||||
Toolkit.i18nText("Fine-Design_Basic_Template_Theme_Profile_Pane_EC_Data"), Toolkit.i18nText("Fine-Design_Basic_Template_Theme_Profile_Pane_Row_Name")}, |
||||
new Point2D[]{new Point(159, 71), new Point(225, 49)}); |
||||
cornerCell.setBorderSourceFlag(CellBorderSourceFlag.INVALID_BORDER_SOURCE); |
||||
cornerCell.setPreferredSize(new Dimension(225, 71)); |
||||
return cornerCell; |
||||
} |
||||
|
||||
/** |
||||
* 创建预览单元格标题 |
||||
* |
||||
* @param c 文本行数 |
||||
* @return PreviewCell |
||||
*/ |
||||
private PreviewCell createPreviewCellHeader(int c) { |
||||
PreviewCell headerCell = new PreviewCell(Toolkit.i18nText("Fine-Design_Basic_Predefined_Style_Header")); |
||||
int flag = CellBorderSourceFlag.ALL_BORDER_SOURCE_OUTER; |
||||
if (c > 0) { |
||||
flag |= CellBorderSourceFlag.LEFT_BORDER_SOURCE_INNER; |
||||
} |
||||
if (c < CONTENT_ROW_COUNT - 1) { |
||||
flag |= CellBorderSourceFlag.RIGHT_BORDER_SOURCE_INNER; |
||||
} |
||||
headerCell.setBorderSourceFlag(flag); |
||||
return headerCell; |
||||
} |
||||
|
||||
private JPanel createCenterPane() { |
||||
JPanel centerPane = FRGUIPaneFactory.createBorderLayout_NO_Opaque_Pane(); |
||||
JPanel westPane = FRGUIPaneFactory.createBorderLayout_NO_Opaque_Pane(); |
||||
centerPane.add(westPane, BorderLayout.WEST); |
||||
PreviewCell cell1 = new PreviewCell(Toolkit.i18nText("Fine-Design_Basic_Predefined_Style_Small_Title")); |
||||
titleCellList.add(cell1); |
||||
cell1.setPreferredSize(new Dimension(112, 93)); |
||||
westPane.add(cell1, BorderLayout.WEST); |
||||
JPanel gridPane = createGridPane(); |
||||
|
||||
westPane.add(gridPane, BorderLayout.CENTER); |
||||
JPanel innerCenterPane = new UINoOpaquePanel(new GridLayout(3, 3)); |
||||
centerPane.add(innerCenterPane, BorderLayout.CENTER); |
||||
for (int i = 0; i < COL_COUNT*CONTENT_ROW_COUNT; i++) { |
||||
PreviewCell cell ; |
||||
int r = i / CONTENT_ROW_COUNT; |
||||
int c = i % CONTENT_ROW_COUNT; |
||||
if (c == CONTENT_ROW_COUNT - 1) { |
||||
cell = createPreviewCellHighlight(r); |
||||
highLightCellList.add(cell); |
||||
} else { |
||||
cell = createPreviewCellMain(r, c); |
||||
contentCellList.add(cell); |
||||
} |
||||
cell.setPreferredSize(new Dimension(123, 31)); |
||||
innerCenterPane.add(cell); |
||||
} |
||||
return centerPane; |
||||
} |
||||
|
||||
/** |
||||
* 创建高亮预览单元格 |
||||
* |
||||
* @param r 计算标志位 |
||||
* @return 单元格 |
||||
*/ |
||||
private PreviewCell createPreviewCellHighlight(int r) { |
||||
PreviewCell cell = new PreviewCell(Toolkit.i18nText("Fine-Design_Basic_Predefined_Style_Highlight_Text")); |
||||
int flag = CellBorderSourceFlag.ALL_BORDER_SOURCE_OUTER; |
||||
if (r != 0) { |
||||
flag |= CellBorderSourceFlag.TOP_BORDER_SOURCE_INNER; |
||||
} |
||||
if (r != COL_COUNT - 1) { |
||||
flag |= CellBorderSourceFlag.BOTTOM_BORDER_SOURCE_INNER; |
||||
} |
||||
cell.setBorderSourceFlag(flag); |
||||
return cell; |
||||
} |
||||
|
||||
/** |
||||
* 创建正文预览单元格 |
||||
* |
||||
* @param r 计算标志位 |
||||
* @param c 计算标志位 |
||||
* @return 单元格 |
||||
*/ |
||||
private PreviewCell createPreviewCellMain(int r, int c) { |
||||
PreviewCell cell = new PreviewCell(Toolkit.i18nText("Fine-Design_Basic_Predefined_Style_Main_Text")); |
||||
int flag = CellBorderSourceFlag.ALL_BORDER_SOURCE_OUTER; |
||||
if (r > 0) { |
||||
flag |= CellBorderSourceFlag.TOP_BORDER_SOURCE_INNER; |
||||
} |
||||
if (r < COL_COUNT - 1) { |
||||
flag |= CellBorderSourceFlag.BOTTOM_BORDER_SOURCE_INNER; |
||||
} |
||||
if (c > 0) { |
||||
flag |= CellBorderSourceFlag.LEFT_BORDER_SOURCE_INNER; |
||||
} |
||||
if (c < 1) { |
||||
flag |= CellBorderSourceFlag.RIGHT_BORDER_SOURCE_INNER; |
||||
} |
||||
cell.setBorderSourceFlag(flag); |
||||
return cell; |
||||
} |
||||
|
||||
private JPanel createGridPane() { |
||||
int rowCount = 3; |
||||
int columnCount = 1; |
||||
JPanel gridPane = new UINoOpaquePanel(new GridLayout(rowCount, columnCount)); |
||||
for (int r = 0; r < rowCount; r++) { |
||||
PreviewCell cell = new PreviewCell(Toolkit.i18nText("Fine-Design_Basic_Predefined_Style_Header")); |
||||
int flag = CellBorderSourceFlag.ALL_BORDER_SOURCE_OUTER; |
||||
if (r > 0) { |
||||
flag |= CellBorderSourceFlag.TOP_BORDER_SOURCE_INNER; |
||||
} |
||||
if (r < COL_COUNT - 1) { |
||||
flag |= CellBorderSourceFlag.BOTTOM_BORDER_SOURCE_INNER; |
||||
} |
||||
cell.setBorderSourceFlag(flag); |
||||
cell.setPreferredSize(new Dimension(113, 31)); |
||||
headerCellList.add(cell); |
||||
gridPane.add(cell); |
||||
} |
||||
return gridPane; |
||||
} |
||||
|
||||
private JPanel createSouthPane(){ |
||||
JPanel southPane = FRGUIPaneFactory.createBorderLayout_NO_Opaque_Pane(); |
||||
PreviewCell assistCell = new PreviewCell(Toolkit.i18nText("Fine-Design_Basic_Predefined_Style_Assist_Text")); |
||||
assistCell.setBorderSourceFlag(CellBorderSourceFlag.ALL_BORDER_SOURCE_OUTER); |
||||
assistCell.setPreferredSize(new Dimension(123, 30)); |
||||
assistCellList.add(assistCell); |
||||
southPane.add(assistCell, BorderLayout.CENTER); |
||||
return southPane; |
||||
} |
||||
|
||||
@Override |
||||
public void refresh(TemplateTheme theme) { |
||||
ThemedCellStyleList cellStyleConfig = theme.getCellStyleList(); |
||||
refresh(headerTitleCellList, cellStyleConfig.getUse4BigTitle()); |
||||
refresh(headerCellList, cellStyleConfig.getUse4Header()); |
||||
refresh(contentCellList, cellStyleConfig.getUse4MainText()); |
||||
refresh(titleCellList, cellStyleConfig.getUse4SmallTitle()); |
||||
refresh(highLightCellList, cellStyleConfig.getUse4HighlightText()); |
||||
refresh(assistCellList, cellStyleConfig.getUse4SupportInfo()); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,70 @@
|
||||
package com.fr.widgettheme.util; |
||||
|
||||
import com.fr.base.BaseFormula; |
||||
import com.fr.chart.chartattr.Title; |
||||
import com.fr.design.i18n.Toolkit; |
||||
import com.fr.plugin.chart.attr.axis.VanChartAxis; |
||||
import com.fr.plugin.chart.base.AttrLabel; |
||||
import com.fr.plugin.chart.base.VanChartTools; |
||||
import com.fr.plugin.chart.column.VanChartColumnPlot; |
||||
import com.fr.plugin.chart.type.GradientType; |
||||
|
||||
/** |
||||
* 辅助report和form的控件显示主题预览窗口做初始化工作 |
||||
* 没有其他的用途,不要用在其他的地方,只是抽一些方法出来,降低复杂度 |
||||
* |
||||
* @author obo |
||||
* @since 11.0 |
||||
* Created on 2023/11/14 |
||||
*/ |
||||
public class ThemePreviewPaneInitHelper { |
||||
private ThemePreviewPaneInitHelper() { |
||||
} |
||||
|
||||
/** |
||||
* 初始化图表工具 |
||||
* |
||||
* @param vanChartTools 图表工具 |
||||
*/ |
||||
public static void initVanChartsTools(VanChartTools vanChartTools) { |
||||
vanChartTools.setSort(false); |
||||
vanChartTools.setExport(false); |
||||
vanChartTools.setFullScreen(false); |
||||
} |
||||
|
||||
/** |
||||
* 初始化柱形图绘图区 |
||||
* |
||||
* @param plot 绘图区 |
||||
*/ |
||||
public static void initColumnPlot(VanChartColumnPlot plot) { |
||||
AttrLabel defaultAttrLabel = plot.getDefaultAttrLabel(); |
||||
defaultAttrLabel.setEnable(true); |
||||
defaultAttrLabel.getAttrLabelDetail().getBorder().setBorderStyle(0); |
||||
defaultAttrLabel.getAttrLabelDetail().getBackground().setBackground(null); |
||||
plot.getConditionCollection().getDefaultAttr().addDataSeriesCondition(defaultAttrLabel); |
||||
plot.getGradientStyle().setGradientType(GradientType.NONE); |
||||
plot.setSeriesOverlapPercent(30); |
||||
plot.setCategoryIntervalPercent(30); |
||||
} |
||||
|
||||
/** |
||||
* 初始化图表Y轴 |
||||
* |
||||
* @param yAxis 轴 |
||||
*/ |
||||
public static void initVanChartYAxis(VanChartAxis yAxis) { |
||||
Title title = new Title(); |
||||
title.setTextObject(Toolkit.i18nText("Fine-Design_Chart_Axis_Title")); |
||||
title.getTextAttr().setRotation(-90); |
||||
title.getTextAttr().setThemed(true); |
||||
yAxis.setTitle(title); |
||||
yAxis.setShowAxisTitle(true); |
||||
yAxis.setCustomMaxValue(true); |
||||
yAxis.setCustomMinValue(true); |
||||
yAxis.setCustomMainUnit(true); |
||||
yAxis.setMaxValue(BaseFormula.createFormulaBuilder().build("=600")); |
||||
yAxis.setMinValue(BaseFormula.createFormulaBuilder().build("=0")); |
||||
yAxis.setMainUnit(BaseFormula.createFormulaBuilder().build("=200")); |
||||
} |
||||
} |
@ -0,0 +1,40 @@
|
||||
package com.fr.widgettheme.util; |
||||
|
||||
import com.fr.design.gui.frpane.FontSizeComboPane; |
||||
import com.fr.design.gui.ibutton.UIColorButton; |
||||
import com.fr.design.layout.TableLayout; |
||||
import com.fr.design.layout.TableLayoutHelper; |
||||
|
||||
import javax.swing.Box; |
||||
import javax.swing.JPanel; |
||||
import java.awt.Component; |
||||
|
||||
/** |
||||
* 创建主题文本样式的工具类 |
||||
* |
||||
* @author obo |
||||
* @since 11.0 |
||||
* Created on 2023/12/21 |
||||
*/ |
||||
public class ThemeTextStylePaneCreator { |
||||
private ThemeTextStylePaneCreator() {} |
||||
|
||||
/** |
||||
* 创建主题文本样式配置面板 |
||||
* 包含字体大小下拉框和字体颜色按钮 |
||||
* 可以自适应布局 |
||||
* |
||||
* @param fontSizePane 字体大小配置 |
||||
* @param fontColorButton 字体颜色配置 |
||||
* @return 文本样式面板 |
||||
*/ |
||||
public static JPanel create(FontSizeComboPane fontSizePane, UIColorButton fontColorButton) { |
||||
Component[][] components = {{fontSizePane, Box.createHorizontalStrut(5), fontColorButton}}; |
||||
double f = TableLayout.FILL; |
||||
double p = TableLayout.PREFERRED; |
||||
double[] rowSize = {f}; |
||||
double[] columnSize = {f, p, p}; |
||||
int[][] rowCount = {{1, 1, 1}}; |
||||
return TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, 0, 0); |
||||
} |
||||
} |
@ -0,0 +1,46 @@
|
||||
package com.fr.widgettheme.util; |
||||
|
||||
import com.fr.base.io.AttrMark; |
||||
import com.fr.base.io.IOFile; |
||||
import com.fr.design.file.HistoryTemplateListCache; |
||||
import com.fr.design.mainframe.JTemplate; |
||||
import com.fr.stable.StringUtils; |
||||
import com.fr.widgettheme.control.attr.WidgetDisplayEnhanceMarkAttr; |
||||
|
||||
/** |
||||
* 控件主题设计器部分工具类 |
||||
* |
||||
* @author obo |
||||
* @since 11.0 |
||||
* Created on 2023/11/13 |
||||
*/ |
||||
public class WidgetThemeDesignerUtils { |
||||
|
||||
private WidgetThemeDesignerUtils() { |
||||
} |
||||
|
||||
/** |
||||
* 从 WorkBook 中加载 WatermarkAttr 属性对象 |
||||
* |
||||
* @param template AttrMark 对象,包括 WorkBook |
||||
* @return StrongestControlMarkAttr 对象 |
||||
*/ |
||||
public static WidgetDisplayEnhanceMarkAttr getStrongestControlAttrFromTemplate(AttrMark template) { |
||||
return template.getAttrMark(WidgetDisplayEnhanceMarkAttr.XML_TAG); |
||||
} |
||||
|
||||
/** |
||||
* 判断是否启用了控件显示增强 |
||||
* |
||||
* @return 开启与否 |
||||
*/ |
||||
public static boolean enableWidgetEnhance() { |
||||
JTemplate<?, ?> jTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); |
||||
if (JTemplate.isValid(jTemplate)) { |
||||
IOFile ioFile = (IOFile) jTemplate.getTarget(); |
||||
WidgetDisplayEnhanceMarkAttr mark = ioFile.getAttrMark(WidgetDisplayEnhanceMarkAttr.XML_TAG); |
||||
return mark != null && mark.isWidgetEnhance(); |
||||
} |
||||
return false; |
||||
} |
||||
} |
@ -0,0 +1,273 @@
|
||||
package com.fr.widgettheme.widget.mobile.pane; |
||||
|
||||
import com.fr.base.background.ColorBackground; |
||||
import com.fr.widgettheme.theme.widget.style.MobileThemedWidgetStyle; |
||||
import com.fr.widgettheme.theme.widget.mobile.style.WidgetThemeMobileCommonExtraStyle; |
||||
import com.fr.design.beans.BasicBeanPane; |
||||
import com.fr.design.constants.LayoutConstants; |
||||
import com.fr.design.designer.IntervalConstants; |
||||
import com.fr.design.file.HistoryTemplateListCache; |
||||
import com.fr.design.gui.icombobox.LineComboBox; |
||||
import com.fr.design.gui.icombobox.UIComboBox; |
||||
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.TableLayoutHelper; |
||||
import com.fr.design.mainframe.JTemplate; |
||||
import com.fr.design.mainframe.mobile.ui.MobileStyleCustomDefinePane; |
||||
import com.fr.design.style.color.ColorSelectBox; |
||||
import com.fr.design.style.color.NewColorSelectBox; |
||||
import com.fr.design.utils.gui.GUICoreUtils; |
||||
import com.fr.form.ui.Widget; |
||||
import com.fr.form.ui.mobile.MobileCommonExtraStyle; |
||||
import com.fr.form.ui.mobile.MobileStyle; |
||||
import com.fr.general.FRFont; |
||||
import com.fr.invoke.Reflect; |
||||
import com.fr.widgettheme.theme.widget.theme.WidgetThemeDisplayConstants; |
||||
import com.fr.stable.Constants; |
||||
import com.fr.stable.StringUtils; |
||||
|
||||
import javax.swing.JPanel; |
||||
import javax.swing.border.EmptyBorder; |
||||
import javax.swing.border.TitledBorder; |
||||
import java.awt.BorderLayout; |
||||
import java.awt.Color; |
||||
import java.awt.Component; |
||||
import java.awt.Dimension; |
||||
import java.awt.FlowLayout; |
||||
import java.awt.Font; |
||||
import java.awt.event.ItemEvent; |
||||
import java.awt.event.ItemListener; |
||||
|
||||
/** |
||||
* <p> 开启控件显示增强后替换原通用属性面板 |
||||
* <p> 参考{@link com.fr.design.mainframe.mobile.ui.MobileStyleDefinePane} |
||||
* |
||||
* @author Coral.Chen |
||||
* @since 11.0 |
||||
* Created on 2023/4/11 |
||||
*/ |
||||
public class DisplayEnhanceMobileStyleDefinePane extends BasicBeanPane<MobileStyle> { |
||||
public static final int NORMAL_COMBO_WIDTH = 152; |
||||
protected Widget widget; |
||||
protected MobileStyleCustomDefinePane customBeanPane; |
||||
protected Class<? extends MobileStyle> mobileStyleClazz; |
||||
protected UIComboBox customCombo; |
||||
protected JPanel settingPane; |
||||
protected NewColorSelectBox themeColorSelectBox; |
||||
protected Color titleColor = new Color(47, 142, 241); |
||||
protected JPanel commonPane; |
||||
protected LineComboBox borderType; |
||||
protected UISpinner borderRadius; |
||||
protected MobileStyleFontConfigPane fontConfigPane; |
||||
protected ColorSelectBox widgetBackgroundSelectBox; |
||||
|
||||
protected MobileStyle mobileStyle; |
||||
|
||||
public DisplayEnhanceMobileStyleDefinePane(Widget widget, Class<? extends MobileStyleCustomDefinePane> customBeanPaneClass, |
||||
Class<? extends MobileStyle> mobileStyleClazz) { |
||||
this.widget = widget; |
||||
this.customBeanPane = Reflect.on(customBeanPaneClass).create(widget).get(); |
||||
this.mobileStyleClazz = mobileStyleClazz; |
||||
// 一些默认的情况,没有,需要初始化一下。
|
||||
initMobileStyle(widget); |
||||
init(); |
||||
} |
||||
|
||||
private void initMobileStyle(Widget widget) { |
||||
mobileStyle = widget.getMobileStyle() != null ? widget.getMobileStyle() : Reflect.on(mobileStyleClazz).create().get(); |
||||
} |
||||
|
||||
@Override |
||||
public void populateBean(MobileStyle ob) { |
||||
MobileCommonExtraStyle extraStyle = ob.getMobileCommonExtraStyle(); |
||||
if (extraStyle instanceof WidgetThemeMobileCommonExtraStyle) { |
||||
WidgetThemeMobileCommonExtraStyle style = (WidgetThemeMobileCommonExtraStyle) extraStyle; |
||||
customCombo.setSelectedIndex(style.isCustom() ? 1 : 0); |
||||
borderType.setSelectedLineStyle(style.getBorderType()); |
||||
borderRadius.setValue(style.getBorderRadius()); |
||||
if (style.getThemeColor() != null) { |
||||
themeColorSelectBox.setSelectObject(style.getThemeColor()); |
||||
} |
||||
if (style.getNewFont() != null) { |
||||
fontConfigPane.populateBean(style.getNewFont()); |
||||
} |
||||
if (style.getWidgetBackground() != null) { |
||||
widgetBackgroundSelectBox.setSelectObject(((ColorBackground) style.getWidgetBackground()).getColor()); |
||||
} |
||||
} |
||||
this.customBeanPane.populateBean(ob); |
||||
} |
||||
|
||||
@Override |
||||
public MobileStyle updateBean() { |
||||
mobileStyle = Reflect.on(mobileStyleClazz).create().get(); |
||||
WidgetThemeMobileCommonExtraStyle extraStyle = new WidgetThemeMobileCommonExtraStyle(); |
||||
extraStyle.setCustom(customCombo.getSelectedIndex() == 1); |
||||
extraStyle.setThemeColor(themeColorSelectBox.getSelectObject()); |
||||
extraStyle.setBorderType(borderType.getSelectedLineStyle()); |
||||
extraStyle.setBorderRadius(borderRadius.getValue()); |
||||
extraStyle.setNewFont(fontConfigPane.updateBean()); |
||||
extraStyle.setWidgetBackground(ColorBackground.getInstance(widgetBackgroundSelectBox.getSelectObject())); |
||||
mobileStyle.setMobileCommonExtraStyle(extraStyle); |
||||
this.widget.setMobileStyle(mobileStyle); |
||||
this.customBeanPane.updateBean(); |
||||
return mobileStyle; |
||||
} |
||||
|
||||
@Override |
||||
protected String title4PopupWindow() { |
||||
return StringUtils.EMPTY; |
||||
} |
||||
|
||||
private void init() { |
||||
this.setLayout(FRGUIPaneFactory.createBorderLayout()); |
||||
createGeneralPane(); |
||||
createCustomPane(); |
||||
} |
||||
|
||||
protected void createFontPane(Color defaultFontColor) { |
||||
fontConfigPane = new MobileStyleFontConfigPane(defaultFontColor); |
||||
settingPane.add(createLeftRightComponentsPane(createConfigLabel(Toolkit.i18nText("Fine-Design_Mobile_Widget_Font")), fontConfigPane)); |
||||
} |
||||
|
||||
private void createGeneralPane() { |
||||
createPreviewPane(); |
||||
createCommonPane(); |
||||
} |
||||
|
||||
private void createPreviewPane() { |
||||
JPanel mobileStylePreviewPane = Reflect.on(customBeanPane).call("createPreviewPane").get(); |
||||
if (mobileStylePreviewPane != null) { |
||||
JPanel previewPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||
TitledBorder titledBorder = createTitledBorder(Toolkit.i18nText("Fine-Design_Basic_Widget_Style_Preview")); |
||||
previewPane.setBorder(titledBorder); |
||||
previewPane.setPreferredSize(new Dimension(500, 83)); |
||||
previewPane.add(mobileStylePreviewPane, BorderLayout.CENTER); |
||||
this.add(previewPane, BorderLayout.NORTH); |
||||
} |
||||
} |
||||
|
||||
private void createCommonPane() { |
||||
TitledBorder titledBorder = createTitledBorder(Toolkit.i18nText("Fine-Design_Mobile_Common_Attribute")); |
||||
commonPane = FRGUIPaneFactory.createVerticalFlowLayout_Pane(true, FlowLayout.LEADING, 0, 10); |
||||
commonPane.setBorder(titledBorder); |
||||
this.add(commonPane, BorderLayout.NORTH); |
||||
|
||||
|
||||
customCombo = new UIComboBox(new String[]{Toolkit.i18nText("Fine-Design_Mobile_Default"), Toolkit.i18nText("Fine-Design_Mobile_Custom")}); |
||||
customCombo.setSelectedIndex(0); |
||||
customCombo.setPreferredSize(new Dimension(NORMAL_COMBO_WIDTH + 15, 20)); |
||||
customCombo.addItemListener(new ItemListener() { |
||||
@Override |
||||
public void itemStateChanged(ItemEvent e) { |
||||
boolean custom = customCombo.getSelectedIndex() == 1; |
||||
settingPane.setVisible(custom); |
||||
} |
||||
}); |
||||
commonPane.add(createLeftRightComponentsPane(createConfigLabel(Toolkit.i18nText("Fine-Design_Mobile_Attribute_Settings")), customCombo)); |
||||
|
||||
settingPane = FRGUIPaneFactory.createVerticalFlowLayout_Pane(true, FlowLayout.LEADING, 0, 10); |
||||
settingPane.setBorder(new EmptyBorder(-10, 0, 0, 0)); |
||||
settingPane.setVisible(false); |
||||
commonPane.add(settingPane); |
||||
createUniversalPane(); |
||||
} |
||||
|
||||
protected void createUniversalPane() { |
||||
// 主题色
|
||||
createThemePane(); |
||||
// 组件背景
|
||||
createBackgroundPane(); |
||||
// 边框线型
|
||||
createBorderLinePane(); |
||||
// 圆角边框
|
||||
createBorderRadiusPane(); |
||||
// 字体
|
||||
createFontPane(WidgetThemeDisplayConstants.DEFAULT_FONT_COLOR_BLACK); |
||||
} |
||||
|
||||
|
||||
protected void createBackgroundPane() { |
||||
widgetBackgroundSelectBox = new ColorSelectBox(NORMAL_COMBO_WIDTH); |
||||
initBackgroundColor(); |
||||
JPanel backgroundPane = createLeftRightComponentsPane(createConfigLabel(Toolkit.i18nText("Fine-Design_Mobile_Widget_Background")), widgetBackgroundSelectBox); |
||||
settingPane.add(backgroundPane); |
||||
} |
||||
|
||||
protected void initBackgroundColor() { |
||||
widgetBackgroundSelectBox.setSelectObject(WidgetThemeDisplayConstants.DEFAULT_TRANSPARENT_COLOR); |
||||
} |
||||
|
||||
protected void createThemePane() { |
||||
themeColorSelectBox = new NewColorSelectBox(NORMAL_COMBO_WIDTH); |
||||
// 默认为当前模板选中的主题色
|
||||
themeColorSelectBox.setSelectObject(getCurrentTemplateThemeColor()); |
||||
settingPane.add(createLeftRightComponentsPane(createConfigLabel(Toolkit.i18nText("Fine-Design_Basic_Theme_Color")), themeColorSelectBox)); |
||||
} |
||||
|
||||
|
||||
protected void createBorderLinePane() { |
||||
borderType = new LineComboBox(WidgetThemeDisplayConstants.MOBILE_BORDER_LINE_STYLE_ARRAY); |
||||
initDefaultLineType(); |
||||
borderType.setPreferredSize(new Dimension(NORMAL_COMBO_WIDTH + 15, 20)); |
||||
// 边框线型
|
||||
settingPane.add(createLeftRightComponentsPane(createConfigLabel(Toolkit.i18nText("Fine-Design_Mobile_Widget_BorderType")), borderType)); |
||||
} |
||||
|
||||
protected void initDefaultLineType() { |
||||
borderType.setSelectedLineStyle(Constants.LINE_THIN); |
||||
} |
||||
|
||||
protected void createBorderRadiusPane() { |
||||
borderRadius = new UISpinner(0, Integer.MAX_VALUE, 1, 2); |
||||
borderRadius.setPreferredSize(new Dimension(NORMAL_COMBO_WIDTH + 20, 20)); |
||||
// 圆角边框
|
||||
settingPane.add(createLeftRightComponentsPane(createConfigLabel(Toolkit.i18nText("Fine-Design_Mobile_Widget_BorderRadius")), borderRadius)); |
||||
} |
||||
|
||||
protected void createCustomPane() { |
||||
JPanel configPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||
TitledBorder titledBorder = createTitledBorder(Toolkit.i18nText("Fine-Design_Report_Set")); |
||||
configPane.setBorder(titledBorder); |
||||
|
||||
configPane.add(this.customBeanPane, BorderLayout.CENTER); |
||||
|
||||
this.add(configPane, BorderLayout.CENTER); |
||||
} |
||||
|
||||
protected TitledBorder createTitledBorder(String title) { |
||||
TitledBorder titledBorder = GUICoreUtils.createTitledBorder(title, titleColor); |
||||
titledBorder.setTitleFont(FRFont.getInstance("PingFangSC-Regular", Font.PLAIN, 12)); |
||||
return titledBorder; |
||||
} |
||||
|
||||
protected UILabel createConfigLabel(String title) { |
||||
UILabel label = new UILabel(title, UILabel.LEFT); |
||||
label.setPreferredSize(new Dimension(75, 20)); |
||||
label.setBorder(new EmptyBorder(0, 15, 0, 0)); |
||||
return label; |
||||
} |
||||
|
||||
protected JPanel createLeftRightComponentsPane(Component... components) { |
||||
JPanel tableLayoutPane = TableLayoutHelper.createGapTableLayoutPane(new Component[][]{components}, TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_L1, LayoutConstants.VGAP_MEDIUM); |
||||
return tableLayoutPane; |
||||
} |
||||
|
||||
/** |
||||
* 获取当前编辑移动端控件样式主题色 |
||||
* |
||||
* @return |
||||
*/ |
||||
protected Color getCurrentTemplateThemeColor() { |
||||
JTemplate<?, ?> jTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); |
||||
Color themeColor = WidgetThemeDisplayConstants.DEFAULT_THEME_COLOR; |
||||
if (JTemplate.isValid(jTemplate)) { |
||||
MobileThemedWidgetStyle mobileWidgetStyle = (MobileThemedWidgetStyle) jTemplate.getTemplateTheme().getMobileWidgetStyle(); |
||||
mobileWidgetStyle = mobileWidgetStyle == null ? new MobileThemedWidgetStyle() : mobileWidgetStyle; |
||||
themeColor = mobileWidgetStyle.getThemeColor(); |
||||
} |
||||
return themeColor; |
||||
} |
||||
} |
@ -0,0 +1,59 @@
|
||||
package com.fr.widgettheme.widget.mobile.pane; |
||||
|
||||
import com.fr.base.background.ColorBackground; |
||||
import com.fr.widgettheme.theme.widget.mobile.style.FileEditorStyle; |
||||
import com.fr.design.mainframe.mobile.ui.MobileStyleCustomDefinePane; |
||||
import com.fr.form.ui.Widget; |
||||
import com.fr.form.ui.mobile.MobileCommonExtraStyle; |
||||
import com.fr.form.ui.mobile.MobileStyle; |
||||
import com.fr.invoke.Reflect; |
||||
|
||||
/** |
||||
* 文件属性定义面板 |
||||
* |
||||
* @author Coral.Chen |
||||
* @since 11.0 |
||||
* Created on 2023/5/19 |
||||
*/ |
||||
public class FileEditorMobileStyleDefinePane extends DisplayEnhanceMobileStyleDefinePane { |
||||
|
||||
public FileEditorMobileStyleDefinePane(Widget widget, Class<? extends MobileStyleCustomDefinePane> customBeanPaneClass, Class<? extends MobileStyle> mobileStyleClazz) { |
||||
super(widget, customBeanPaneClass, mobileStyleClazz); |
||||
} |
||||
|
||||
@Override |
||||
public void populateBean(MobileStyle ob) { |
||||
MobileCommonExtraStyle extraStyle = ob.getMobileCommonExtraStyle(); |
||||
if (extraStyle instanceof FileEditorStyle) { |
||||
FileEditorStyle style = (FileEditorStyle) extraStyle; |
||||
customCombo.setSelectedIndex(style.isCustom() ? 1 : 0); |
||||
if (style.getWidgetBackground() != null) { |
||||
widgetBackgroundSelectBox.setSelectObject(((ColorBackground) style.getWidgetBackground()).getColor()); |
||||
} |
||||
borderType.setSelectedLineStyle(style.getBorderType()); |
||||
borderRadius.setValue(style.getBorderRadius()); |
||||
} |
||||
this.customBeanPane.populateBean(ob); |
||||
} |
||||
|
||||
@Override |
||||
public MobileStyle updateBean() { |
||||
mobileStyle = Reflect.on(mobileStyleClazz).create().get(); |
||||
FileEditorStyle extraStyle = new FileEditorStyle(); |
||||
extraStyle.setCustom(customCombo.getSelectedIndex() == 1); |
||||
extraStyle.setWidgetBackground(ColorBackground.getInstance(widgetBackgroundSelectBox.getSelectObject())); |
||||
extraStyle.setBorderType(borderType.getSelectedLineStyle()); |
||||
extraStyle.setBorderRadius(borderRadius.getValue()); |
||||
mobileStyle.setMobileCommonExtraStyle(extraStyle); |
||||
this.widget.setMobileStyle(mobileStyle); |
||||
this.customBeanPane.updateBean(); |
||||
return mobileStyle; |
||||
} |
||||
|
||||
@Override |
||||
protected void createUniversalPane() { |
||||
createBackgroundPane(); |
||||
createBorderLinePane(); |
||||
createBorderRadiusPane(); |
||||
} |
||||
} |
@ -0,0 +1,93 @@
|
||||
package com.fr.widgettheme.widget.mobile.pane; |
||||
|
||||
import com.fr.base.background.ColorBackground; |
||||
import com.fr.widgettheme.theme.widget.mobile.style.FreeButtonStyle; |
||||
import com.fr.design.i18n.Toolkit; |
||||
import com.fr.design.mainframe.mobile.ui.MobileStyleCustomDefinePane; |
||||
import com.fr.design.style.color.NewColorSelectBox; |
||||
import com.fr.form.ui.Widget; |
||||
import com.fr.form.ui.mobile.MobileCommonExtraStyle; |
||||
import com.fr.form.ui.mobile.MobileStyle; |
||||
import com.fr.invoke.Reflect; |
||||
import com.fr.widgettheme.theme.widget.theme.WidgetThemeDisplayConstants; |
||||
|
||||
/** |
||||
* 按钮控件通用属性面板 |
||||
* |
||||
* @author Coral.Chen |
||||
* @since 11.0 |
||||
* Created on 2023/5/25 |
||||
*/ |
||||
public class FreeButtonMobileStyleDefinePane extends DisplayEnhanceMobileStyleDefinePane { |
||||
private NewColorSelectBox borderColorSelectBox; |
||||
private NewColorSelectBox iconColorSelectBox; |
||||
|
||||
|
||||
public FreeButtonMobileStyleDefinePane(Widget widget, Class<? extends MobileStyleCustomDefinePane> customBeanPaneClass, Class<? extends MobileStyle> mobileStyleClazz) { |
||||
super(widget, customBeanPaneClass, mobileStyleClazz); |
||||
} |
||||
|
||||
@Override |
||||
public void populateBean(MobileStyle ob) { |
||||
super.populateBean(ob); |
||||
MobileCommonExtraStyle extraStyle = ob.getMobileCommonExtraStyle(); |
||||
if (extraStyle instanceof FreeButtonStyle) { |
||||
FreeButtonStyle style = (FreeButtonStyle) extraStyle; |
||||
if (style.getBorderColor() != null) { |
||||
borderColorSelectBox.setSelectObject(style.getBorderColor()); |
||||
} |
||||
if (style.getIconColor() != null) { |
||||
iconColorSelectBox.setSelectObject(style.getIconColor()); |
||||
} |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public MobileStyle updateBean() { |
||||
mobileStyle = Reflect.on(mobileStyleClazz).create().get(); |
||||
FreeButtonStyle extraStyle = new FreeButtonStyle(); |
||||
extraStyle.setCustom(customCombo.getSelectedIndex() == 1); |
||||
extraStyle.setWidgetBackground(ColorBackground.getInstance(widgetBackgroundSelectBox.getSelectObject())); |
||||
extraStyle.setBorderType(borderType.getSelectedLineStyle()); |
||||
extraStyle.setBorderColor(borderColorSelectBox.getSelectObject()); |
||||
extraStyle.setBorderRadius(borderRadius.getValue()); |
||||
extraStyle.setNewFont(fontConfigPane.updateBean()); |
||||
extraStyle.setIconColor(iconColorSelectBox.getSelectObject()); |
||||
mobileStyle.setMobileCommonExtraStyle(extraStyle); |
||||
this.widget.setMobileStyle(mobileStyle); |
||||
this.customBeanPane.updateBean(); |
||||
return mobileStyle; |
||||
} |
||||
|
||||
@Override |
||||
protected void createUniversalPane() { |
||||
createBackgroundPane(); |
||||
createBorderLinePane(); |
||||
initBorderColor(); |
||||
createBorderRadiusPane(); |
||||
initIconColor(); |
||||
createFontPane(WidgetThemeDisplayConstants.DEFAULT_WHITE_COLOR); |
||||
} |
||||
|
||||
private void initIconColor() { |
||||
iconColorSelectBox = new NewColorSelectBox(NORMAL_COMBO_WIDTH); |
||||
iconColorSelectBox.setSelectObject(WidgetThemeDisplayConstants.DEFAULT_WHITE_COLOR); |
||||
settingPane.add(createLeftRightComponentsPane(createConfigLabel(Toolkit.i18nText("Fine-Design_Mobile_Widget_Icon_Color")), iconColorSelectBox)); |
||||
} |
||||
|
||||
@Override |
||||
protected void initDefaultLineType() { |
||||
borderType.setSelectedLineStyle(com.fr.stable.Constants.LINE_NONE); |
||||
} |
||||
|
||||
private void initBorderColor() { |
||||
borderColorSelectBox = new NewColorSelectBox(NORMAL_COMBO_WIDTH); |
||||
borderColorSelectBox.setSelectObject(WidgetThemeDisplayConstants.DEFAULT_THEME_COLOR); |
||||
settingPane.add(createLeftRightComponentsPane(createConfigLabel(Toolkit.i18nText("Fine-Design_Mobile_Widget_BorderColor")), borderColorSelectBox)); |
||||
} |
||||
|
||||
@Override |
||||
protected void initBackgroundColor() { |
||||
widgetBackgroundSelectBox.setSelectObject(getCurrentTemplateThemeColor()); |
||||
} |
||||
} |
@ -0,0 +1,77 @@
|
||||
package com.fr.widgettheme.widget.mobile.pane; |
||||
|
||||
import com.fr.base.background.ColorBackground; |
||||
import com.fr.widgettheme.theme.widget.mobile.style.LabelIconSettingStyle; |
||||
import com.fr.design.i18n.Toolkit; |
||||
import com.fr.design.mainframe.mobile.ui.MobileStyleCustomDefinePane; |
||||
import com.fr.design.style.color.NewColorSelectBox; |
||||
import com.fr.form.ui.Widget; |
||||
import com.fr.form.ui.mobile.MobileCommonExtraStyle; |
||||
import com.fr.form.ui.mobile.MobileStyle; |
||||
import com.fr.invoke.Reflect; |
||||
import com.fr.widgettheme.theme.widget.theme.WidgetThemeDisplayConstants; |
||||
|
||||
/** |
||||
* 标签控件属性定义面板 |
||||
* |
||||
* @author Coral.Chen |
||||
* @since 11.0 |
||||
* Created on 2023/5/15 |
||||
*/ |
||||
public class LabelMobileStyleDefinePane extends DisplayEnhanceMobileStyleDefinePane { |
||||
private NewColorSelectBox borderColorSelectBox; |
||||
|
||||
public LabelMobileStyleDefinePane(Widget widget, Class<? extends MobileStyleCustomDefinePane> customBeanPaneClass, |
||||
Class<? extends MobileStyle> mobileStyleClazz) { |
||||
super(widget, customBeanPaneClass, mobileStyleClazz); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public void populateBean(MobileStyle ob) { |
||||
super.populateBean(ob); |
||||
MobileCommonExtraStyle extraStyle = ob.getMobileCommonExtraStyle(); |
||||
if (extraStyle instanceof LabelIconSettingStyle) { |
||||
LabelIconSettingStyle style = (LabelIconSettingStyle) extraStyle; |
||||
if (style.getBorderColor() != null) { |
||||
borderColorSelectBox.setSelectObject(style.getBorderColor()); |
||||
} |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public MobileStyle updateBean() { |
||||
mobileStyle = Reflect.on(mobileStyleClazz).create().get(); |
||||
LabelIconSettingStyle extraStyle = new LabelIconSettingStyle(); |
||||
extraStyle.setCustom(customCombo.getSelectedIndex() == 1); |
||||
extraStyle.setWidgetBackground(ColorBackground.getInstance(widgetBackgroundSelectBox.getSelectObject())); |
||||
extraStyle.setBorderType(borderType.getSelectedLineStyle()); |
||||
extraStyle.setBorderColor(borderColorSelectBox.getSelectObject()); |
||||
extraStyle.setBorderRadius(borderRadius.getValue()); |
||||
extraStyle.setNewFont(fontConfigPane.updateBean()); |
||||
mobileStyle.setMobileCommonExtraStyle(extraStyle); |
||||
this.widget.setMobileStyle(mobileStyle); |
||||
this.customBeanPane.updateBean(); |
||||
return mobileStyle; |
||||
} |
||||
|
||||
@Override |
||||
protected void createUniversalPane() { |
||||
createBackgroundPane(); |
||||
createBorderLinePane(); |
||||
initBorderColor(); |
||||
createBorderRadiusPane(); |
||||
createFontPane(WidgetThemeDisplayConstants.DEFAULT_FONT_COLOR_BLACK); |
||||
} |
||||
|
||||
private void initBorderColor() { |
||||
borderColorSelectBox = new NewColorSelectBox(NORMAL_COMBO_WIDTH); |
||||
borderColorSelectBox.setSelectObject(WidgetThemeDisplayConstants.DEFAULT_TRANSPARENT_COLOR); |
||||
settingPane.add(createLeftRightComponentsPane(createConfigLabel(Toolkit.i18nText("Fine-Design_Mobile_Widget_BorderColor")), borderColorSelectBox)); |
||||
} |
||||
|
||||
@Override |
||||
protected void initDefaultLineType() { |
||||
borderType.setSelectedLineStyle(com.fr.stable.Constants.LINE_NONE); |
||||
} |
||||
} |
@ -0,0 +1,151 @@
|
||||
package com.fr.widgettheme.widget.mobile.pane; |
||||
|
||||
|
||||
import com.fr.base.BaseUtils; |
||||
import com.fr.design.constants.LayoutConstants; |
||||
import com.fr.design.gui.ibutton.UIColorButton; |
||||
import com.fr.design.gui.ibutton.UIToggleButton; |
||||
import com.fr.design.gui.icombobox.UIComboBox; |
||||
import com.fr.design.gui.icombobox.UIComboBoxRenderer; |
||||
import com.fr.design.i18n.Toolkit; |
||||
import com.fr.design.utils.gui.GUICoreUtils; |
||||
import com.fr.general.FRFont; |
||||
import com.fr.stable.Constants; |
||||
import com.fr.stable.StringUtils; |
||||
|
||||
import javax.swing.DefaultComboBoxModel; |
||||
import javax.swing.JLabel; |
||||
import javax.swing.JList; |
||||
import javax.swing.JPanel; |
||||
import javax.swing.border.EmptyBorder; |
||||
import java.awt.BorderLayout; |
||||
import java.awt.Color; |
||||
import java.awt.Component; |
||||
import java.awt.Dimension; |
||||
import java.awt.FlowLayout; |
||||
import java.awt.Font; |
||||
import java.util.Vector; |
||||
|
||||
/** |
||||
* 移动端字体面板 |
||||
* |
||||
* @author Coral.Chen |
||||
* @since 11.0 |
||||
* Created on 2023/5/22 |
||||
*/ |
||||
public class MobileStyleFontConfigPane extends JPanel { |
||||
public static final int FONT_NONE = 0; |
||||
private static final int MAX_FONT_SIZE = 18; |
||||
private static final int MIN_FONT_SIZE = 12; |
||||
private static final Dimension BUTTON_SIZE = new Dimension(20, 18); |
||||
|
||||
/** |
||||
* 获取字体大小集合 |
||||
* |
||||
* @return 字体大小集合 |
||||
*/ |
||||
public static Vector<Integer> getFontSizes() { |
||||
Vector<Integer> fontSizes = new Vector<Integer>(); |
||||
for (int i = MIN_FONT_SIZE; i <= MAX_FONT_SIZE; i++) { |
||||
fontSizes.add(i); |
||||
} |
||||
return fontSizes; |
||||
} |
||||
|
||||
private UIComboBox fontSizeComboBox; |
||||
private UIColorButton color; |
||||
private UIToggleButton italic; |
||||
private UIToggleButton bold; |
||||
|
||||
public MobileStyleFontConfigPane() { |
||||
this.initComponent(new Color(0, 0, 0)); |
||||
} |
||||
|
||||
public MobileStyleFontConfigPane(Color defaultFontColor) { |
||||
this.initComponent(defaultFontColor); |
||||
} |
||||
|
||||
private void initComponent(Color defaultFontColor) { |
||||
fontSizeComboBox = new UIComboBox(); |
||||
fontSizeComboBox.setModel(new DefaultComboBoxModel(getFontSizes())); |
||||
fontSizeComboBox.setSelectedItem(16); |
||||
fontSizeComboBox.setPreferredSize(new Dimension(60, 20)); |
||||
fontSizeComboBox.setRenderer(new LineCellRenderer()); |
||||
color = new UIColorButton(); |
||||
color.setColor(defaultFontColor); |
||||
italic = new UIToggleButton(BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/italic.png")); |
||||
bold = new UIToggleButton(BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/bold.png")); |
||||
|
||||
this.setButtonsTips(); |
||||
this.setButtonsSize(BUTTON_SIZE); |
||||
|
||||
Component[] componentFont = new Component[]{ |
||||
fontSizeComboBox, color, italic, bold |
||||
}; |
||||
|
||||
JPanel buttonPane = new JPanel(new BorderLayout()); |
||||
JPanel flowPane = GUICoreUtils.createFlowPane(componentFont, FlowLayout.LEFT, LayoutConstants.HGAP_LARGE); |
||||
// 4是flowPane的默认横向gap,但会导致最左边的控件和边上也有4的间隙,调整一下
|
||||
flowPane.setBorder(new EmptyBorder(0, -LayoutConstants.HGAP_LARGE, 0, 0)); |
||||
buttonPane.add(flowPane); |
||||
|
||||
this.setLayout(new BorderLayout(0, 0)); |
||||
this.add(buttonPane, BorderLayout.CENTER); |
||||
} |
||||
|
||||
private void setButtonsTips() { |
||||
color.setToolTipText(Toolkit.i18nText("Fine-Design_Report_Foreground")); |
||||
italic.setToolTipText(Toolkit.i18nText("Fine-Design_Report_Italic")); |
||||
bold.setToolTipText(Toolkit.i18nText("Fine-Design_Report_Bold")); |
||||
} |
||||
|
||||
private void setButtonsSize(Dimension size) { |
||||
color.setPreferredSize(size); |
||||
italic.setPreferredSize(size); |
||||
bold.setPreferredSize(size); |
||||
} |
||||
|
||||
/** |
||||
* 填充字体 |
||||
* |
||||
* @param frFont 字体 |
||||
*/ |
||||
public void populateBean(FRFont frFont) { |
||||
fontSizeComboBox.setSelectedItem(frFont.getSize()); |
||||
color.setColor(frFont.getForeground()); |
||||
bold.setSelected(frFont.isBold()); |
||||
italic.setSelected(frFont.isItalic()); |
||||
} |
||||
|
||||
/** |
||||
* 更新字体 |
||||
*/ |
||||
public FRFont updateBean() { |
||||
int style = Font.PLAIN; |
||||
style += this.bold.isSelected() ? Font.BOLD : Font.PLAIN; |
||||
style += this.italic.isSelected() ? Font.ITALIC : Font.PLAIN; |
||||
return FRFont.getInstance( |
||||
FRFont.DEFAULT_FONTNAME, |
||||
style, |
||||
Float.parseFloat(fontSizeComboBox.getSelectedItem().toString()), |
||||
color.getColor(), |
||||
Constants.LINE_NONE |
||||
); |
||||
} |
||||
|
||||
private class LineCellRenderer extends UIComboBoxRenderer { |
||||
public LineCellRenderer() { |
||||
super(); |
||||
} |
||||
|
||||
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { |
||||
JLabel renderer = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); |
||||
int currentValue = ((Integer) value).intValue(); |
||||
if (currentValue == com.fr.design.mainframe.mobile.ui.MobileStyleFontConfigPane.FONT_NONE) { |
||||
renderer.setText(StringUtils.BLANK + Toolkit.i18nText("Fine-Design_Report_None")); |
||||
} |
||||
return renderer; |
||||
} |
||||
} |
||||
|
||||
} |
@ -0,0 +1,65 @@
|
||||
package com.fr.widgettheme.widget.mobile.provider; |
||||
|
||||
import com.fr.widgettheme.widget.mobile.pane.FileEditorMobileStyleDefinePane; |
||||
import com.fr.widgettheme.widget.mobile.pane.FreeButtonMobileStyleDefinePane; |
||||
import com.fr.widgettheme.widget.mobile.pane.LabelMobileStyleDefinePane; |
||||
import com.fr.widgettheme.theme.widget.mobile.style.FileEditorStyle; |
||||
import com.fr.widgettheme.theme.widget.mobile.style.FreeButtonStyle; |
||||
import com.fr.widgettheme.theme.widget.mobile.style.LabelIconSettingStyle; |
||||
import com.fr.design.beans.BasicBeanPane; |
||||
import com.fr.design.mainframe.mobile.ui.MobileStyleCustomDefinePane; |
||||
import com.fr.form.ui.FreeButton; |
||||
import com.fr.form.ui.Label; |
||||
import com.fr.form.ui.MultiFileEditor; |
||||
import com.fr.form.ui.Widget; |
||||
import com.fr.form.ui.mobile.MobileCommonExtraStyle; |
||||
import com.fr.form.ui.mobile.MobileStyle; |
||||
|
||||
/** |
||||
* 样式创建工厂 |
||||
* |
||||
* @author Coral.Chen |
||||
* @since 11.0 |
||||
* Created on 2023/5/15 |
||||
*/ |
||||
public class DisplayEnhanceMobileStyleFactory { |
||||
|
||||
/** |
||||
* 先写个简单工厂处理一下特殊的控件 |
||||
* |
||||
* @param widget |
||||
* @return 特殊控件的通用属性面板 |
||||
*/ |
||||
public static BasicBeanPane<MobileStyle> createWidgetMobileStyleDefinePane(Widget widget, Class<? extends MobileStyleCustomDefinePane> customDefinePane, Class<? extends MobileStyle> mobileStyle) { |
||||
if (widget instanceof Label) { |
||||
return new LabelMobileStyleDefinePane(widget, customDefinePane, mobileStyle); |
||||
} |
||||
if (widget instanceof MultiFileEditor) { |
||||
return new FileEditorMobileStyleDefinePane(widget, customDefinePane, mobileStyle); |
||||
} |
||||
if (widget instanceof FreeButton) { |
||||
return new FreeButtonMobileStyleDefinePane(widget, customDefinePane, mobileStyle); |
||||
} |
||||
return null; |
||||
} |
||||
|
||||
/** |
||||
* 生成控件移动端通用属性 |
||||
* |
||||
* @param widget |
||||
* @return |
||||
*/ |
||||
public static Class<? extends MobileCommonExtraStyle> classForWidgetCommonExtraStyle(Widget widget) { |
||||
if (widget instanceof Label) { |
||||
return LabelIconSettingStyle.class; |
||||
} |
||||
if (widget instanceof MultiFileEditor) { |
||||
return FileEditorStyle.class; |
||||
} |
||||
if (widget instanceof FreeButton) { |
||||
return FreeButtonStyle.class; |
||||
} |
||||
return null; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,84 @@
|
||||
package com.fr.widgettheme.widget.mobile.provider; |
||||
|
||||
import com.fr.base.io.IOFile; |
||||
import com.fr.widgettheme.widget.mobile.pane.DisplayEnhanceMobileStyleDefinePane; |
||||
import com.fr.widgettheme.theme.widget.mobile.style.WidgetThemeMobileCommonExtraStyle; |
||||
import com.fr.design.beans.BasicBeanPane; |
||||
import com.fr.design.file.HistoryTemplateListCache; |
||||
import com.fr.design.mainframe.JTemplate; |
||||
import com.fr.design.mainframe.mobile.ui.MobileStyleCustomDefinePane; |
||||
import com.fr.form.ui.FreeButton; |
||||
import com.fr.form.ui.Label; |
||||
import com.fr.form.ui.MultiFileEditor; |
||||
import com.fr.form.ui.Widget; |
||||
import com.fr.form.ui.mobile.MobileCommonExtraStyle; |
||||
import com.fr.form.ui.mobile.MobileStyle; |
||||
import com.fr.log.FineLoggerFactory; |
||||
import com.fr.widgettheme.control.attr.WidgetDisplayEnhanceMarkAttr; |
||||
import org.jetbrains.annotations.NotNull; |
||||
|
||||
/** |
||||
* 控件主题移动端样式窗口创建类 |
||||
* |
||||
* @author obo |
||||
* @since 11.0 |
||||
* Created on 2023/11/13 |
||||
*/ |
||||
public class WidgetThemeMobileStyleDefinePaneCreator { |
||||
|
||||
private WidgetThemeMobileStyleDefinePaneCreator() { |
||||
} |
||||
|
||||
/** |
||||
* 创建移动端控件样式属性窗口 |
||||
* |
||||
* @param widget 控件 |
||||
* @param customDefinePane 窗口类 |
||||
* @param mobileStyle 样式类 |
||||
* @return 窗口 |
||||
*/ |
||||
public static BasicBeanPane<MobileStyle> createBaseBeanPane(Widget widget, Class<? extends MobileStyleCustomDefinePane> customDefinePane, Class<? extends MobileStyle> mobileStyle) { |
||||
try { |
||||
JTemplate<?, ?> jTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); |
||||
if (JTemplate.isValid(jTemplate)) { |
||||
IOFile ioFile = (IOFile) jTemplate.getTarget(); |
||||
WidgetDisplayEnhanceMarkAttr mark = ioFile.getAttrMark(WidgetDisplayEnhanceMarkAttr.XML_TAG); |
||||
if (mark != null && mark.isWidgetEnhance()) { |
||||
if (commonWidget(widget)) { |
||||
return new DisplayEnhanceMobileStyleDefinePane(widget, customDefinePane, mobileStyle); |
||||
} else { |
||||
return DisplayEnhanceMobileStyleFactory.createWidgetMobileStyleDefinePane(widget, customDefinePane, mobileStyle); |
||||
} |
||||
} |
||||
} |
||||
} catch (Exception e) { |
||||
FineLoggerFactory.getLogger().error("[Strongest-Control]: create base bean pane failed.", e); |
||||
} |
||||
return null; |
||||
} |
||||
|
||||
/** |
||||
* 根据控件获取通用扩展属性类 |
||||
* |
||||
* @param widget 控件 |
||||
* @return class
|
||||
*/ |
||||
public static @NotNull Class<? extends MobileCommonExtraStyle> classForCommonExtraStyle(Widget widget) { |
||||
if (commonWidget(widget)) { |
||||
return WidgetThemeMobileCommonExtraStyle.class; |
||||
} else { |
||||
return DisplayEnhanceMobileStyleFactory.classForWidgetCommonExtraStyle(widget); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 是否为普通控件 |
||||
* 按钮控件、标签控件、文件控件需要特殊处理 |
||||
* |
||||
* @param widget 控件 |
||||
* @return 是/否 |
||||
*/ |
||||
private static boolean commonWidget(Widget widget) { |
||||
return !((widget instanceof FreeButton) || (widget instanceof Label) || (widget instanceof MultiFileEditor)); |
||||
} |
||||
} |
After Width: | Height: | Size: 285 B |
After Width: | Height: | Size: 595 B |
@ -0,0 +1,41 @@
|
||||
package com.fr.design.data.tabledata.tabledatapane; |
||||
|
||||
import com.fr.base.Parameter; |
||||
import com.fr.design.data.datapane.sqlpane.SQLEditPane; |
||||
import com.fr.invoke.Reflect; |
||||
import junit.framework.TestCase; |
||||
import org.junit.Assert; |
||||
|
||||
/** |
||||
* @author Yuan.Wang |
||||
* @since 11.0 |
||||
* Created on 2023/12/22 |
||||
*/ |
||||
public class DBTableDataPaneTest extends TestCase { |
||||
|
||||
public void testGetParameters() { |
||||
DBTableDataPane pane = new DBTableDataPane(); |
||||
SQLEditPane editPane = new SQLEditPane(); |
||||
String sql = "select distinct 类别ID from S产品\n" + |
||||
"where 1=1\n" + |
||||
"order by 类别ID\n" + |
||||
"--${ if(len(comboBox0) = 0,\"\",\"AND 类别00ID = '\" + comboBox0 + \"'\")}"; |
||||
|
||||
String sql1 = "select distinct 类别ID from S产品\n" + |
||||
"where 1=1\n" + |
||||
"order by 类别ID\n" + |
||||
"${ if(len(comboBox0) = 0,\"\",\"AND 类别00ID = '\" + comboBox0 + \"'\")}"; |
||||
editPane.setText(sql); |
||||
Reflect.on(pane).set("sqlTextPane", editPane); |
||||
Reflect.on(pane).set("pageQuery", sql); |
||||
|
||||
Parameter[] parameters = Reflect.on(pane).call("getParameters").get(); |
||||
|
||||
Assert.assertEquals(0, parameters.length); |
||||
editPane.setText(sql1); |
||||
|
||||
parameters = Reflect.on(pane).call("getParameters").get(); |
||||
Assert.assertEquals(1, parameters.length); |
||||
Assert.assertEquals(parameters[0].getName(), "comboBox0"); |
||||
} |
||||
} |
@ -0,0 +1,317 @@
|
||||
package com.fr.design.widgettheme; |
||||
|
||||
import com.fr.base.theme.TemplateTheme; |
||||
import com.fr.design.gui.frpane.FontSizeComboPane; |
||||
import com.fr.design.gui.ibutton.UIColorButton; |
||||
import com.fr.widgettheme.theme.widget.style.BorderStyle; |
||||
import com.fr.widgettheme.theme.widget.style.ThemeTextStyle; |
||||
import com.fr.widgettheme.theme.widget.style.ThemedWidgetStyle; |
||||
import com.fr.widgettheme.theme.bean.ButtonBackground; |
||||
import com.fr.design.beans.BasicBeanPane; |
||||
import com.fr.design.designer.IntervalConstants; |
||||
import com.fr.design.file.HistoryTemplateListCache; |
||||
import com.fr.design.gui.ibutton.UIButtonGroup; |
||||
import com.fr.design.gui.ibutton.UIRadioButton; |
||||
import com.fr.design.gui.icombobox.LineComboBox; |
||||
import com.fr.design.gui.ilable.UILabel; |
||||
import com.fr.design.gui.style.FRFontPane; |
||||
import com.fr.design.i18n.Toolkit; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.design.layout.TableLayout; |
||||
import com.fr.design.layout.TableLayoutHelper; |
||||
import com.fr.design.mainframe.JTemplate; |
||||
import com.fr.design.style.color.NewColorSelectBox; |
||||
import com.fr.design.widget.ui.designer.component.UIBoundSpinner; |
||||
import com.fr.form.ui.Widget; |
||||
import com.fr.general.FRFont; |
||||
import com.fr.widgettheme.theme.panel.ButtonStyleDefinedPane; |
||||
import com.fr.widgettheme.theme.widget.theme.WidgetThemeDisplayConstants; |
||||
import com.fr.widgettheme.util.ThemeTextStylePaneCreator; |
||||
|
||||
import javax.swing.BorderFactory; |
||||
import javax.swing.ButtonGroup; |
||||
import javax.swing.JPanel; |
||||
import java.awt.BorderLayout; |
||||
import java.awt.Color; |
||||
import java.awt.Component; |
||||
import java.util.HashMap; |
||||
import java.util.List; |
||||
import java.util.Map; |
||||
|
||||
/** |
||||
* 样式设置pane抽象类 |
||||
* |
||||
* @author obo |
||||
* @since 11.0 |
||||
* Created on 2023/11/13 |
||||
*/ |
||||
public abstract class BaseStyleSettingPane<T extends Widget> extends BasicBeanPane<T> { |
||||
|
||||
protected List<StyleSetting> styleSettingList; |
||||
//样式切换标题头部
|
||||
protected UIButtonGroup<String> styleSettingHead; |
||||
// 自定义样式
|
||||
protected JPanel customPane; |
||||
// 主题色
|
||||
protected NewColorSelectBox colorSelectBox; |
||||
// 风格1
|
||||
protected UIRadioButton style1; |
||||
// 风格2
|
||||
protected UIRadioButton style2; |
||||
// 边框线型
|
||||
protected LineComboBox lineComboBox; |
||||
// 圆角边框
|
||||
protected UIBoundSpinner borderRadiusSpinner; |
||||
// 字体详细设置
|
||||
protected FRFontPane frFontPane; |
||||
// 按钮背景设置
|
||||
protected ButtonStyleDefinedPane buttonStyleDefinedPane; |
||||
|
||||
protected NewColorSelectBox selectBgColorBox; |
||||
|
||||
/** |
||||
* 主题文本样式的字体大小 |
||||
*/ |
||||
protected FontSizeComboPane fontSizePane; |
||||
|
||||
/** |
||||
* 主题文本样式的字体颜色 |
||||
*/ |
||||
protected UIColorButton fontColorButton; |
||||
|
||||
private final Map<StyleSetting, UILabel> labelMap = new HashMap<>(); |
||||
private final Map<StyleSetting, Component> paneMap = new HashMap<>(); |
||||
public BaseStyleSettingPane(List<StyleSetting> styleSettingList) { |
||||
this.styleSettingList = styleSettingList; |
||||
initLabelMap(); |
||||
initStyleEditor(); |
||||
initPane(); |
||||
initDefaultValue(); |
||||
} |
||||
|
||||
protected void initPane() { |
||||
this.setLayout(FRGUIPaneFactory.createBorderLayout()); |
||||
this.add(createHeadPane(), BorderLayout.NORTH); |
||||
this.add(createCustomPane(), BorderLayout.CENTER); |
||||
} |
||||
|
||||
|
||||
protected void initStyleEditor() { |
||||
initStyle(); |
||||
colorSelectBox = new NewColorSelectBox(160, true); |
||||
lineComboBox = new LineComboBox(WidgetThemeDisplayConstants.BORDER_LINE_STYLE_ARRAY); |
||||
borderRadiusSpinner = new UIBoundSpinner(0, Integer.MAX_VALUE, 1); |
||||
frFontPane = new FRFontPane(); |
||||
buttonStyleDefinedPane = new ButtonStyleDefinedPane(); |
||||
selectBgColorBox = new NewColorSelectBox(160, true); |
||||
fontSizePane = new FontSizeComboPane(); |
||||
fontColorButton = new UIColorButton(); |
||||
paneMap.put(StyleSetting.STYLE_TYPE, createStyleTypePane()); |
||||
paneMap.put(StyleSetting.THEME_COLOR, colorSelectBox); |
||||
paneMap.put(StyleSetting.LINE_TYPE, lineComboBox); |
||||
paneMap.put(StyleSetting.TEXT_STYLE, ThemeTextStylePaneCreator.create(fontSizePane, fontColorButton)); |
||||
paneMap.put(StyleSetting.BORDER_RADIUS, borderRadiusSpinner); |
||||
paneMap.put(StyleSetting.FONT, frFontPane); |
||||
paneMap.put(StyleSetting.BTN_BACKGROUND, buttonStyleDefinedPane); |
||||
paneMap.put(StyleSetting.SELECT_COLOR, selectBgColorBox); |
||||
} |
||||
|
||||
/** |
||||
* 初始化style1和style2 |
||||
*/ |
||||
private void initStyle() { |
||||
style1 = new UIRadioButton(Toolkit.i18nText("Fine-Design_Widget_Theme_Style_1")); |
||||
style2 = new UIRadioButton(Toolkit.i18nText("Fine-Design_Widget_Theme_Style_2")); |
||||
ButtonGroup buttonGroup = new ButtonGroup(); |
||||
buttonGroup.add(style1); |
||||
buttonGroup.add(style2); |
||||
} |
||||
|
||||
protected JPanel createHeadPane() { |
||||
UILabel headLabel = new UILabel(Toolkit.i18nText("Fine-Design_Widget_Theme_Style_Setting")); |
||||
String[] titles = new String[]{Toolkit.i18nText("Fine-Design_Widget_Follow_Theme"), Toolkit.i18nText("Fine-Design_Widget_Theme_Custom")}; |
||||
styleSettingHead = new UIButtonGroup(titles) { |
||||
@Override |
||||
public void setSelectedIndex(int newSelectedIndex, boolean fireChanged) { |
||||
super.setSelectedIndex(newSelectedIndex, fireChanged); |
||||
switchCard(); |
||||
} |
||||
}; |
||||
JPanel headPane = TableLayoutHelper.createGapTableLayoutPane(new Component[][]{ |
||||
new Component[]{headLabel, styleSettingHead}}, TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_W1, IntervalConstants.INTERVAL_L1); |
||||
headPane.setBorder(BorderFactory.createEmptyBorder(0, 0, IntervalConstants.INTERVAL_L1, 0)); |
||||
return headPane; |
||||
} |
||||
|
||||
protected JPanel createStyleTypePane() { |
||||
// 容纳风格1和风格2的panel
|
||||
JPanel stylePane = new JPanel(FRGUIPaneFactory.createBoxFlowLayout()); |
||||
stylePane.add(style1); |
||||
stylePane.add(style2); |
||||
return stylePane; |
||||
} |
||||
|
||||
protected JPanel createCustomPane() { |
||||
int size = styleSettingList.size(); |
||||
|
||||
double f = TableLayout.FILL; |
||||
double p = TableLayout.PREFERRED; |
||||
int columnCount = 2; |
||||
double[] rowSize = new double[size]; |
||||
for (int i = 0; i < size; i++) { |
||||
rowSize[i] = p; |
||||
} |
||||
|
||||
double[] columnSize = {p, f}; |
||||
|
||||
int[][] rowCount = new int[size][columnCount]; |
||||
for (int i = 0; i < size; i++) { |
||||
for (int j = 0; j < columnCount; j++) { |
||||
rowCount[i][j] = 1; |
||||
} |
||||
} |
||||
|
||||
customPane = TableLayoutHelper.createGapTableLayoutPane(createComponents(size), rowSize, columnSize, rowCount, IntervalConstants.INTERVAL_W1, IntervalConstants.INTERVAL_L1); |
||||
customPane.setBorder(BorderFactory.createEmptyBorder(0, 0, IntervalConstants.INTERVAL_L1, 0)); |
||||
return customPane; |
||||
} |
||||
|
||||
protected Component[][] createComponents(int size) { |
||||
Component[][] result = new Component[size][2]; |
||||
for (int i = 0; i < size; i++) { |
||||
result[i] = createComponentByStyleSetting(styleSettingList.get(i)); |
||||
} |
||||
return result; |
||||
} |
||||
|
||||
protected Component[] createComponentByStyleSetting(StyleSetting styleSetting) { |
||||
Component[] components = new Component[2]; |
||||
components[0] = labelMap.get(styleSetting); |
||||
components[1] = paneMap.get(styleSetting); |
||||
return components; |
||||
} |
||||
|
||||
protected void switchCard() { |
||||
customPane.setVisible(styleSettingHead.getSelectedIndex() == 1); |
||||
} |
||||
|
||||
protected void initDefaultValue() { |
||||
// 读取当前模板的主题
|
||||
JTemplate<?, ?> template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); |
||||
if (JTemplate.isValid(template)) { |
||||
TemplateTheme theme = template.getTemplateTheme(); |
||||
|
||||
ThemedWidgetStyle widgetStyle = (ThemedWidgetStyle) theme.getWidgetStyle(); |
||||
|
||||
if (widgetStyle != null) { |
||||
setThemedStyle(widgetStyle); |
||||
return; |
||||
} |
||||
} |
||||
setDefaultStyle(); |
||||
} |
||||
|
||||
private void setThemedStyle(ThemedWidgetStyle widgetStyle) { |
||||
setColorSelectBox(widgetStyle); |
||||
setStyle(widgetStyle); |
||||
setLineComboBox(widgetStyle); |
||||
setBorderRadiusSpinner(widgetStyle); |
||||
setTextStylePane(widgetStyle); |
||||
setFrFontPane(widgetStyle); |
||||
setButtonStyleDefinedPane(widgetStyle); |
||||
setSelectBgColor(widgetStyle); |
||||
} |
||||
|
||||
private void setColorSelectBox(ThemedWidgetStyle widgetStyle) { |
||||
if (colorSelectBox != null) { |
||||
colorSelectBox.setSelectObject(widgetStyle.getThemeColor()); |
||||
} |
||||
} |
||||
private void setStyle(ThemedWidgetStyle widgetStyle) { |
||||
if (widgetStyle.getStyleType() == ThemedWidgetStyle.DEFAULT_STYLE) { |
||||
if (style1 != null) { |
||||
style1.setSelected(true); |
||||
} |
||||
} else { |
||||
if (style2 != null) { |
||||
style2.setSelected(true); |
||||
} |
||||
} |
||||
} |
||||
|
||||
private void setLineComboBox(ThemedWidgetStyle widgetStyle) { |
||||
if (lineComboBox != null) { |
||||
lineComboBox.setSelectedLineStyle(widgetStyle.getBorderStyle().getLineType()); |
||||
} |
||||
} |
||||
|
||||
private void setBorderRadiusSpinner(ThemedWidgetStyle widgetStyle) { |
||||
if (borderRadiusSpinner != null) { |
||||
borderRadiusSpinner.setValue(widgetStyle.getBorderStyle().getRadius()); |
||||
} |
||||
} |
||||
|
||||
private void setTextStylePane(ThemedWidgetStyle widgetStyle) { |
||||
ThemeTextStyle textStyle = widgetStyle.getTextStyle(); |
||||
this.fontSizePane.setValue(textStyle.getFontSize()); |
||||
this.fontColorButton.setColor(textStyle.getFontColor()); |
||||
} |
||||
|
||||
private void setFrFontPane(ThemedWidgetStyle widgetStyle) { |
||||
if (frFontPane != null) { |
||||
frFontPane.populateBean(widgetStyle.getFontStyle().getFont()); |
||||
} |
||||
} |
||||
|
||||
private void setButtonStyleDefinedPane(ThemedWidgetStyle widgetStyle) { |
||||
if (buttonStyleDefinedPane != null) { |
||||
buttonStyleDefinedPane.populate(ButtonBackground.create(widgetStyle.getButtonBackgroundStyle())); |
||||
} |
||||
} |
||||
private void setDefaultStyle() { |
||||
if (colorSelectBox != null) { |
||||
colorSelectBox.setSelectObject(ThemedWidgetStyle.DEFAULT_COLOR); |
||||
} |
||||
if (style1 != null) { |
||||
style1.setSelected(true); |
||||
} |
||||
if (lineComboBox != null) { |
||||
lineComboBox.setSelectedLineStyle(BorderStyle.DEFAULT_LINE_TYPE); |
||||
} |
||||
if (borderRadiusSpinner != null) { |
||||
borderRadiusSpinner.setValue(BorderStyle.DEFAULT_BORDER_RADIUS); |
||||
} |
||||
if (fontSizePane != null) { |
||||
fontSizePane.setValue(ThemeTextStyle.DEFAULT_FONT_SIZE); |
||||
} |
||||
if (fontColorButton != null) { |
||||
fontColorButton.setColor(Color.BLACK); |
||||
} |
||||
if (frFontPane != null) { |
||||
frFontPane.populateBean(FRFont.getInstance()); |
||||
} |
||||
if (selectBgColorBox != null) { |
||||
selectBgColorBox.setSelectObject(null); |
||||
} |
||||
} |
||||
|
||||
private void setSelectBgColor(ThemedWidgetStyle widgetStyle) { |
||||
if(selectBgColorBox != null) { |
||||
selectBgColorBox.setSelectObject(widgetStyle.getSelectBackgroundColor()); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 初始化枚举和UILabel对应的map |
||||
*/ |
||||
private void initLabelMap() { |
||||
labelMap.put(StyleSetting.THEME_COLOR, new UILabel(Toolkit.i18nText("Fine-Design_Widget_Theme_Color"))); |
||||
labelMap.put(StyleSetting.TEXT_STYLE, new UILabel(Toolkit.i18nText("Fine-Design_Widget_Theme_Text_Style"))); |
||||
labelMap.put(StyleSetting.FONT, new UILabel(Toolkit.i18nText("Fine-Design_Widget_Theme_Font"))); |
||||
labelMap.put(StyleSetting.STYLE_TYPE, new UILabel(Toolkit.i18nText("Fine-Design_Widget_Theme_Style"))); |
||||
labelMap.put(StyleSetting.LINE_TYPE, new UILabel(Toolkit.i18nText("Fine-Design_Widget_Theme_Border_Line"))); |
||||
labelMap.put(StyleSetting.BORDER_RADIUS, new UILabel(Toolkit.i18nText("Fine-Design_Widget_Theme_Border_Radius"))); |
||||
labelMap.put(StyleSetting.BTN_BACKGROUND, new UILabel(Toolkit.i18nText("Fine-Design_Theme_Widget_Background"))); |
||||
labelMap.put(StyleSetting.SELECT_COLOR, new UILabel(Toolkit.i18nText("Fine-Design_Widget_Background_Select_Box"))); |
||||
} |
||||
} |
@ -0,0 +1,83 @@
|
||||
package com.fr.design.widgettheme; |
||||
|
||||
import com.fr.widgettheme.theme.widget.style.FontStyle; |
||||
import com.fr.form.ui.Label; |
||||
import com.fr.form.ui.Widget; |
||||
import com.fr.general.FRFont; |
||||
import com.fr.widgettheme.theme.widget.theme.LabelTheme; |
||||
|
||||
import java.util.Collections; |
||||
|
||||
/** |
||||
* 设计器控件属性的“高级”设置增加主题样式设置项,用于标签控件 |
||||
* |
||||
* @author obo |
||||
* @since 11.0 |
||||
* Created on 2023/11/13 |
||||
*/ |
||||
public class LabelSettingPane<T extends Widget> extends BaseStyleSettingPane<T> { |
||||
|
||||
public LabelSettingPane() { |
||||
super(Collections.singletonList(StyleSetting.FONT)); |
||||
} |
||||
|
||||
@Override |
||||
public void populateBean(T t) { |
||||
LabelTheme widgetTheme = initLabelTheme(t); |
||||
if (widgetTheme.isFollowTheme()) { |
||||
styleSettingHead.setSelectedIndex(0); |
||||
} else { |
||||
styleSettingHead.setSelectedIndex(1); |
||||
FRFont font = ((Label) t).getFont(); |
||||
frFontPane.populateBean(font); |
||||
} |
||||
switchCard(); |
||||
} |
||||
|
||||
private LabelTheme initLabelTheme(T t) { |
||||
LabelTheme widgetTheme = (LabelTheme) t.getWidgetTheme(); |
||||
if (widgetTheme == null) { |
||||
widgetTheme = new LabelTheme(); |
||||
Label label = (Label) t; |
||||
if (!label.getDefaultFont().equals(label.getFont())) { |
||||
widgetTheme.setFollowTheme(false); |
||||
widgetTheme.setFontStyle(new FontStyle((label.getFont()))); |
||||
} |
||||
t.setWidgetTheme(widgetTheme); |
||||
} |
||||
return widgetTheme; |
||||
} |
||||
|
||||
@Override |
||||
public void updateBean(T t) { |
||||
LabelTheme widgetTheme = initLabelTheme(t); |
||||
updateLabelBean(widgetTheme); |
||||
((Label) t).setFont(widgetTheme.getFontStyle().getFont()); |
||||
} |
||||
|
||||
private void updateLabelBean(LabelTheme widgetTheme) { |
||||
int selectIndex = styleSettingHead.getSelectedIndex(); |
||||
widgetTheme.setFollowTheme(selectIndex == 0); |
||||
updateLabelStyleBean(widgetTheme); |
||||
} |
||||
|
||||
private void updateLabelStyleBean(LabelTheme widgetTheme) { |
||||
if (widgetTheme.isFollowTheme()) { |
||||
widgetTheme.setFontStyle(new FontStyle()); |
||||
frFontPane.populateBean(widgetTheme.getFontStyle().getFont()); |
||||
} else { |
||||
widgetTheme.setFontStyle(new FontStyle(frFontPane.update(widgetTheme.getFontStyle().getFont()))); |
||||
} |
||||
switchCard(); |
||||
} |
||||
|
||||
@Override |
||||
public T updateBean() { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
protected String title4PopupWindow() { |
||||
return "labelSetting"; |
||||
} |
||||
} |
@ -0,0 +1,50 @@
|
||||
package com.fr.design.widgettheme; |
||||
|
||||
import com.fr.design.widgettheme.common.ButtonSettingPane; |
||||
import com.fr.form.ui.Widget; |
||||
import com.fr.widgettheme.theme.widget.style.ThemeTextStyle; |
||||
import com.fr.widgettheme.theme.widget.theme.ParaButtonTheme; |
||||
import com.fr.widgettheme.theme.widget.theme.cell.ButtonTheme; |
||||
|
||||
import java.util.Arrays; |
||||
|
||||
/** |
||||
* 参数面板:设计器控件属性的“高级”设置增加主题样式设置项,包括: |
||||
* 单选按钮组控件/复选按钮组控件/复选按钮控件 |
||||
* |
||||
* @author Bruce.Deng |
||||
* @since 11.0 |
||||
* Created on 2023/2/27 |
||||
*/ |
||||
public class ParaButtonSettingPane<T extends Widget> extends ButtonSettingPane<T> { |
||||
|
||||
public ParaButtonSettingPane() { |
||||
super(Arrays.asList( |
||||
StyleSetting.THEME_COLOR, |
||||
StyleSetting.STYLE_TYPE, |
||||
StyleSetting.TEXT_STYLE |
||||
)); |
||||
} |
||||
|
||||
@Override |
||||
protected ButtonTheme getButtonTheme() { |
||||
return new ParaButtonTheme(); |
||||
} |
||||
|
||||
@Override |
||||
protected void assignFontSizePane(ButtonTheme buttonTheme) { |
||||
ThemeTextStyle textStyle = ((ParaButtonTheme) buttonTheme).getTextStyle(); |
||||
fontSizePane.setValue(textStyle.getFontSize()); |
||||
fontColorButton.setColor(textStyle.getFontColor()); |
||||
} |
||||
|
||||
@Override |
||||
protected void assignFontSizeStyle(ButtonTheme buttonTheme) { |
||||
ParaButtonTheme paraButtonTheme = (ParaButtonTheme) buttonTheme; |
||||
ThemeTextStyle textStyle = new ThemeTextStyle(); |
||||
textStyle.setFontSize(fontSizePane.getValue()); |
||||
textStyle.setFontColor(fontColorButton.getColor()); |
||||
paraButtonTheme.setTextStyle(textStyle); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,57 @@
|
||||
package com.fr.design.widgettheme; |
||||
|
||||
import com.fr.design.widgettheme.common.EditorSettingPane; |
||||
import com.fr.form.ui.Widget; |
||||
import com.fr.widgettheme.theme.widget.style.ThemeTextStyle; |
||||
import com.fr.widgettheme.theme.widget.theme.ParaEditorTheme; |
||||
import com.fr.widgettheme.theme.widget.theme.cell.EditorTheme; |
||||
|
||||
import java.util.Arrays; |
||||
import java.util.List; |
||||
|
||||
|
||||
/** |
||||
* 设计器控件属性的“高级”设置增加主题样式设置项,包括: |
||||
* 文本控件/数字控件/密码控件/文本域控件/下拉框控件/下拉复选框控件/下拉树控件/日期控件 |
||||
* |
||||
* @author Bruce.Deng |
||||
* @since 11.0 |
||||
* Created on 2023/2/2 |
||||
*/ |
||||
public class ParaEditorSettingPane<T extends Widget> extends EditorSettingPane<T> { |
||||
|
||||
public ParaEditorSettingPane() { |
||||
super(Arrays.asList( |
||||
StyleSetting.THEME_COLOR, |
||||
StyleSetting.STYLE_TYPE, |
||||
StyleSetting.LINE_TYPE, |
||||
StyleSetting.BORDER_RADIUS, |
||||
StyleSetting.TEXT_STYLE |
||||
)); |
||||
} |
||||
|
||||
public ParaEditorSettingPane(List<StyleSetting> styleSettingList) { |
||||
super(styleSettingList); |
||||
} |
||||
|
||||
@Override |
||||
protected void assignFontSizePane(EditorTheme widgetTheme) { |
||||
ThemeTextStyle textStyle = ((ParaEditorTheme) widgetTheme).getTextStyle(); |
||||
fontSizePane.setValue(textStyle.getFontSize()); |
||||
fontColorButton.setColor(textStyle.getFontColor()); |
||||
} |
||||
|
||||
@Override |
||||
protected void assignFontSizeStyle(EditorTheme widgetTheme) { |
||||
ParaEditorTheme paraEditorTheme= (ParaEditorTheme) widgetTheme; |
||||
ThemeTextStyle textStyle = new ThemeTextStyle(); |
||||
textStyle.setFontSize(fontSizePane.getValue()); |
||||
textStyle.setFontColor(fontColorButton.getColor()); |
||||
paraEditorTheme.setTextStyle(textStyle); |
||||
} |
||||
|
||||
@Override |
||||
protected EditorTheme getEditorTheme() { |
||||
return new ParaEditorTheme(); |
||||
} |
||||
} |
@ -0,0 +1,68 @@
|
||||
package com.fr.design.widgettheme; |
||||
|
||||
import com.fr.widgettheme.theme.widget.style.FontStyle; |
||||
import com.fr.design.widgettheme.common.NormalButtonSettingPane; |
||||
import com.fr.form.ui.FreeButton; |
||||
import com.fr.form.ui.Widget; |
||||
import com.fr.general.FRFont; |
||||
import com.fr.widgettheme.theme.widget.theme.ParaNormalButtonTheme; |
||||
import com.fr.widgettheme.theme.widget.theme.cell.NormalButtonTheme; |
||||
|
||||
import java.util.Arrays; |
||||
|
||||
/** |
||||
* 参数面板常规按钮设置窗口 |
||||
* |
||||
* @author obo |
||||
* @since 11.0 |
||||
* Created on 2023/11/13 |
||||
*/ |
||||
public class ParaNormalButtonSettingPane<T extends Widget> extends NormalButtonSettingPane<T> { |
||||
|
||||
public ParaNormalButtonSettingPane() { |
||||
super(Arrays.asList( |
||||
StyleSetting.BTN_BACKGROUND, |
||||
StyleSetting.LINE_TYPE, |
||||
StyleSetting.BORDER_RADIUS, |
||||
StyleSetting.FONT |
||||
)); |
||||
} |
||||
|
||||
@Override |
||||
protected void assignFontPane(NormalButtonTheme normalButtonTheme) { |
||||
ParaNormalButtonTheme paraNormalButtonTheme = (ParaNormalButtonTheme) normalButtonTheme; |
||||
frFontPane.populateBean(paraNormalButtonTheme.getFontStyle().getFont()); |
||||
|
||||
} |
||||
|
||||
@Override |
||||
protected void initCustomStyle(FreeButton freeButton, NormalButtonTheme widgetTheme) { |
||||
super.initCustomStyle(freeButton, widgetTheme); |
||||
FRFont font = freeButton.getFont(); |
||||
((ParaNormalButtonTheme) widgetTheme).setFontStyle(new FontStyle(font)); |
||||
} |
||||
|
||||
@Override |
||||
protected void updateCustomStyle(FreeButton freeButton, NormalButtonTheme widgetTheme) { |
||||
super.updateCustomStyle(freeButton, widgetTheme); |
||||
FontStyle fontStyle = ((ParaNormalButtonTheme) widgetTheme).getFontStyle(); |
||||
freeButton.setFont(fontStyle.getFont()); |
||||
} |
||||
|
||||
@Override |
||||
protected void assignFontStyle(NormalButtonTheme normalButtonTheme) { |
||||
ParaNormalButtonTheme paraNormalButtonTheme = (ParaNormalButtonTheme) normalButtonTheme; |
||||
if (paraNormalButtonTheme.isFollowTheme()) { |
||||
paraNormalButtonTheme.setFontStyle(new FontStyle()); |
||||
assignFontPane(normalButtonTheme); |
||||
} else { |
||||
paraNormalButtonTheme.setFontStyle(new FontStyle(frFontPane.update(paraNormalButtonTheme.getFontStyle().getFont()))); |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
protected NormalButtonTheme getDefaultNormalButtonTheme() { |
||||
return new ParaNormalButtonTheme(); |
||||
} |
||||
} |
||||
|
@ -0,0 +1,31 @@
|
||||
package com.fr.design.widgettheme; |
||||
|
||||
import com.fr.form.ui.Widget; |
||||
|
||||
import java.util.Arrays; |
||||
|
||||
/** |
||||
* 参数面板下拉框编辑控件配置面板 |
||||
* 继承自编辑控件配置面板,添加一个下拉框背景色 |
||||
* |
||||
* @author obo |
||||
* @since 11.0 |
||||
* Created on 2023/12/13 |
||||
*/ |
||||
public class ParaSelectEditorSettingPane<T extends Widget> extends ParaEditorSettingPane<T> { |
||||
public ParaSelectEditorSettingPane() { |
||||
super(Arrays.asList( |
||||
StyleSetting.THEME_COLOR, |
||||
StyleSetting.SELECT_COLOR, |
||||
StyleSetting.STYLE_TYPE, |
||||
StyleSetting.LINE_TYPE, |
||||
StyleSetting.BORDER_RADIUS, |
||||
StyleSetting.TEXT_STYLE |
||||
)); |
||||
} |
||||
|
||||
@Override |
||||
protected String title4PopupWindow() { |
||||
return "paraSelectEditorSetting"; |
||||
} |
||||
} |
@ -0,0 +1,48 @@
|
||||
package com.fr.design.widgettheme; |
||||
|
||||
import com.fr.design.widgettheme.common.TreeEditorSettingPane; |
||||
import com.fr.form.ui.TreeEditor; |
||||
import com.fr.widgettheme.theme.widget.style.ThemeTextStyle; |
||||
import com.fr.widgettheme.theme.widget.theme.ParaTreeTheme; |
||||
import com.fr.widgettheme.theme.widget.theme.cell.TreeTheme; |
||||
|
||||
import java.util.Arrays; |
||||
|
||||
/** |
||||
* 参数面板:设计器控件属性的“高级”设置增加主题样式设置项,包括: |
||||
* 视图树 |
||||
* |
||||
* @author Bruce.Deng |
||||
* @since 11.0 |
||||
* Created on 2023/2/28 |
||||
*/ |
||||
public class ParaTreeEditorSettingPane<T extends TreeEditor> extends TreeEditorSettingPane<T> { |
||||
|
||||
public ParaTreeEditorSettingPane() { |
||||
super(Arrays.asList( |
||||
StyleSetting.THEME_COLOR, |
||||
StyleSetting.STYLE_TYPE, |
||||
StyleSetting.TEXT_STYLE |
||||
)); |
||||
} |
||||
|
||||
@Override |
||||
protected TreeTheme getTreeTheme() { |
||||
return new ParaTreeTheme(); |
||||
} |
||||
|
||||
@Override |
||||
protected void assignFontSizePane(TreeTheme widgetTheme) { |
||||
ThemeTextStyle textStyle = widgetTheme.getTextStyle(); |
||||
fontSizePane.setValue(textStyle.getFontSize()); |
||||
fontColorButton.setColor(textStyle.getFontColor()); |
||||
} |
||||
|
||||
@Override |
||||
protected void assignFontSizeStyle(TreeTheme widgetTheme) { |
||||
ThemeTextStyle textStyle = new ThemeTextStyle(); |
||||
textStyle.setFontSize(fontSizePane.getValue()); |
||||
textStyle.setFontColor(fontColorButton.getColor()); |
||||
widgetTheme.setTextStyle(textStyle); |
||||
} |
||||
} |
@ -0,0 +1,45 @@
|
||||
package com.fr.design.widgettheme; |
||||
|
||||
/** |
||||
* 控件样式附加选项类型 |
||||
* |
||||
* @author obo |
||||
* @since 11.0 |
||||
* Created on 2023/11/13 |
||||
*/ |
||||
public enum StyleSetting { |
||||
|
||||
/** |
||||
* 主题颜色 |
||||
*/ |
||||
THEME_COLOR, |
||||
/** |
||||
* 风格 |
||||
*/ |
||||
STYLE_TYPE, |
||||
/** |
||||
* 线型 |
||||
*/ |
||||
LINE_TYPE, |
||||
/** |
||||
* 边框圆角 |
||||
*/ |
||||
BORDER_RADIUS, |
||||
/** |
||||
* 文本样式 |
||||
*/ |
||||
TEXT_STYLE, |
||||
/** |
||||
* 字体 |
||||
*/ |
||||
FONT, |
||||
/** |
||||
* 按钮背景 |
||||
*/ |
||||
BTN_BACKGROUND, |
||||
|
||||
/** |
||||
* 自定义下拉框颜色 |
||||
*/ |
||||
SELECT_COLOR |
||||
} |
@ -0,0 +1,108 @@
|
||||
package com.fr.design.widgettheme.common; |
||||
|
||||
import com.fr.design.widgettheme.StyleSetting; |
||||
import com.fr.design.widgettheme.BaseStyleSettingPane; |
||||
import com.fr.form.ui.Widget; |
||||
import com.fr.widgettheme.theme.widget.theme.WidgetThemeDisplayConstants; |
||||
import com.fr.widgettheme.theme.widget.theme.cell.ButtonTheme; |
||||
import org.jetbrains.annotations.Nullable; |
||||
|
||||
import java.util.Arrays; |
||||
import java.util.List; |
||||
|
||||
/** |
||||
* 设计器控件属性的“高级”设置增加主题样式设置项,包括: |
||||
* 单选按钮组控件/复选按钮组控件/复选按钮控件 |
||||
* |
||||
* @author John.Ying |
||||
* @since 11.0 |
||||
* Created on 2023/4/18 |
||||
*/ |
||||
public class ButtonSettingPane<T extends Widget> extends BaseStyleSettingPane<T> { |
||||
|
||||
public ButtonSettingPane() { |
||||
super(Arrays.asList( |
||||
StyleSetting.THEME_COLOR, |
||||
StyleSetting.STYLE_TYPE |
||||
)); |
||||
} |
||||
|
||||
public ButtonSettingPane(List<StyleSetting> styleSettingList) { |
||||
super(styleSettingList); |
||||
} |
||||
|
||||
@Override |
||||
public void populateBean(T t) { |
||||
ButtonTheme widgetTheme = initButtonTheme(t); |
||||
populateButtonBean(widgetTheme); |
||||
} |
||||
|
||||
protected ButtonTheme initButtonTheme(T t) { |
||||
ButtonTheme widgetTheme = (ButtonTheme) t.getWidgetTheme(); |
||||
if (widgetTheme == null) { |
||||
widgetTheme = getButtonTheme(); |
||||
updateButtonStyleBean(widgetTheme); |
||||
t.setWidgetTheme(widgetTheme); |
||||
} |
||||
return widgetTheme; |
||||
} |
||||
|
||||
protected ButtonTheme getButtonTheme() { |
||||
return new ButtonTheme(); |
||||
} |
||||
|
||||
protected void assignFontSizePane(ButtonTheme buttonTheme) { |
||||
|
||||
} |
||||
|
||||
protected void assignFontSizeStyle(ButtonTheme buttonTheme) { |
||||
|
||||
} |
||||
|
||||
protected void populateButtonBean(ButtonTheme buttonTheme) { |
||||
if (buttonTheme.isFollowTheme()) { |
||||
styleSettingHead.setSelectedIndex(0); |
||||
} else { |
||||
styleSettingHead.setSelectedIndex(1); |
||||
colorSelectBox.setSelectObject(buttonTheme.getThemeColor()); |
||||
if (buttonTheme.getStyleType() == WidgetThemeDisplayConstants.STYLE_1) { |
||||
style1.setSelected(true); |
||||
} else { |
||||
style2.setSelected(true); |
||||
} |
||||
assignFontSizePane(buttonTheme); |
||||
} |
||||
switchCard(); |
||||
} |
||||
|
||||
@Override |
||||
public void updateBean(T t) { |
||||
ButtonTheme widgetTheme = initButtonTheme(t); |
||||
updateCellButtonBean(widgetTheme); |
||||
} |
||||
|
||||
protected void updateCellButtonBean(ButtonTheme buttonTheme) { |
||||
int selectIndex = styleSettingHead.getSelectedIndex(); |
||||
buttonTheme.setFollowTheme(selectIndex == 0); |
||||
updateButtonStyleBean(buttonTheme); |
||||
} |
||||
|
||||
protected void updateButtonStyleBean(ButtonTheme buttonTheme) { |
||||
buttonTheme.setThemeColor(colorSelectBox.getSelectObject()); |
||||
buttonTheme.setStyleType(style1.isSelected() ? WidgetThemeDisplayConstants.STYLE_1 : WidgetThemeDisplayConstants.STYLE_2); |
||||
assignFontSizeStyle(buttonTheme); |
||||
switchCard(); |
||||
} |
||||
|
||||
@Override |
||||
@Nullable |
||||
public T updateBean() { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
protected String title4PopupWindow() { |
||||
return "buttonSetting"; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,117 @@
|
||||
package com.fr.design.widgettheme.common; |
||||
|
||||
|
||||
import com.fr.widgettheme.theme.widget.style.BorderStyle; |
||||
import com.fr.design.widgettheme.BaseStyleSettingPane; |
||||
import com.fr.form.ui.Widget; |
||||
import com.fr.design.widgettheme.StyleSetting; |
||||
import com.fr.widgettheme.theme.widget.theme.WidgetThemeDisplayConstants; |
||||
import com.fr.widgettheme.theme.widget.theme.cell.EditorTheme; |
||||
import org.jetbrains.annotations.Nullable; |
||||
|
||||
import java.util.Arrays; |
||||
import java.util.List; |
||||
|
||||
/** |
||||
* 设计器控件属性的“高级”设置增加主题样式设置项,包括: |
||||
* 文本控件/数字控件/密码控件/文本域控件/下拉框控件/下拉复选框控件/下拉树控件/日期控件 |
||||
* |
||||
* @author John.Ying |
||||
* @since 11.0 |
||||
* Created on 2023/4/18 |
||||
*/ |
||||
public class EditorSettingPane<T extends Widget> extends BaseStyleSettingPane<T> { |
||||
|
||||
public EditorSettingPane() { |
||||
super(Arrays.asList( |
||||
StyleSetting.THEME_COLOR, |
||||
StyleSetting.STYLE_TYPE, |
||||
StyleSetting.LINE_TYPE, |
||||
StyleSetting.BORDER_RADIUS |
||||
)); |
||||
} |
||||
|
||||
public EditorSettingPane(List<StyleSetting> styleSettingList) { |
||||
super(styleSettingList); |
||||
} |
||||
|
||||
@Override |
||||
protected String title4PopupWindow() { |
||||
return "fieldEditorSetting"; |
||||
} |
||||
|
||||
protected void assignFontSizePane(EditorTheme widgetTheme) { |
||||
|
||||
} |
||||
|
||||
protected void assignFontSizeStyle(EditorTheme widgetTheme) { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void populateBean(T t) { |
||||
EditorTheme widgetTheme = initEditorTheme(t); |
||||
populateEditorBean(widgetTheme); |
||||
} |
||||
|
||||
protected EditorTheme initEditorTheme(T t) { |
||||
EditorTheme widgetTheme = (EditorTheme) t.getWidgetTheme(); |
||||
if (widgetTheme == null) { |
||||
widgetTheme = getEditorTheme(); |
||||
updateEditorStyleBean(widgetTheme); |
||||
t.setWidgetTheme(widgetTheme); |
||||
} |
||||
return widgetTheme; |
||||
} |
||||
|
||||
protected EditorTheme getEditorTheme() { |
||||
return new EditorTheme(); |
||||
} |
||||
|
||||
protected void populateEditorBean(EditorTheme editorTheme) { |
||||
if (editorTheme.isFollowTheme()) { |
||||
styleSettingHead.setSelectedIndex(0); |
||||
} else { |
||||
styleSettingHead.setSelectedIndex(1); |
||||
colorSelectBox.setSelectObject(editorTheme.getThemeColor()); |
||||
if (editorTheme.getStyleType() == WidgetThemeDisplayConstants.STYLE_1) { |
||||
style1.setSelected(true); |
||||
} else { |
||||
style2.setSelected(true); |
||||
} |
||||
lineComboBox.setSelectedLineStyle(editorTheme.getBorderStyle().getLineType()); |
||||
borderRadiusSpinner.setValue(editorTheme.getBorderStyle().getRadius()); |
||||
selectBgColorBox.setSelectObject(editorTheme.getSelectBoxBgColor()); |
||||
assignFontSizePane(editorTheme); |
||||
} |
||||
switchCard(); |
||||
} |
||||
|
||||
@Override |
||||
@Nullable |
||||
public T updateBean() { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public void updateBean(T t) { |
||||
EditorTheme widgetTheme = initEditorTheme(t); |
||||
updateEditorBean(widgetTheme); |
||||
} |
||||
|
||||
protected void updateEditorBean(EditorTheme editorTheme) { |
||||
int selectIndex = styleSettingHead.getSelectedIndex(); |
||||
editorTheme.setFollowTheme(selectIndex == 0); |
||||
updateEditorStyleBean(editorTheme); |
||||
} |
||||
|
||||
protected void updateEditorStyleBean(EditorTheme editorTheme) { |
||||
editorTheme.setThemeColor(colorSelectBox.getSelectObject()); |
||||
editorTheme.setSelectBoxBgColor(selectBgColorBox.getSelectObject()); |
||||
editorTheme.setStyleType(style1.isSelected() ? WidgetThemeDisplayConstants.STYLE_1 : WidgetThemeDisplayConstants.STYLE_2); |
||||
editorTheme.setBorderStyle(new BorderStyle((int) borderRadiusSpinner.getValue(), lineComboBox.getSelectedLineStyle())); |
||||
assignFontSizeStyle(editorTheme); |
||||
switchCard(); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,136 @@
|
||||
package com.fr.design.widgettheme.common; |
||||
|
||||
import com.fr.widgettheme.theme.widget.style.BorderStyle; |
||||
import com.fr.widgettheme.theme.widget.style.ButtonBackgroundStyle; |
||||
import com.fr.widgettheme.theme.bean.ButtonBackground; |
||||
import com.fr.design.widgettheme.BaseStyleSettingPane; |
||||
import com.fr.form.ui.FreeButton; |
||||
import com.fr.form.ui.Widget; |
||||
import com.fr.design.widgettheme.StyleSetting; |
||||
import com.fr.widgettheme.theme.widget.theme.cell.NormalButtonTheme; |
||||
import org.jetbrains.annotations.Nullable; |
||||
|
||||
import java.util.Arrays; |
||||
import java.util.List; |
||||
|
||||
/** |
||||
* 设计器控件属性的“高级”设置增加主题样式设置项,包括: |
||||
* 按钮组件 |
||||
* |
||||
* @author John.Ying |
||||
* @since 11.0 |
||||
* Created on 2023/4/27 |
||||
*/ |
||||
public class NormalButtonSettingPane<T extends Widget> extends BaseStyleSettingPane<T> { |
||||
|
||||
public NormalButtonSettingPane() { |
||||
super(Arrays.asList( |
||||
StyleSetting.BTN_BACKGROUND, |
||||
StyleSetting.LINE_TYPE, |
||||
StyleSetting.BORDER_RADIUS |
||||
)); |
||||
} |
||||
|
||||
public NormalButtonSettingPane(List<StyleSetting> styleSettingList) { |
||||
super(styleSettingList); |
||||
} |
||||
|
||||
@Override |
||||
public void populateBean(T t) { |
||||
NormalButtonTheme widgetTheme = initNormalButtonTheme(t); |
||||
|
||||
if (t instanceof FreeButton && ((FreeButton) t).isCustomStyle()) { |
||||
initCustomStyle((FreeButton) t, widgetTheme); |
||||
} |
||||
|
||||
populateNormalButtonBean(widgetTheme); |
||||
} |
||||
|
||||
/** |
||||
* 根据freeButton自定义样式,初始化widgetTheme |
||||
*/ |
||||
protected void initCustomStyle(FreeButton freeButton, NormalButtonTheme widgetTheme) { |
||||
ButtonBackgroundStyle buttonBackgroundStyle = new ButtonBackgroundStyle(freeButton.getInitialBackground(), freeButton.getOverBackground(), freeButton.getClickBackground()); |
||||
widgetTheme.setButtonBackgroundStyle(buttonBackgroundStyle); |
||||
widgetTheme.setFollowTheme(false); |
||||
} |
||||
|
||||
protected void populateNormalButtonBean(NormalButtonTheme widgetTheme) { |
||||
if (widgetTheme.isFollowTheme()) { |
||||
styleSettingHead.setSelectedIndex(0); |
||||
} else { |
||||
styleSettingHead.setSelectedIndex(1); |
||||
lineComboBox.setSelectedLineStyle(widgetTheme.getBorderStyle().getLineType()); |
||||
borderRadiusSpinner.setValue(widgetTheme.getBorderStyle().getRadius()); |
||||
assignFontPane(widgetTheme); |
||||
buttonStyleDefinedPane.populate(ButtonBackground.create(widgetTheme.getButtonBackgroundStyle())); |
||||
} |
||||
switchCard(); |
||||
} |
||||
|
||||
protected void assignFontPane(NormalButtonTheme normalButtonTheme) { |
||||
|
||||
} |
||||
|
||||
protected void assignFontStyle(NormalButtonTheme normalButtonTheme) { |
||||
|
||||
} |
||||
|
||||
protected NormalButtonTheme initNormalButtonTheme(T t) { |
||||
NormalButtonTheme widgetTheme = (NormalButtonTheme) t.getWidgetTheme(); |
||||
if (widgetTheme == null) { |
||||
widgetTheme = getDefaultNormalButtonTheme(); |
||||
t.setWidgetTheme(widgetTheme); |
||||
} |
||||
return widgetTheme; |
||||
} |
||||
|
||||
protected NormalButtonTheme getDefaultNormalButtonTheme() { |
||||
return new NormalButtonTheme(); |
||||
} |
||||
|
||||
@Override |
||||
public void updateBean(T t) { |
||||
NormalButtonTheme widgetTheme = initNormalButtonTheme(t); |
||||
|
||||
int selectIndex = styleSettingHead.getSelectedIndex(); |
||||
widgetTheme.setFollowTheme(selectIndex == 0); |
||||
|
||||
updateNormalButtonStyleBean(widgetTheme); |
||||
|
||||
if (t instanceof FreeButton) { |
||||
FreeButton freeButton = (FreeButton) t; |
||||
freeButton.setCustomStyle(!widgetTheme.isFollowTheme()); |
||||
updateCustomStyle(freeButton, widgetTheme); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 更新freeButton的自定义样式 |
||||
*/ |
||||
protected void updateCustomStyle(FreeButton freeButton, NormalButtonTheme widgetTheme) { |
||||
ButtonBackgroundStyle backgroundStyle = widgetTheme.getButtonBackgroundStyle(); |
||||
freeButton.setInitialBackground(backgroundStyle.getInitialBackground()); |
||||
freeButton.setOverBackground(backgroundStyle.getOverBackground()); |
||||
freeButton.setClickBackground(backgroundStyle.getClickBackground()); |
||||
} |
||||
|
||||
protected void updateNormalButtonStyleBean(NormalButtonTheme normalButtonTheme) { |
||||
assignFontStyle(normalButtonTheme); |
||||
normalButtonTheme.setButtonBackgroundStyle(buttonStyleDefinedPane.update()); |
||||
normalButtonTheme.setBorderStyle(new BorderStyle((int) borderRadiusSpinner.getValue(), lineComboBox.getSelectedLineStyle())); |
||||
|
||||
switchCard(); |
||||
} |
||||
|
||||
@Override |
||||
@Nullable |
||||
public T updateBean() { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
protected String title4PopupWindow() { |
||||
return "normalButtonSetting"; |
||||
} |
||||
} |
@ -0,0 +1,32 @@
|
||||
package com.fr.design.widgettheme.common; |
||||
|
||||
import com.fr.design.widgettheme.StyleSetting; |
||||
import com.fr.form.ui.Widget; |
||||
|
||||
import java.util.Arrays; |
||||
|
||||
/** |
||||
* 单元格下拉框编辑控件配置面板 |
||||
* 继承自编辑控件配置面板,添加一个下拉框背景色 |
||||
* |
||||
* @author obo |
||||
* @since 11.0 |
||||
* Created on 2023/12/13 |
||||
*/ |
||||
public class SelectEditorSettingPane <T extends Widget> extends EditorSettingPane<T> { |
||||
|
||||
public SelectEditorSettingPane() { |
||||
super(Arrays.asList( |
||||
StyleSetting.THEME_COLOR, |
||||
StyleSetting.SELECT_COLOR, |
||||
StyleSetting.STYLE_TYPE, |
||||
StyleSetting.LINE_TYPE, |
||||
StyleSetting.BORDER_RADIUS |
||||
)); |
||||
} |
||||
|
||||
@Override |
||||
protected String title4PopupWindow() { |
||||
return "selectEditorSetting"; |
||||
} |
||||
} |
@ -0,0 +1,107 @@
|
||||
package com.fr.design.widgettheme.common; |
||||
|
||||
import com.fr.design.widgettheme.StyleSetting; |
||||
import com.fr.design.widgettheme.BaseStyleSettingPane; |
||||
import com.fr.form.ui.TreeEditor; |
||||
import com.fr.widgettheme.theme.widget.theme.WidgetThemeDisplayConstants; |
||||
import com.fr.widgettheme.theme.widget.theme.cell.TreeTheme; |
||||
import org.jetbrains.annotations.Nullable; |
||||
|
||||
import java.util.Arrays; |
||||
import java.util.List; |
||||
|
||||
/** |
||||
* 设计器控件属性的“高级”设置增加主题样式设置项,包括: |
||||
* 视图树 |
||||
* |
||||
* @author John.Ying |
||||
* @since 11.0 |
||||
* Created on 2023/4/18 |
||||
*/ |
||||
public class TreeEditorSettingPane<T extends TreeEditor> extends BaseStyleSettingPane<T> { |
||||
|
||||
public TreeEditorSettingPane() { |
||||
super(Arrays.asList( |
||||
StyleSetting.THEME_COLOR, |
||||
StyleSetting.STYLE_TYPE |
||||
)); |
||||
} |
||||
|
||||
public TreeEditorSettingPane(List<StyleSetting> styleSettingList) { |
||||
super(styleSettingList); |
||||
} |
||||
|
||||
@Override |
||||
public void populateBean(T t) { |
||||
TreeTheme treeTheme = initEditorTheme(t); |
||||
populateTreeBean(treeTheme); |
||||
} |
||||
|
||||
protected TreeTheme initEditorTheme(T t) { |
||||
TreeTheme widgetTheme = (TreeTheme) t.getWidgetTheme(); |
||||
if (widgetTheme == null) { |
||||
widgetTheme = getTreeTheme(); |
||||
updateTreeStyleBean(widgetTheme); |
||||
t.setWidgetTheme(widgetTheme); |
||||
} |
||||
return widgetTheme; |
||||
} |
||||
|
||||
protected TreeTheme getTreeTheme() { |
||||
return new TreeTheme(); |
||||
} |
||||
|
||||
protected void populateTreeBean(TreeTheme treeTheme) { |
||||
if (treeTheme.isFollowTheme()) { |
||||
styleSettingHead.setSelectedIndex(0); |
||||
} else { |
||||
styleSettingHead.setSelectedIndex(1); |
||||
colorSelectBox.setSelectObject(treeTheme.getThemeColor()); |
||||
if (treeTheme.getStyleType() == WidgetThemeDisplayConstants.STYLE_1) { |
||||
style1.setSelected(true); |
||||
} else { |
||||
style2.setSelected(true); |
||||
} |
||||
assignFontSizePane(treeTheme); |
||||
} |
||||
switchCard(); |
||||
} |
||||
|
||||
protected void assignFontSizePane(TreeTheme widgetTheme) { |
||||
|
||||
} |
||||
|
||||
protected void assignFontSizeStyle(TreeTheme widgetTheme) { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateBean(T t) { |
||||
TreeTheme treeTheme = initEditorTheme(t); |
||||
updateTreeBean(treeTheme); |
||||
} |
||||
|
||||
protected void updateTreeBean(TreeTheme treeTheme) { |
||||
int selectIndex = styleSettingHead.getSelectedIndex(); |
||||
treeTheme.setFollowTheme(selectIndex == 0); |
||||
updateTreeStyleBean(treeTheme); |
||||
} |
||||
|
||||
protected void updateTreeStyleBean(TreeTheme treeTheme) { |
||||
treeTheme.setThemeColor(colorSelectBox.getSelectObject()); |
||||
treeTheme.setStyleType(style1.isSelected() ? WidgetThemeDisplayConstants.STYLE_1 : WidgetThemeDisplayConstants.STYLE_2); |
||||
assignFontSizeStyle(treeTheme); |
||||
switchCard(); |
||||
} |
||||
|
||||
@Override |
||||
@Nullable |
||||
public T updateBean() { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
protected String title4PopupWindow() { |
||||
return "treeEditorSetting"; |
||||
} |
||||
} |
@ -0,0 +1,134 @@
|
||||
package com.fr.design.widgettheme.processor; |
||||
|
||||
import com.fr.design.widgettheme.common.SelectEditorSettingPane; |
||||
import com.fr.widgettheme.util.WidgetThemeDesignerUtils; |
||||
import com.fr.design.beans.BasicBeanPane; |
||||
import com.fr.form.parameter.FormSubmitButton; |
||||
import com.fr.form.ui.Button; |
||||
import com.fr.form.ui.CheckBox; |
||||
import com.fr.form.ui.CheckBoxGroup; |
||||
import com.fr.form.ui.ComboBox; |
||||
import com.fr.form.ui.ComboCheckBox; |
||||
import com.fr.form.ui.DateEditor; |
||||
import com.fr.form.ui.FreeButton; |
||||
import com.fr.form.ui.NumberEditor; |
||||
import com.fr.form.ui.Password; |
||||
import com.fr.form.ui.RadioGroup; |
||||
import com.fr.form.ui.TextArea; |
||||
import com.fr.form.ui.TextEditor; |
||||
import com.fr.form.ui.TreeComboBoxEditor; |
||||
import com.fr.form.ui.TreeEditor; |
||||
import com.fr.report.web.button.form.TreeNodeToggleButton; |
||||
import com.fr.report.web.button.write.AppendRowButton; |
||||
import com.fr.report.web.button.write.DeleteRowButton; |
||||
import com.fr.design.widgettheme.common.ButtonSettingPane; |
||||
import com.fr.design.widgettheme.common.EditorSettingPane; |
||||
import com.fr.design.widgettheme.common.NormalButtonSettingPane; |
||||
import com.fr.design.widgettheme.common.TreeEditorSettingPane; |
||||
import com.fr.widgettheme.utils.WidgetThemeServerUtils; |
||||
|
||||
import java.util.Arrays; |
||||
import java.util.HashSet; |
||||
import java.util.List; |
||||
import java.util.Set; |
||||
|
||||
/** |
||||
* 控件主题窗口创建处理类 |
||||
* 当前类型被接受时,添加对应pane到extraPaneList |
||||
* |
||||
* @author obo |
||||
* @since 11.0 |
||||
* Created on 2023/11/13 |
||||
*/ |
||||
public class WidgetThemeCreatorPaneAdder { |
||||
|
||||
private WidgetThemeCreatorPaneAdder() {} |
||||
|
||||
/** |
||||
* editor相关处理类 |
||||
*/ |
||||
private static final Set<Class<?>> EDITOR_SET = new HashSet<>(Arrays.asList( |
||||
TextArea.class, |
||||
TextEditor.class, |
||||
NumberEditor.class, |
||||
Password.class |
||||
)); |
||||
|
||||
/** |
||||
* normal相关处理类 |
||||
*/ |
||||
private static final Set<Class<?>> NORMAL_SET = new HashSet<>(Arrays.asList( |
||||
AppendRowButton.class, |
||||
FreeButton.class, |
||||
DeleteRowButton.class, |
||||
FormSubmitButton.class, |
||||
TreeNodeToggleButton.class, |
||||
Button.class |
||||
)); |
||||
|
||||
/** |
||||
* 下拉框相关控件类 |
||||
*/ |
||||
private static final Set<Class<?>> SELECT_SET = new HashSet<>(Arrays.asList( |
||||
DateEditor.class, |
||||
TreeComboBoxEditor.class, |
||||
ComboBox.class, |
||||
ComboCheckBox.class |
||||
)); |
||||
|
||||
/** |
||||
* 遍历判断当前控件creator类型,将符合条件的窗口添加到extraPaneList中 |
||||
* |
||||
* @param creator 控件creator |
||||
* @param extraPaneList 列表 |
||||
*/ |
||||
public static <T> void add(Class<T> creator, List<BasicBeanPane<T>> extraPaneList) { |
||||
if(WidgetThemeDesignerUtils.enableWidgetEnhance()) { |
||||
acceptEditor(creator, extraPaneList); |
||||
acceptTree(creator, extraPaneList); |
||||
acceptNormal(creator, extraPaneList); |
||||
acceptButton(creator, extraPaneList); |
||||
acceptSelect(creator, extraPaneList); |
||||
} |
||||
} |
||||
|
||||
private static <T> void insertShortCut(List<BasicBeanPane<T>> extraPaneList, BasicBeanPane pane) { |
||||
extraPaneList.add(0, pane); |
||||
} |
||||
|
||||
private static <T> void acceptEditor(Class<?> creator, List<BasicBeanPane<T>> extraPaneList) { |
||||
boolean accept = WidgetThemeServerUtils.isNewComboBoxTreeEditor(creator) || EDITOR_SET.contains(creator); |
||||
if (accept) { |
||||
insertShortCut(extraPaneList, new EditorSettingPane<>()); |
||||
} |
||||
} |
||||
|
||||
private static <T> void acceptTree(Class<?> creator, List<BasicBeanPane<T>> extraPaneList) { |
||||
boolean accept = creator == TreeEditor.class; |
||||
if (accept) { |
||||
insertShortCut(extraPaneList, new TreeEditorSettingPane<>()); |
||||
} |
||||
} |
||||
|
||||
|
||||
private static <T> void acceptNormal(Class<?> creator, List<BasicBeanPane<T>> extraPaneList) { |
||||
boolean accept = NORMAL_SET.contains(creator); |
||||
if (accept) { |
||||
insertShortCut(extraPaneList, new NormalButtonSettingPane<>()); |
||||
} |
||||
} |
||||
|
||||
private static <T> void acceptButton(Class<?> creator, List<BasicBeanPane<T>> extraPaneList) { |
||||
boolean accept = creator == CheckBox.class || creator == RadioGroup.class || creator == CheckBoxGroup.class; |
||||
if (accept) { |
||||
insertShortCut(extraPaneList, new ButtonSettingPane<>()); |
||||
} |
||||
} |
||||
|
||||
private static <T> void acceptSelect(Class<?> creator, List<BasicBeanPane<T>> extraPaneList) { |
||||
boolean accept = SELECT_SET.contains(creator); |
||||
if (accept) { |
||||
insertShortCut(extraPaneList, new SelectEditorSettingPane<>()); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,115 @@
|
||||
package com.fr.design.widgettheme.processor; |
||||
|
||||
import com.fr.design.widgettheme.ParaNormalButtonSettingPane; |
||||
import com.fr.design.widgettheme.ParaSelectEditorSettingPane; |
||||
import com.fr.widgettheme.util.WidgetThemeDesignerUtils; |
||||
import com.fr.design.beans.BasicBeanPane; |
||||
import com.fr.design.designer.creator.XButton; |
||||
import com.fr.design.designer.creator.XCheckBox; |
||||
import com.fr.design.designer.creator.XCheckBoxGroup; |
||||
import com.fr.design.designer.creator.XComboBox; |
||||
import com.fr.design.designer.creator.XCreator; |
||||
import com.fr.design.designer.creator.XDateEditor; |
||||
import com.fr.design.designer.creator.XLabel; |
||||
import com.fr.design.designer.creator.XRadioGroup; |
||||
import com.fr.design.designer.creator.XTextArea; |
||||
import com.fr.design.designer.creator.XTreeComboBoxEditor; |
||||
import com.fr.design.designer.creator.XTreeEditor; |
||||
import com.fr.design.designer.creator.XWParameterLayout; |
||||
import com.fr.design.designer.creator.XWrapperedFieldEditor; |
||||
import com.fr.design.widgettheme.LabelSettingPane; |
||||
import com.fr.design.widgettheme.ParaButtonSettingPane; |
||||
import com.fr.design.widgettheme.ParaEditorSettingPane; |
||||
import com.fr.design.widgettheme.ParaTreeEditorSettingPane; |
||||
import com.fr.widgettheme.ParameterBackgroundStyleSettingPane; |
||||
import com.fr.widgettheme.utils.WidgetThemeServerUtils; |
||||
|
||||
import java.util.List; |
||||
|
||||
/** |
||||
* 参数面板控件主题窗口创建处理类 |
||||
* 当前类型被接受时,添加对应pane到extraPaneList |
||||
* |
||||
* @author obo |
||||
* @since 11.0 |
||||
* Created on 2023/11/13 |
||||
*/ |
||||
public class WidgetThemeParaCreatorPaneAdder { |
||||
|
||||
private WidgetThemeParaCreatorPaneAdder() {} |
||||
|
||||
/** |
||||
* 处理对应的参数面板控件creator |
||||
* 当类型判断符合时,将扩展的pane添加到list |
||||
* |
||||
* @param creator 控件creator |
||||
* @param extraPaneList 扩展paneList |
||||
*/ |
||||
public static <T> void add(XCreator creator, List<BasicBeanPane<T>> extraPaneList) { |
||||
if (WidgetThemeDesignerUtils.enableWidgetEnhance()) { |
||||
acceptEditor(creator, extraPaneList); |
||||
acceptSelect(creator, extraPaneList); |
||||
acceptRoot(creator, extraPaneList); |
||||
acceptTree(creator, extraPaneList); |
||||
acceptLabel(creator, extraPaneList); |
||||
acceptNormal(creator, extraPaneList); |
||||
acceptButton(creator, extraPaneList); |
||||
} |
||||
} |
||||
|
||||
private static <T> void insertShortCut(List<BasicBeanPane<T>> extraPaneList, BasicBeanPane pane) { |
||||
extraPaneList.add(0, pane); |
||||
} |
||||
|
||||
private static <T> void acceptEditor(XCreator creator, List<BasicBeanPane<T>> extraPaneList) { |
||||
boolean accept = creator instanceof XWrapperedFieldEditor || creator instanceof XTextArea; |
||||
if (accept) { |
||||
insertShortCut(extraPaneList, new ParaEditorSettingPane<>()); |
||||
} |
||||
} |
||||
|
||||
private static <T> void acceptSelect(XCreator creator, List<BasicBeanPane<T>> extraPaneList) { |
||||
boolean accept = creator instanceof XComboBox |
||||
|| creator instanceof XDateEditor |
||||
|| creator instanceof XTreeComboBoxEditor |
||||
|| WidgetThemeServerUtils.isNewComboBoxTreeEditor(creator); |
||||
if (accept) { |
||||
insertShortCut(extraPaneList, new ParaSelectEditorSettingPane<>()); |
||||
} |
||||
} |
||||
|
||||
private static <T> void acceptRoot(XCreator creator, List<BasicBeanPane<T>> extraPaneList) { |
||||
boolean accept = creator instanceof XWParameterLayout; |
||||
if (accept) { |
||||
insertShortCut(extraPaneList, new ParameterBackgroundStyleSettingPane()); |
||||
} |
||||
} |
||||
|
||||
private static <T> void acceptTree(XCreator creator, List<BasicBeanPane<T>> extraPaneList) { |
||||
boolean accept = creator instanceof XTreeEditor && !(creator instanceof XTreeComboBoxEditor); |
||||
if (accept) { |
||||
insertShortCut(extraPaneList, new ParaTreeEditorSettingPane<>()); |
||||
} |
||||
} |
||||
|
||||
private static <T> void acceptLabel(XCreator creator, List<BasicBeanPane<T>> extraPaneList) { |
||||
boolean accept = creator instanceof XLabel; |
||||
if (accept) { |
||||
insertShortCut(extraPaneList, new LabelSettingPane<>()); |
||||
} |
||||
} |
||||
|
||||
private static <T> void acceptNormal(XCreator creator, List<BasicBeanPane<T>> extraPaneList) { |
||||
boolean accept = creator instanceof XButton; |
||||
if (accept) { |
||||
insertShortCut(extraPaneList, new ParaNormalButtonSettingPane<>()); |
||||
} |
||||
} |
||||
|
||||
private static <T> void acceptButton(XCreator creator, List<BasicBeanPane<T>> extraPaneList) { |
||||
boolean accept = creator instanceof XRadioGroup || creator instanceof XCheckBoxGroup || creator instanceof XCheckBox; |
||||
if (accept) { |
||||
insertShortCut(extraPaneList, new ParaButtonSettingPane<>()); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,67 @@
|
||||
package com.fr.strongest; |
||||
|
||||
import com.finebi.cbb.utils.StringUtils; |
||||
import com.fr.base.io.BaseBook; |
||||
import com.fr.design.constants.DesignerLaunchStatus; |
||||
import com.fr.design.mainframe.JForm; |
||||
import com.fr.design.mainframe.JTemplate; |
||||
import com.fr.design.mainframe.JTemplateEvent; |
||||
import com.fr.design.mainframe.JWorkBook; |
||||
import com.fr.event.Event; |
||||
import com.fr.event.EventDispatcher; |
||||
import com.fr.event.Listener; |
||||
import com.fr.event.Null; |
||||
import com.fr.module.ModuleContext; |
||||
import com.fr.widgettheme.control.attr.WidgetDisplayEnhanceMarkAttr; |
||||
|
||||
/** |
||||
* 控件属性增强监听器启动类 |
||||
* |
||||
* @author obo |
||||
* @since 11.0 |
||||
* Created on 2023/11/13 |
||||
*/ |
||||
public class WidgetThemeListenerStarter { |
||||
private WidgetThemeListenerStarter(){} |
||||
|
||||
/** |
||||
* 启动对模版控件主题显示的监听开关 |
||||
*/ |
||||
public static void start() { |
||||
EventDispatcher.listen(DesignerLaunchStatus.STARTUP_COMPLETE, new Listener<Null>() { |
||||
@Override |
||||
public void on(Event event, Null param) { |
||||
init(); |
||||
} |
||||
}); |
||||
} |
||||
|
||||
private static void init() { |
||||
Listener<JTemplate> attrListener = new Listener<JTemplate>() { |
||||
@Override |
||||
public void on(Event event, JTemplate temp) { |
||||
dealWithJTemplate4Attr(temp); |
||||
} |
||||
}; |
||||
if (ModuleContext.isDesignerStartup()) { |
||||
EventDispatcher.listen(JTemplateEvent.BEFORE_TEMPLATE_INIT, attrListener); |
||||
} |
||||
} |
||||
|
||||
private static void dealWithJTemplate4Attr(JTemplate temp) { |
||||
if (temp instanceof JWorkBook || temp instanceof JForm) { |
||||
BaseBook workBook = (BaseBook) temp.getTarget(); |
||||
if (isNeedAddAttr(temp, workBook)) { |
||||
WidgetDisplayEnhanceMarkAttr attr = new WidgetDisplayEnhanceMarkAttr(); |
||||
attr.setWidgetEnhance(false); |
||||
workBook.addAttrMark(attr); |
||||
} |
||||
} |
||||
} |
||||
|
||||
private static boolean isNeedAddAttr(JTemplate temp, BaseBook workBook) { |
||||
// 模板为新建模板(temp.isNewCreateTpl没法用,此时还没赋值)
|
||||
return (StringUtils.isEmpty(workBook.getTemplateID()) || temp.isNewCreateTpl()) && |
||||
workBook.getAttrMark(WidgetDisplayEnhanceMarkAttr.XML_TAG) == null; |
||||
} |
||||
} |
Loading…
Reference in new issue