Browse Source
* 'feature/x' of ssh://code.fineres.com:7999/~fanglei/design10.0: (83 commits) REPORT-58697 【主题切换】frm主题body背景设置默认图片,缩略图变黑 REPORT-55744 【组件背景分离】【下个版本】组件复用-frm中拖入报表块设置单元格背景色后,缩略图背景没有及时修改 REPORT-56014 & REPORT-56015 【组件背景分离】【下个版本】组件复用-组件边框点九图,如果线重叠了的话,web端显示有问题 REPORT-57810 - 固定布局-原布局推荐4.1 REPORT-55377 升级tomcat到8.5.69 REPORT-56220 数据连接越权漏洞修复 REPORT-56220 数据连接越权漏洞修复 REPORT-56220 数据连接越权漏洞修复 国际化 REPORT-57810 - 固定布局-原布局推荐4.1 REPORT-56220 数据连接越权漏洞修复 REPORT-55377 更新Tomcat版本到8.5.69 无JIRA任务 去除重复方法 CHART-20642 图表预定义配色避免重名和空字符串名 无JIRA任务,打包报错 REPORT-59523 【主题切换】拖入的新组件没有跟随主题 CHART-20522 && REPORT-59010 final传一份 REPORT-59450 创建组件封面图背景是黑的 REPORT-59189 导出-导出事件-导出模板选cptx会出问题 REPORT-59166 韩文设计器设置条件属性 条件属性框体标题显示不全 ...research/11.0
方磊
3 years ago
122 changed files with 2494 additions and 1434 deletions
@ -0,0 +1,20 @@
|
||||
package com.fr.design.mainframe.authority; |
||||
|
||||
import com.fr.report.cell.cellattr.core.group.DSColumn; |
||||
import org.jetbrains.annotations.Nullable; |
||||
|
||||
import java.util.Arrays; |
||||
import java.util.HashSet; |
||||
import java.util.Set; |
||||
|
||||
public class DSColumnAuthorityChecker extends ElementAuthorityChecker<DSColumn> { |
||||
|
||||
@Override |
||||
@Nullable |
||||
Set<String> getNoAuthDatasetNames(DSColumn dsColumn, Set<String> authDatasetNames) { |
||||
if (!authDatasetNames.contains(dsColumn.getDSName())) { |
||||
return new HashSet<>(Arrays.asList(dsColumn.getDSName())); |
||||
} |
||||
return null; |
||||
} |
||||
} |
@ -0,0 +1,45 @@
|
||||
package com.fr.design.mainframe.authority; |
||||
|
||||
import org.jetbrains.annotations.Nullable; |
||||
import sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl; |
||||
|
||||
import java.lang.reflect.Type; |
||||
import java.util.Set; |
||||
|
||||
|
||||
public abstract class ElementAuthorityChecker<T> { |
||||
|
||||
|
||||
/** |
||||
* @Description 获取越权的数据连接 |
||||
* @param: t 待检查的对象 |
||||
* @param: authConnectionNames 有权限的数据连接名 |
||||
* @return 如果有返回名称,没有返回null |
||||
*/ |
||||
@Nullable |
||||
Set<String> getNoAuthConnectionNames(T t, Set<String> authConnectionNames) { |
||||
return null; |
||||
} |
||||
|
||||
|
||||
/** |
||||
* @Description 获取越权的服务器数据集 |
||||
* @param: t 待检查的对象 |
||||
* @param: authDatasetNames 有权限的服务器数据集名 |
||||
* @return 如果有返回名称,没有返回null |
||||
*/ |
||||
@Nullable |
||||
Set<String> getNoAuthDatasetNames(T t, Set<String> authDatasetNames) { |
||||
return null; |
||||
} |
||||
|
||||
/** |
||||
* @Description 要检查对象的className |
||||
* @return className |
||||
*/ |
||||
String getCheckClassName() { |
||||
ParameterizedTypeImpl parameterizedType = (ParameterizedTypeImpl) this.getClass().getGenericSuperclass(); |
||||
Type type = parameterizedType.getActualTypeArguments()[0]; |
||||
return type.getTypeName(); |
||||
} |
||||
} |
@ -0,0 +1,27 @@
|
||||
package com.fr.design.mainframe.authority; |
||||
|
||||
import com.fr.base.Formula; |
||||
import org.jetbrains.annotations.Nullable; |
||||
|
||||
import java.util.Arrays; |
||||
import java.util.HashSet; |
||||
import java.util.Set; |
||||
import java.util.regex.Matcher; |
||||
import java.util.regex.Pattern; |
||||
|
||||
public class FormulaAuthorityChecker extends ElementAuthorityChecker<Formula> { |
||||
private static final Pattern FORMULA_PATTERN = Pattern.compile("^=SQL\\(\"(.+?)\","); |
||||
|
||||
@Override |
||||
@Nullable |
||||
public Set<String> getNoAuthConnectionNames(Formula formula, Set<String> authConnectionNames) { |
||||
String content = formula.getContent(); |
||||
Matcher matcher = FORMULA_PATTERN.matcher(content); |
||||
if (matcher.find()) { |
||||
if (!authConnectionNames.contains(matcher.group(1))) { |
||||
return new HashSet<>(Arrays.asList(matcher.group(1))); |
||||
} |
||||
} |
||||
return null; |
||||
} |
||||
} |
@ -0,0 +1,184 @@
|
||||
package com.fr.design.mainframe.authority; |
||||
|
||||
|
||||
import com.fr.design.dialog.FineJOptionPane; |
||||
|
||||
import com.fr.design.i18n.Toolkit; |
||||
import com.fr.design.mainframe.DesignerContext; |
||||
import com.fr.design.mainframe.JTemplate; |
||||
import com.fr.design.mod.ModClassFilter; |
||||
import com.fr.invoke.ClassHelper; |
||||
|
||||
import com.fr.log.FineLoggerFactory; |
||||
import com.fr.rpc.ExceptionHandler; |
||||
import com.fr.rpc.RPCInvokerExceptionInfo; |
||||
import com.fr.stable.Filter; |
||||
import com.fr.workspace.WorkContext; |
||||
import com.fr.workspace.server.authority.user.UserAuthority; |
||||
|
||||
import java.util.Collection; |
||||
import java.util.HashMap; |
||||
import java.util.HashSet; |
||||
import java.util.Iterator; |
||||
import java.util.Map; |
||||
import java.util.Set; |
||||
|
||||
|
||||
import static javax.swing.JOptionPane.WARNING_MESSAGE; |
||||
|
||||
|
||||
public class JTemplateAuthorityChecker { |
||||
JTemplate<?, ?> jTemplate; |
||||
Set<String> authConnectionNames; |
||||
Set<String> authDatasetNames; |
||||
Map<String, ElementAuthorityChecker> checkerMap = new HashMap<>(); |
||||
Set<String> authFailConnectionNames = new HashSet<>(); |
||||
Set<String> authFailDatasetNames = new HashSet<>(); |
||||
|
||||
|
||||
public JTemplateAuthorityChecker(JTemplate<?, ?> jTemplate) { |
||||
long s = System.currentTimeMillis(); |
||||
this.jTemplate = jTemplate; |
||||
this.initAuthNames(); |
||||
this.initChecker(); |
||||
FineLoggerFactory.getLogger().info("JTemplateAuthorityChecker init time consume:" + (System.currentTimeMillis() - s)); |
||||
} |
||||
|
||||
private void initAuthNames() { |
||||
UserAuthority templateAuthority = WorkContext.getCurrent().get(UserAuthority.class); |
||||
Map<String, Set<String>> authNamesMap = templateAuthority.getAuthServerDataSetAndConnectionNames(); |
||||
if (authNamesMap != null) { |
||||
//有权限的数据连接名称
|
||||
authConnectionNames = authNamesMap.get(UserAuthority.AUTH_CONNECTION_NAMES); |
||||
//有权限的数据集名称(模板数据集和服务器数据集)
|
||||
authDatasetNames = authNamesMap.get(UserAuthority.AUTH_SERVER_DATASET_NAMES); |
||||
Iterator<String> iterator = jTemplate.getTarget().getTableDataNameIterator(); |
||||
while (iterator.hasNext()) { |
||||
String datasetName = iterator.next(); |
||||
authDatasetNames.add(datasetName); |
||||
} |
||||
} |
||||
} |
||||
|
||||
private void initChecker() { |
||||
registerChecker(new NameDatabaseConnectionAuthorityChecker()); |
||||
registerChecker(new DSColumnAuthorityChecker()); |
||||
registerChecker(new FormulaAuthorityChecker()); |
||||
registerChecker(new NameTableDataAuthorityChecker()); |
||||
} |
||||
|
||||
private void registerChecker(ElementAuthorityChecker checker) { |
||||
checkerMap.put(checker.getCheckClassName(), checker); |
||||
} |
||||
|
||||
|
||||
public boolean isAuthority() { |
||||
long s = System.currentTimeMillis(); |
||||
//遍历模板对象,根据checkerMap.keySet()把感兴趣的对象找出来
|
||||
Map<String, Collection<Object>> targetObjects = ClassHelper.searchObject(jTemplate.getTarget(), checkerMap.keySet(), ClassFilter.getInstance()); |
||||
|
||||
//找到对应的checker,对对象进行检查
|
||||
for (String name : targetObjects.keySet()) { |
||||
ElementAuthorityChecker checker = checkerMap.get(name); |
||||
for (Object object : targetObjects.get(name)) { |
||||
if (authConnectionNames != null) { |
||||
Set<String> noAuthName = checker.getNoAuthConnectionNames(object, authConnectionNames); |
||||
if (noAuthName != null) { |
||||
authFailConnectionNames.addAll(noAuthName); |
||||
} |
||||
} |
||||
if (authDatasetNames != null) { |
||||
Set<String> noAuthName = checker.getNoAuthDatasetNames(object, authDatasetNames); |
||||
if (noAuthName != null) { |
||||
authFailDatasetNames.addAll(noAuthName); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
FineLoggerFactory.getLogger().info("JTemplateAuthorityChecker check time consume:" + (System.currentTimeMillis() - s)); |
||||
return authFailConnectionNames.size() == 0 && authFailDatasetNames.size() == 0; |
||||
} |
||||
|
||||
public void showAuthorityFailPromptDialog() { |
||||
StringBuffer stringBuffer = new StringBuffer(); |
||||
stringBuffer.append(Toolkit.i18nText("Fine-Design-Basic_Save_Failure")); |
||||
stringBuffer.append("\n"); |
||||
stringBuffer.append(getPromptInfo(authFailDatasetNames, |
||||
Toolkit.i18nText("Fine-Design_Template_Authority_Check_Server_Dataset_Authority"))); |
||||
stringBuffer.append(getPromptInfo(authFailConnectionNames, |
||||
Toolkit.i18nText("Fine-Design_Template_Authority_Check_Data_Connection_Authority"))); |
||||
FineJOptionPane.showMessageDialog( |
||||
DesignerContext.getDesignerFrame(), |
||||
stringBuffer.toString(), |
||||
Toolkit.i18nText("Fine-Design_Basic_Alert"), |
||||
WARNING_MESSAGE); |
||||
} |
||||
|
||||
private String getPromptInfo(Set<String> authFailNames, String message) { |
||||
StringBuffer stringBuffer = new StringBuffer(); |
||||
if (authFailNames.size() > 0) { |
||||
stringBuffer.append(Toolkit.i18nText("Fine-Design_Template_Authority_Check_Current_Operator_Miss")); |
||||
stringBuffer.append(authFailNames.size()); |
||||
stringBuffer.append(Toolkit.i18nText("Fine-Design_Report_Ge")); |
||||
stringBuffer.append(message); |
||||
stringBuffer.append("\n"); |
||||
stringBuffer.append(getNoAuthNameSequence(authFailNames)); |
||||
} |
||||
return stringBuffer.toString(); |
||||
} |
||||
|
||||
private String getNoAuthNameSequence(Set<String> names) { |
||||
StringBuffer stringBuffer = new StringBuffer(); |
||||
int showMaxCount = 3; |
||||
int count = 0; |
||||
for (String name : names) { |
||||
if (count == showMaxCount) { |
||||
stringBuffer.append(Toolkit.i18nText("Fine-Design_Template_Authority_Check_Etc")); |
||||
break; |
||||
} |
||||
stringBuffer.append(name); |
||||
if (count != names.size() - 1 && count != showMaxCount - 1) { |
||||
stringBuffer.append(";"); |
||||
} |
||||
count++; |
||||
} |
||||
stringBuffer.append("\n"); |
||||
return stringBuffer.toString(); |
||||
} |
||||
|
||||
static class ClassFilter implements Filter<String> { |
||||
|
||||
private static final Set<String> FILTER_SET = new HashSet<>(); |
||||
private static final Set<String> START_WITH_SET = new HashSet<>(); |
||||
private static final Filter<String> INSTANCE = new ModClassFilter(); |
||||
|
||||
public static Filter<String> getInstance() { |
||||
return INSTANCE; |
||||
} |
||||
|
||||
static { |
||||
FILTER_SET.add("java.awt.image.BufferedImage"); |
||||
FILTER_SET.add("sun.awt.AppContext"); |
||||
FILTER_SET.add("com.fr.poly.creator.ECBlockCreator"); |
||||
FILTER_SET.add("io.netty.channel.nio.SelectedSelectionKeySet"); |
||||
FILTER_SET.add("com.fr.form.ui.ElementCaseImage"); |
||||
FILTER_SET.add("this$0"); |
||||
START_WITH_SET.add("com.fr.design"); |
||||
} |
||||
|
||||
@Override |
||||
public boolean accept(String s) { |
||||
if (FILTER_SET.contains(s)) { |
||||
return true; |
||||
} |
||||
for (String start : START_WITH_SET) { |
||||
if (s.startsWith(start)) { |
||||
return true; |
||||
} |
||||
} |
||||
return false; |
||||
} |
||||
} |
||||
} |
||||
|
@ -0,0 +1,22 @@
|
||||
package com.fr.design.mainframe.authority; |
||||
|
||||
import com.fr.data.impl.NameDatabaseConnection; |
||||
import org.jetbrains.annotations.Nullable; |
||||
|
||||
import java.util.Arrays; |
||||
import java.util.HashSet; |
||||
import java.util.Set; |
||||
import java.util.stream.Collectors; |
||||
|
||||
public class NameDatabaseConnectionAuthorityChecker extends ElementAuthorityChecker<NameDatabaseConnection> { |
||||
@Override |
||||
@Nullable |
||||
Set<String> getNoAuthConnectionNames(NameDatabaseConnection nameDatabaseConnection, Set<String> authConnectionNames) { |
||||
String name = nameDatabaseConnection.getName(); |
||||
if (!authConnectionNames.contains(name)) { |
||||
return new HashSet<>(Arrays.asList(name)); |
||||
} |
||||
return null; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,19 @@
|
||||
package com.fr.design.mainframe.authority; |
||||
|
||||
import com.fr.data.impl.NameTableData; |
||||
import org.jetbrains.annotations.Nullable; |
||||
|
||||
import java.util.Arrays; |
||||
import java.util.HashSet; |
||||
import java.util.Set; |
||||
|
||||
public class NameTableDataAuthorityChecker extends ElementAuthorityChecker<NameTableData> { |
||||
@Override |
||||
@Nullable |
||||
Set<String> getNoAuthDatasetNames(NameTableData nameTableData, Set<String> authDatasetNames) { |
||||
if (!authDatasetNames.contains(nameTableData.getName())) { |
||||
return new HashSet<>(Arrays.asList(nameTableData.getName())); |
||||
} |
||||
return null; |
||||
} |
||||
} |
@ -0,0 +1,46 @@
|
||||
package com.fr.design.utils.gui; |
||||
|
||||
import com.fr.base.Style; |
||||
import com.fr.base.background.ColorBackground; |
||||
import com.fr.design.base.mode.DesignModeContext; |
||||
import com.fr.report.cell.CellElement; |
||||
import com.fr.report.cell.FloatElement; |
||||
|
||||
import java.awt.Color; |
||||
|
||||
/** |
||||
* @author shine |
||||
* @version 10.0 |
||||
* Created by shine on 2021/9/6 |
||||
*/ |
||||
public class AdjustWorkBookDefaultStyleUtils { |
||||
|
||||
private static final Color TEMPLATE_BACKGROUND = new Color(16, 11, 43); |
||||
private static final Color CELL_ELEMENT_BORDER = new Color(110, 110, 110); |
||||
|
||||
public static void adjustCellElement(CellElement cellElement) { |
||||
if (DesignModeContext.isDuchampMode()) { |
||||
Style style = cellElement.getStyle(); |
||||
style = style.deriveFRFont(style.getFRFont().applyForeground(Color.WHITE)); |
||||
style = style.deriveBorder(0, CELL_ELEMENT_BORDER, |
||||
0, CELL_ELEMENT_BORDER, |
||||
0, CELL_ELEMENT_BORDER, |
||||
0, CELL_ELEMENT_BORDER); |
||||
cellElement.setStyle(style); |
||||
} |
||||
} |
||||
|
||||
public static void adjustFloatElement(FloatElement floatElement) { |
||||
if (DesignModeContext.isDuchampMode()) { |
||||
Style style = floatElement.getStyle(); |
||||
style = style.deriveBackground(ColorBackground.getInstance(TEMPLATE_BACKGROUND)); |
||||
style = style.deriveFRFont(style.getFRFont().applyForeground(Color.WHITE)); |
||||
floatElement.setStyle(style); |
||||
} |
||||
} |
||||
|
||||
public static Color adjustBack(Color color) { |
||||
return DesignModeContext.isDuchampMode() ? TEMPLATE_BACKGROUND : color; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,88 @@
|
||||
package com.fr.nx.app.designer.utils; |
||||
|
||||
import com.fr.base.extension.FileExtension; |
||||
import com.fr.design.mainframe.JTemplate; |
||||
import com.fr.file.FILE; |
||||
import com.fr.main.TemplateWorkBook; |
||||
import com.fr.report.report.Report; |
||||
import com.fr.report.stable.LayerReportAttr; |
||||
import com.fr.report.worksheet.WorkSheet; |
||||
|
||||
/** |
||||
* @author fly.li |
||||
* @version 10.0 |
||||
* Created on 2021/09/12 |
||||
*/ |
||||
public class CptAndCptxCompatibilityUtil { |
||||
|
||||
/** |
||||
* 判断是否需要重新编译 |
||||
**/ |
||||
public static boolean needRecompile(String oldName, JTemplate jTemplate){ |
||||
FILE editingFILE = jTemplate.getEditingFILE(); |
||||
String path = editingFILE.getPath(); |
||||
//只有在旧文件是cptx文件并且新文件是cpt文件时才会改变报表引擎属性
|
||||
boolean isCptxConvertToCpt = FileExtension.CPTX.matchExtension(oldName) && FileExtension.CPT.matchExtension(path); |
||||
if (isCptxConvertToCpt && !setFrEngineAttr(jTemplate)){ |
||||
isCptxConvertToCpt = false; |
||||
} |
||||
return (isCptxConvertToCpt || isSaveAs(jTemplate, oldName, path)); |
||||
} |
||||
|
||||
/** |
||||
* 判断是不是cptx模板或者开启了的新引擎的cpt模板的另存为操作 |
||||
**/ |
||||
private static boolean isSaveAs(JTemplate jTemplate, String oldName, String newName){ |
||||
return isEngineXEnable(jTemplate.getTarget(), newName) && ((FileExtension.CPTX.matchExtension(oldName) && FileExtension.CPTX.matchExtension(newName)) || (FileExtension.CPT.matchExtension(oldName) && FileExtension.CPT.matchExtension(newName))); |
||||
} |
||||
|
||||
/** |
||||
* cptx另存为cpt需要修改报表引擎属性 |
||||
**/ |
||||
private static boolean setFrEngineAttr(JTemplate jTemplate){ |
||||
WorkSheet workSheet = gainWorkSheet(jTemplate.getTarget()); |
||||
if (workSheet == null){ |
||||
return false; |
||||
}else { |
||||
LayerReportAttr layerReportAttr = workSheet.getLayerReportAttr(); |
||||
if (layerReportAttr == null){ |
||||
layerReportAttr = new LayerReportAttr(); |
||||
workSheet.setLayerReportAttr(layerReportAttr); |
||||
} |
||||
layerReportAttr.setClientPaging(true); |
||||
layerReportAttr.setEngineState(0); |
||||
return true; |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 是否启用了新引擎的判断 |
||||
* cptx自动走新引擎(非兼容模式),cpt需要进行设置 |
||||
* */ |
||||
public static boolean isEngineXEnable(Object workBook, String fileName){ |
||||
WorkSheet workSheet = gainWorkSheet(workBook); |
||||
LayerReportAttr layerReportAttr = gainLayerReportAttr(workSheet); |
||||
return isEngineXEnable(layerReportAttr, fileName); |
||||
} |
||||
|
||||
private static LayerReportAttr gainLayerReportAttr(WorkSheet workSheet){ |
||||
if (workSheet != null){ |
||||
LayerReportAttr layerReportAttr = workSheet.getLayerReportAttr(); |
||||
return layerReportAttr; |
||||
} else { |
||||
return null; |
||||
} |
||||
} |
||||
|
||||
private static WorkSheet gainWorkSheet(Object workBook){ |
||||
if (workBook == null || !(workBook instanceof TemplateWorkBook)){ |
||||
return null; |
||||
} |
||||
Report report = ((TemplateWorkBook) workBook).getReport(0); |
||||
return report instanceof WorkSheet ? (WorkSheet)report : null; |
||||
} |
||||
|
||||
private static boolean isEngineXEnable(LayerReportAttr layerReportAttr, String fileName){ |
||||
return (layerReportAttr!= null && layerReportAttr.isClientPaging() && layerReportAttr.getEngineState() == LayerReportAttr.ENGINE_X) || FileExtension.CPTX.matchExtension(fileName); |
||||
} |
||||
} |
@ -0,0 +1,16 @@
|
||||
package com.fr.design.designer.beans.actions.behavior; |
||||
|
||||
import com.fr.design.designer.beans.actions.FormWidgetEditAction; |
||||
import com.fr.design.mainframe.FormDesigner; |
||||
|
||||
public class PasteEnable implements UpdateBehavior<FormWidgetEditAction> { |
||||
@Override |
||||
public void doUpdate(FormWidgetEditAction action) { |
||||
FormDesigner designer = action.getEditingComponent(); |
||||
if (designer == null) { |
||||
action.setEnabled(false); |
||||
return; |
||||
} |
||||
action.setEnabled(designer.isCurrentComponentPastable()); |
||||
} |
||||
} |
@ -0,0 +1,23 @@
|
||||
package com.fr.design.designer.beans.adapters.layout; |
||||
|
||||
public class DefaultDesignerBaseOperate implements DesignerBaseOperate{ |
||||
@Override |
||||
public boolean supportCopyAction() { |
||||
return true; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportCutAction() { |
||||
return true; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportPasteAction() { |
||||
return true; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportDeleteAction() { |
||||
return true; |
||||
} |
||||
} |
@ -0,0 +1,33 @@
|
||||
package com.fr.design.designer.beans.adapters.layout; |
||||
|
||||
public interface DesignerBaseOperate { |
||||
|
||||
/** |
||||
* 是否支持复制 |
||||
* |
||||
* @return boolean |
||||
*/ |
||||
boolean supportCopyAction(); |
||||
|
||||
/** |
||||
* 是否支持剪切 |
||||
* |
||||
* @return boolean |
||||
*/ |
||||
boolean supportCutAction(); |
||||
|
||||
/** |
||||
* 是否支持粘贴 |
||||
* |
||||
* @return boolean |
||||
*/ |
||||
boolean supportPasteAction(); |
||||
|
||||
/** |
||||
* 是否支持删除 |
||||
* |
||||
* @return boolean |
||||
*/ |
||||
boolean supportDeleteAction(); |
||||
|
||||
} |
@ -0,0 +1,134 @@
|
||||
package com.fr.design.designer.beans.adapters.layout; |
||||
|
||||
import com.fr.base.svg.IconUtils; |
||||
import com.fr.design.designer.beans.HoverPainter; |
||||
import com.fr.design.designer.beans.models.ModelUtil; |
||||
import com.fr.design.designer.beans.models.SelectionModel; |
||||
import com.fr.design.designer.beans.painters.FRFixLayoutPainter; |
||||
import com.fr.design.designer.creator.XCreator; |
||||
import com.fr.design.designer.creator.XLayoutContainer; |
||||
import com.fr.design.designer.creator.XOccupiedLayout; |
||||
import com.fr.design.designer.treeview.DefaultXCreatorTreeCellRender; |
||||
import com.fr.design.designer.treeview.XCreatorTreeCellRender; |
||||
import com.fr.design.mainframe.FormDesigner; |
||||
import com.fr.design.mainframe.WidgetPropertyPane; |
||||
import com.fr.form.ui.container.OccupiedLayout; |
||||
import javax.swing.Icon; |
||||
import java.awt.Component; |
||||
import java.awt.Dimension; |
||||
import java.awt.Graphics; |
||||
|
||||
public class FRFixLayoutAdapter extends AbstractLayoutAdapter { |
||||
private static final Icon OCCUPIED_ICON = IconUtils.readIcon("/com/fr/design/form/images/occupied_layout.png"); |
||||
|
||||
public FRFixLayoutAdapter(XLayoutContainer container) { |
||||
super(container); |
||||
} |
||||
|
||||
public void addComp(XCreator child, int x, int y) { |
||||
Component component = container.getComponentAt(x, y); |
||||
if (component == container) { |
||||
return; |
||||
} |
||||
child.setLocation(component.getX(), component.getY()); |
||||
child.setSize(component.getWidth(), component.getHeight()); |
||||
container.remove(component); |
||||
if (child.shouldScaleCreator() || child.hasTitleStyle()) { |
||||
XLayoutContainer parentPanel = child.initCreatorWrapper(21); |
||||
container.add(parentPanel, child.toData().getWidgetName()); |
||||
} else { |
||||
container.add(child, child.toData().getWidgetName()); |
||||
} |
||||
if (child.getBackupRectangle() != null && child.getParent() == container) { |
||||
Component origin = container.getComponentAt(child.getBackupRectangle().x + 5, child.getBackupRectangle().y + 5); |
||||
if (origin == container) { |
||||
return; |
||||
} |
||||
if (origin instanceof XOccupiedLayout) { |
||||
((XOccupiedLayout) origin).getLayoutAdapter().addBean((XCreator) component, child.getBackupRectangle().x + 5, child.getBackupRectangle().y + 5); |
||||
} |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public void delete(XCreator creator, int creatorWidth, int creatorHeight) { |
||||
OccupiedLayout occupiedLayout = new OccupiedLayout(); |
||||
FormDesigner formDesigner = WidgetPropertyPane.getInstance().getEditingFormDesigner(); |
||||
XOccupiedLayout xoccupiedLayout = new XOccupiedLayout(occupiedLayout, new Dimension()); |
||||
ModelUtil.renameWidgetName(formDesigner.getTarget(), xoccupiedLayout); |
||||
xoccupiedLayout.setLocation(creator.getX(), creator.getY()); |
||||
xoccupiedLayout.setSize(creatorWidth, creatorHeight); |
||||
container.add(xoccupiedLayout); |
||||
} |
||||
|
||||
@Override |
||||
public XCreatorTreeCellRender getLayoutTreeCellRender(XCreator creator) { |
||||
return new DefaultXCreatorTreeCellRender(creator) { |
||||
@Override |
||||
public void paint(Graphics g, Component c) { |
||||
if (!getxCreator().acceptType(XOccupiedLayout.class)) { |
||||
OCCUPIED_ICON.paintIcon(c, g, 0, 0); |
||||
} |
||||
super.paint(g, c); |
||||
} |
||||
}; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportModifyInsert() { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public DesignerBaseOperate getDesignerBaseOperate() { |
||||
return new DesignerBaseOperate() { |
||||
@Override |
||||
public boolean supportCopyAction() { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportCutAction() { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportPasteAction() { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportDeleteAction() { |
||||
return true; |
||||
} |
||||
}; |
||||
} |
||||
|
||||
@Override |
||||
public boolean accept(XCreator creator, int x, int y) { |
||||
return true; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public HoverPainter getPainter() { |
||||
return new FRFixLayoutPainter(container); |
||||
} |
||||
|
||||
@Override |
||||
public void dragStart(XCreator xCreator, SelectionModel selectionModel) { |
||||
//do nothing
|
||||
} |
||||
|
||||
public void dragOver(XCreator xCreator, SelectionModel selectionModel, int x, int y) { |
||||
//当鼠标移出被拖拽的组件时,才将组件从selectionmodel 中移出
|
||||
if (xCreator.getBackupRectangle()!= null && !xCreator.getBackupRectangle().contains(x, y) |
||||
&& selectionModel.getSelection().contains(xCreator.toData())) { |
||||
selectionModel.removeCreator(xCreator, xCreator.getWidth(), xCreator.getHeight()); |
||||
selectionModel.setSelectedCreator(container); |
||||
} |
||||
|
||||
} |
||||
|
||||
; |
||||
} |
@ -0,0 +1,116 @@
|
||||
package com.fr.design.designer.beans.adapters.layout; |
||||
|
||||
import com.fr.design.designer.beans.models.SelectionModel; |
||||
import com.fr.design.designer.beans.painters.AbstractPainter; |
||||
import com.fr.design.designer.beans.painters.FRFitLayoutPainter; |
||||
import com.fr.design.designer.creator.XCreator; |
||||
import com.fr.design.designer.creator.XLayoutContainer; |
||||
import com.fr.design.designer.creator.XWFitLayout; |
||||
import com.fr.design.designer.creator.cardlayout.XWTabFitLayout; |
||||
|
||||
import java.awt.Component; |
||||
import java.util.ArrayList; |
||||
|
||||
public class FRNoFixLayoutAdapter extends AbstractLayoutAdapter { |
||||
private int minHeight; |
||||
private FRBodyLayoutAdapter parentLayoutAdapter; |
||||
|
||||
public FRNoFixLayoutAdapter(FRBodyLayoutAdapter parentLayoutAdapter, XLayoutContainer container, int minHeight) { |
||||
super(container); |
||||
this.parentLayoutAdapter = parentLayoutAdapter; |
||||
this.minHeight = minHeight; |
||||
} |
||||
|
||||
@Override |
||||
public void addComp(XCreator child, int x, int y) { |
||||
fix(child, x, y); |
||||
if (child.shouldScaleCreator() || child.hasTitleStyle()) { |
||||
addParentCreator(child); |
||||
} else { |
||||
container.add(child, child.toData().getWidgetName()); |
||||
} |
||||
XWFitLayout layout = (XWFitLayout) container; |
||||
// 更新对应的BoundsWidget
|
||||
layout.updateBoundsWidget(); |
||||
updateCreatorBackBound(); |
||||
} |
||||
|
||||
private void updateCreatorBackBound() { |
||||
for (int i = 0, size = container.getComponentCount(); i < size; i++) { |
||||
XCreator creator = (XCreator) container.getComponent(i); |
||||
creator.updateChildBound(minHeight); |
||||
creator.setBackupBound(creator.getBounds()); |
||||
//tab布局用到
|
||||
ArrayList<?> childrenList = creator.getTargetChildrenList(); |
||||
for (int j = 0; j < childrenList.size(); j++) { |
||||
XWTabFitLayout tabLayout = (XWTabFitLayout) childrenList.get(j); |
||||
for (int m = 0; m < tabLayout.getComponentCount(); m++) { |
||||
XCreator childCreator = tabLayout.getXCreator(m); |
||||
childCreator.setBackupBound(childCreator.getBounds()); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
private void addParentCreator(XCreator child) { |
||||
XLayoutContainer parentPanel = child.initCreatorWrapper(minHeight); |
||||
container.add(parentPanel, child.toData().getWidgetName()); |
||||
} |
||||
|
||||
private void fix(XCreator child, int x, int y) { |
||||
Component parentComp = container.getComponentAt(x, y); |
||||
if (container.getComponentCount() == 0) { |
||||
child.setLocation(0, 0); |
||||
child.setSize(parentComp.getWidth(), parentComp.getHeight()); |
||||
} else if (parentLayoutAdapter.isCrossPointArea(parentComp, x, y)) { |
||||
//交叉区域插入组件时,根据具体位置进行上下或者左右或者相邻三个组件的位置大小插入
|
||||
parentLayoutAdapter.fixCrossPointArea(parentComp, child, x, y); |
||||
return; |
||||
} else if (parentLayoutAdapter.isTrisectionArea(parentComp, x, y)) { |
||||
// 在边界三等分区域,就不再和组件二等分了
|
||||
parentLayoutAdapter.fixTrisect(parentComp, child, x, y); |
||||
return; |
||||
} else { |
||||
parentLayoutAdapter.fixHalve(parentComp, child, x, y); |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public void delete(XCreator creator, int creatorWidth, int creatorHeight) { |
||||
int x = creator.getX(); |
||||
int y = creator.getY(); |
||||
((FRFitLayoutAdapter)parentLayoutAdapter).recalculateChildrenSize(x, y, creatorWidth, creatorHeight, true); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public boolean supportModifyInsert() { |
||||
return true; |
||||
} |
||||
|
||||
@Override |
||||
public DesignerBaseOperate getDesignerBaseOperate() { |
||||
return new DefaultDesignerBaseOperate() { |
||||
@Override |
||||
public boolean supportCutAction() { |
||||
return container.getComponentCount() > 1; |
||||
} |
||||
}; |
||||
} |
||||
|
||||
@Override |
||||
public boolean accept(XCreator creator, int x, int y) { |
||||
return true; |
||||
} |
||||
|
||||
@Override |
||||
public AbstractPainter getPainter() { |
||||
return new FRFitLayoutPainter(container); |
||||
} |
||||
|
||||
@Override |
||||
public void dragStart(XCreator xCreator, SelectionModel selectionModel) { |
||||
selectionModel.removeCreator(xCreator, xCreator.getWidth(), xCreator.getHeight()); |
||||
selectionModel.setSelectedCreator(container); |
||||
} |
||||
} |
@ -0,0 +1,68 @@
|
||||
package com.fr.design.designer.beans.adapters.layout; |
||||
|
||||
import com.fr.design.designer.beans.HoverPainter; |
||||
import com.fr.design.designer.beans.painters.FROccupiedLayoutPainter; |
||||
import com.fr.design.designer.creator.XCreator; |
||||
import com.fr.design.designer.creator.XLayoutContainer; |
||||
import com.fr.design.designer.treeview.DefaultXCreatorTreeCellRender; |
||||
import com.fr.design.designer.treeview.XCreatorTreeCellRender; |
||||
import com.fr.design.utils.gui.LayoutUtils; |
||||
import java.awt.Color; |
||||
import java.awt.Component; |
||||
import java.awt.Container; |
||||
import java.awt.Graphics; |
||||
|
||||
public class FROccupiedLayoutAdapter extends AbstractLayoutAdapter { |
||||
|
||||
|
||||
public FROccupiedLayoutAdapter(XLayoutContainer container) { |
||||
super(container); |
||||
painter = new FROccupiedLayoutPainter(container); |
||||
} |
||||
|
||||
|
||||
private HoverPainter painter; |
||||
|
||||
|
||||
@Override |
||||
protected void addComp(XCreator creator, int x, int y) { |
||||
if (container.getComponentCount() == 0) { |
||||
creator.setLocation(container.getLocation().x, container.getLocation().y); |
||||
creator.setSize(container.getWidth(), container.getHeight()); |
||||
//将 xcreator 添加到其父容器中,并删除此
|
||||
XLayoutContainer parent = (XLayoutContainer) container.getParent(); |
||||
parent.getLayoutAdapter().removeBean(container, container.getWidth(), container.getHeight()); |
||||
if (creator.shouldScaleCreator() || creator.hasTitleStyle()) { |
||||
XLayoutContainer parentPanel = creator.initCreatorWrapper(21); |
||||
parent.add(parentPanel, creator.toData().getWidgetName()); |
||||
} else { |
||||
parent.add(creator, creator.toData().getWidgetName()); |
||||
} |
||||
LayoutUtils.layoutContainer(parent); |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public HoverPainter getPainter() { |
||||
return painter; |
||||
} |
||||
|
||||
@Override |
||||
public boolean accept(XCreator creator, int x, int y) { |
||||
return container.getComponentCount() == 0; |
||||
} |
||||
|
||||
public XCreatorTreeCellRender getLayoutTreeCellRender(XCreator creator) { |
||||
return new DefaultXCreatorTreeCellRender(creator) { |
||||
@Override |
||||
public void paint(Graphics g, Component c) { |
||||
super.paint(g, c); |
||||
Color oldColor = g.getColor(); |
||||
g.setColor(Color.RED); |
||||
g.drawRect(0, 0, 16, 16); |
||||
g.setColor(oldColor); |
||||
} |
||||
}; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,130 @@
|
||||
package com.fr.design.designer.beans.painters; |
||||
|
||||
import com.fr.design.designer.beans.painters.AbstractPainter; |
||||
import com.fr.design.designer.creator.XCreator; |
||||
import com.fr.design.designer.creator.XLayoutContainer; |
||||
import com.fr.design.designer.creator.XOccupiedLayout; |
||||
import com.fr.design.form.util.XCreatorConstants; |
||||
|
||||
import java.awt.AlphaComposite; |
||||
import java.awt.Color; |
||||
import java.awt.Component; |
||||
import java.awt.Composite; |
||||
import java.awt.Graphics; |
||||
import java.awt.Graphics2D; |
||||
import java.awt.Rectangle; |
||||
import java.awt.Stroke; |
||||
|
||||
public class FRFixLayoutPainter extends AbstractPainter { |
||||
|
||||
/** |
||||
* 构造函数 |
||||
* |
||||
* @param container |
||||
*/ |
||||
public FRFixLayoutPainter(XLayoutContainer container) { |
||||
super(container); |
||||
} |
||||
|
||||
/** |
||||
* 组件渲染 |
||||
* |
||||
* @param g 画图类 |
||||
* @param startX 开始位置x |
||||
* @param startY 开始位置y |
||||
*/ |
||||
@Override |
||||
public void paint(Graphics g, int startX, int startY) { |
||||
super.paint(g, startX, startY); |
||||
int x = hotspot.x - hotspot_bounds.x; |
||||
int y = hotspot.y - hotspot_bounds.y; |
||||
Component currentComp = container.getComponentAt(x, y); |
||||
if (currentComp == null) { |
||||
return; |
||||
} |
||||
boolean accept = currentComp != container; |
||||
if (accept) { |
||||
OperateState state = OperateState.DEFAULT; |
||||
if (currentComp == creator) { |
||||
state = OperateState.COMPONENT_DRAG_OUT; |
||||
} else if (!((XCreator) currentComp).acceptType(XOccupiedLayout.class)) { |
||||
state = OperateState.COMPONENT_REPLACE; |
||||
} |
||||
state.paint(g, creator.getBackupRectangle(), currentComp.getBounds(), new Rectangle(x, y, creator.initEditorSize().width, ((XCreator) currentComp).initEditorSize().height)); |
||||
} else { |
||||
Color bColor = XCreatorConstants.LAYOUT_FORBIDDEN_COLOR; |
||||
int[] hot_rec = new int[]{x, y, 0, 0}; |
||||
drawHotspot(g, x, y, hot_rec[2], hot_rec[3], bColor, false, false); |
||||
} |
||||
|
||||
} |
||||
|
||||
|
||||
enum OperateState { |
||||
COMPONENT_REPLACE { |
||||
@Override |
||||
void paint(Graphics g, Rectangle oriRectangle, Rectangle currentRectangle, Rectangle hotspot_bounds) { |
||||
Graphics2D g2d = (Graphics2D) g; |
||||
Color color = g2d.getColor(); |
||||
Stroke backup = g2d.getStroke(); |
||||
Composite backupComp = g2d.getComposite(); |
||||
|
||||
g2d.setColor(XCreatorConstants.REPLACE_OCCUPIED_LAYOUT_COLOR); |
||||
g2d.setStroke(XCreatorConstants.DASH_STROKE); |
||||
//绘制当前组件的边框
|
||||
g2d.drawRect(currentRectangle.x, currentRectangle.y, currentRectangle.width, currentRectangle.height); |
||||
//底色透明度0.2
|
||||
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.2f)); |
||||
//绘制进行替换的时候,被替换的组件的底色
|
||||
g2d.fillRect(currentRectangle.x, currentRectangle.y, currentRectangle.width, currentRectangle.height); |
||||
|
||||
//绘制原组件位置处的占位块
|
||||
if (oriRectangle != null) { |
||||
g2d.setColor(XCreatorConstants.DRAG_OUT_OCCUPIED_LAYOUT_COLOR); |
||||
//如果是从其他占位块上拖过来的,绘制下其他占位块的状态
|
||||
g2d.drawRect(oriRectangle.x + 1, oriRectangle.y + 1, oriRectangle.width - 2, oriRectangle.height - 2); |
||||
//底色透明度0.2
|
||||
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.2f)); |
||||
//绘制进行替换的时候,被替换的组件的底色
|
||||
g2d.fillRect(oriRectangle.x, oriRectangle.y, oriRectangle.width, oriRectangle.height); |
||||
} |
||||
//还原
|
||||
g2d.setComposite(backupComp); |
||||
g2d.setStroke(backup); |
||||
g2d.setColor(color); |
||||
} |
||||
}, |
||||
COMPONENT_DRAG_OUT { |
||||
@Override |
||||
void paint(Graphics g, Rectangle oriRectangle, Rectangle currentRectangle, Rectangle hotspot_bounds) { |
||||
Graphics2D g2d = (Graphics2D) g; |
||||
Color color = g2d.getColor(); |
||||
Stroke backup = g2d.getStroke(); |
||||
Composite backupComp = g2d.getComposite(); |
||||
// 设置线条的样式
|
||||
g2d.setStroke(XCreatorConstants.DASH_STROKE); |
||||
g2d.setColor(XCreatorConstants.DRAG_OUT_OCCUPIED_LAYOUT_COLOR); |
||||
//如果是从其他占位块上拖过来的,绘制下其他占位块的状态
|
||||
g2d.drawRect(oriRectangle.x, oriRectangle.y, oriRectangle.width, oriRectangle.height); |
||||
//底色透明度0.2
|
||||
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.2f)); |
||||
//绘制进行替换的时候,被替换的组件的底色
|
||||
g2d.fillRect(oriRectangle.x, oriRectangle.y, oriRectangle.width, oriRectangle.height); |
||||
|
||||
g2d.setComposite(backupComp); |
||||
g2d.setStroke(backup); |
||||
g2d.setColor(color); |
||||
} |
||||
}, |
||||
DEFAULT { |
||||
@Override |
||||
void paint(Graphics g, Rectangle oriRectangle, Rectangle currentRectangle, Rectangle hotspot_bounds) { |
||||
|
||||
} |
||||
}; |
||||
|
||||
abstract void paint(Graphics g, Rectangle oriRectangle, Rectangle currentRectangle, Rectangle hotspot_bounds); |
||||
} |
||||
|
||||
|
||||
} |
@ -0,0 +1,56 @@
|
||||
package com.fr.design.designer.beans.painters; |
||||
|
||||
import com.fr.design.designer.beans.adapters.layout.FROccupiedLayoutAdapter; |
||||
import com.fr.design.designer.creator.XLayoutContainer; |
||||
import com.fr.design.form.util.XCreatorConstants; |
||||
|
||||
import java.awt.AlphaComposite; |
||||
import java.awt.Color; |
||||
import java.awt.Component; |
||||
import java.awt.Composite; |
||||
import java.awt.Graphics; |
||||
import java.awt.Graphics2D; |
||||
import java.awt.Stroke; |
||||
|
||||
public class FROccupiedLayoutPainter extends AbstractPainter { |
||||
|
||||
/** |
||||
* 构造函数 |
||||
* |
||||
* @param container 容器 |
||||
*/ |
||||
public FROccupiedLayoutPainter(XLayoutContainer container) { |
||||
super(container); |
||||
} |
||||
|
||||
@Override |
||||
public void paint(Graphics g, int startX, int startY) { |
||||
int x = hotspot.x - hotspot_bounds.x; |
||||
int y = hotspot.y - hotspot_bounds.y; |
||||
FROccupiedLayoutAdapter adapter = (FROccupiedLayoutAdapter) container.getLayoutAdapter(); |
||||
Component currentComp = container.getComponentAt(x, y); |
||||
if (currentComp == null) { |
||||
return; |
||||
} |
||||
boolean accept = adapter.accept(creator, x, y); |
||||
if (accept) { |
||||
Color backupColor = g.getColor(); |
||||
Graphics2D g2d = (Graphics2D) g; |
||||
Stroke backupStroke = g2d.getStroke(); |
||||
Composite backupComposite = g2d.getComposite(); |
||||
g2d.setColor(XCreatorConstants.DRAG_IN_OCCUPIED_LAYOUT_COLOR); |
||||
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.05f)); |
||||
g2d.fillRect(container.getX(), container.getY(), container.getWidth(), container.getHeight()); |
||||
|
||||
g2d.setStroke(XCreatorConstants.DASH_STROKE); |
||||
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.2f)); |
||||
g2d.drawRect(container.getX() + 1, container.getY() + 1, container.getWidth() - 2, container.getHeight() - 2); |
||||
g2d.setStroke(backupStroke); |
||||
g2d.setComposite(backupComposite); |
||||
g2d.setColor(backupColor); |
||||
} |
||||
|
||||
} |
||||
|
||||
|
||||
} |
@ -0,0 +1,81 @@
|
||||
package com.fr.design.designer.creator; |
||||
|
||||
import com.fr.design.designer.beans.LayoutAdapter; |
||||
import com.fr.design.designer.beans.adapters.layout.FROccupiedLayoutAdapter; |
||||
import com.fr.design.designer.creator.operate.DefaultXCreatorBaseOperate; |
||||
import com.fr.design.designer.creator.operate.XCreatorBaseOperate; |
||||
import com.fr.design.form.layout.FRFitLayout; |
||||
import com.fr.design.form.util.XCreatorConstants; |
||||
import com.fr.form.ui.container.OccupiedLayout; |
||||
import java.awt.Color; |
||||
import java.awt.Dimension; |
||||
import java.awt.Graphics; |
||||
import java.awt.Graphics2D; |
||||
import java.awt.Stroke; |
||||
|
||||
public class XOccupiedLayout extends XLayoutContainer { |
||||
|
||||
public XOccupiedLayout() { |
||||
this(new OccupiedLayout(), new Dimension()); |
||||
} |
||||
|
||||
|
||||
public XOccupiedLayout(OccupiedLayout widget, Dimension initSize) { |
||||
super(widget, initSize); |
||||
initLayoutManager(); |
||||
} |
||||
|
||||
public String createDefaultName() { |
||||
return "box"; |
||||
} |
||||
|
||||
@Override |
||||
protected void initLayoutManager() { |
||||
this.setLayout(new FRFitLayout()); |
||||
} |
||||
|
||||
@Override |
||||
public LayoutAdapter getLayoutAdapter() { |
||||
return new FROccupiedLayoutAdapter(this); |
||||
} |
||||
|
||||
|
||||
public String getIconPath() { |
||||
return "/com/fr/design/form/images/occupied_layout.png"; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public boolean isComponentTreeLeaf() { |
||||
//在控件树上表现为叶子节点(组件放置到占位块中的时候,会删除占位块,只展示组件)
|
||||
return true; |
||||
} |
||||
|
||||
public XCreatorBaseOperate getXCreatorBaseOperate() { |
||||
return new DefaultXCreatorBaseOperate() { |
||||
@Override |
||||
public boolean supportSelected() { |
||||
return false; |
||||
} |
||||
}; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public void paint(Graphics g) { |
||||
drawOccupiedComponentBounds(g); |
||||
} |
||||
|
||||
private void drawOccupiedComponentBounds(Graphics g) { |
||||
Graphics2D g2d = (Graphics2D) g; |
||||
Color color = g2d.getColor(); |
||||
Stroke backup = g2d.getStroke(); |
||||
// 设置线条的样式
|
||||
g2d.setStroke(XCreatorConstants.DASH_STROKE); |
||||
g2d.setColor(XCreatorConstants.EMPTY_OCCUPIED_LAYOUT_COLOR); |
||||
g2d.drawRect(1, 1, this.getWidth() - 2, this.getHeight() - 2); |
||||
g2d.setStroke(backup); |
||||
g2d.setColor(color); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,29 @@
|
||||
package com.fr.design.designer.creator.operate; |
||||
|
||||
|
||||
public class DefaultXCreatorBaseOperate implements XCreatorBaseOperate { |
||||
@Override |
||||
public boolean supportSelected() { |
||||
return true; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportCopyAction() { |
||||
return true; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportCutAction() { |
||||
return true; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportPasteAction() { |
||||
return true; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportDeleteAction() { |
||||
return true; |
||||
} |
||||
} |
@ -0,0 +1,15 @@
|
||||
package com.fr.design.designer.creator.operate; |
||||
|
||||
import com.fr.design.designer.beans.adapters.layout.DesignerBaseOperate; |
||||
|
||||
public interface XCreatorBaseOperate extends DesignerBaseOperate { |
||||
|
||||
/** |
||||
* 是否支持选中 |
||||
* |
||||
* @return boolean |
||||
*/ |
||||
boolean supportSelected(); |
||||
|
||||
|
||||
} |
@ -0,0 +1,29 @@
|
||||
package com.fr.design.designer.treeview; |
||||
|
||||
import com.fr.base.BaseUtils; |
||||
import com.fr.design.designer.creator.XCreator; |
||||
import com.fr.design.mainframe.share.util.ShareComponentUtils; |
||||
|
||||
import javax.swing.Icon; |
||||
import java.awt.Component; |
||||
import java.awt.Graphics; |
||||
|
||||
public class DefaultXCreatorTreeCellRender implements XCreatorTreeCellRender { |
||||
private static final Icon SHARE_ICON = BaseUtils.readIcon("/com/fr/design/images/toast/reuse_icon.png"); |
||||
private XCreator xCreator; |
||||
|
||||
public DefaultXCreatorTreeCellRender(XCreator creator) { |
||||
this.xCreator = creator; |
||||
} |
||||
|
||||
public XCreator getxCreator(){ |
||||
return xCreator; |
||||
} |
||||
|
||||
@Override |
||||
public void paint(Graphics g, Component c) { |
||||
if (ShareComponentUtils.isShareWidgetWithChild( xCreator)) { |
||||
SHARE_ICON.paintIcon(c, g, 10, 0); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,8 @@
|
||||
package com.fr.design.designer.treeview; |
||||
|
||||
import java.awt.Component; |
||||
import java.awt.Graphics; |
||||
|
||||
public interface XCreatorTreeCellRender { |
||||
void paint(Graphics g, Component c); |
||||
} |
@ -1,114 +0,0 @@
|
||||
package com.fr.design.fit.attrpane; |
||||
|
||||
import com.fr.base.theme.FormTheme; |
||||
import com.fr.base.theme.TemplateTheme; |
||||
import com.fr.base.theme.settings.ThemedComponentStyle; |
||||
import com.fr.design.designer.IntervalConstants; |
||||
import com.fr.design.designer.creator.CRPropertyDescriptor; |
||||
import com.fr.design.designer.creator.PropertyGroupPane; |
||||
import com.fr.design.designer.creator.XCreator; |
||||
import com.fr.design.designer.creator.XElementCase; |
||||
import com.fr.design.gui.ilable.UILabel; |
||||
import com.fr.design.gui.style.FollowingThemePane; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.design.layout.TableLayoutHelper; |
||||
import com.fr.design.mainframe.widget.accessibles.AccessibleElementCaseToolBarEditor; |
||||
import com.fr.design.widget.ui.designer.component.PaddingBoundPane; |
||||
import com.fr.design.widget.ui.designer.layout.WTitleLayoutDefinePane; |
||||
import com.fr.form.main.Form; |
||||
import com.fr.form.ui.ElementCaseEditor; |
||||
import com.fr.form.ui.PaddingMargin; |
||||
import com.fr.form.web.FormToolBarManager; |
||||
import com.fr.general.ComparatorUtils; |
||||
import com.fr.report.fit.ReportFitAttr; |
||||
|
||||
import javax.swing.BorderFactory; |
||||
import javax.swing.JPanel; |
||||
import java.awt.BorderLayout; |
||||
import java.awt.Component; |
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
|
||||
/** |
||||
* Created by kerry on 2020-04-09 |
||||
*/ |
||||
public class ElementEditorExtendDefinePane extends WTitleLayoutDefinePane<ElementCaseEditor> { |
||||
private final PaddingBoundPane paddingBoundPane; |
||||
private AccessibleElementCaseToolBarEditor elementCaseToolBarEditor; |
||||
private PropertyGroupPane extraPropertyGroupPane; |
||||
private PcFitExpandablePane pcFitExpandablePane; |
||||
|
||||
private static final String FIT_STATE_PC = "fitStateInPC"; |
||||
|
||||
public ElementEditorExtendDefinePane(XCreator xCreator) { |
||||
super(xCreator); |
||||
paddingBoundPane = new PaddingBoundPane(); |
||||
themePane.addFollowThemePane(paddingBoundPane, new FollowingThemePane.FollowingThemeActionChangeListener() { |
||||
@Override |
||||
public void onFollowingTheme(boolean following) { |
||||
paddingBoundPane.setVisible(!following); |
||||
|
||||
if (following) { |
||||
TemplateTheme theme = themePane.getUsingTheme(); |
||||
if (theme instanceof FormTheme) { |
||||
ThemedComponentStyle style = ((FormTheme) theme).getComponentStyle(); |
||||
int top = style.getPaddingTop(); |
||||
int bottom = style.getPaddingBottom(); |
||||
int left = style.getPaddingLeft(); |
||||
int right = style.getPaddingRight(); |
||||
paddingBoundPane.populateBean(new PaddingMargin(top, left, bottom, right)); |
||||
} |
||||
} |
||||
} |
||||
}); |
||||
} |
||||
|
||||
protected JPanel createCenterPane() { |
||||
JPanel centerPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||
elementCaseToolBarEditor = new AccessibleElementCaseToolBarEditor(); |
||||
Component[][] components = new Component[][]{ |
||||
new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_EC_Toolbar")), elementCaseToolBarEditor}, |
||||
}; |
||||
JPanel panel = TableLayoutHelper.createGapTableLayoutPane(components, TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_W0, IntervalConstants.INTERVAL_L1); |
||||
panel.setBorder(BorderFactory.createEmptyBorder(5, 0, 10, 0)); |
||||
CRPropertyDescriptor[] extraTableEditor = removeOldFitEditor(((XElementCase) creator).getExtraTableEditor()); |
||||
extraPropertyGroupPane = new PropertyGroupPane(extraTableEditor, creator); |
||||
centerPane.add(panel, BorderLayout.NORTH); |
||||
if (extraTableEditor.length > 0) { |
||||
centerPane.add(extraPropertyGroupPane, BorderLayout.CENTER); |
||||
} |
||||
pcFitExpandablePane = new PcFitExpandablePane(this); |
||||
centerPane.add(pcFitExpandablePane, BorderLayout.SOUTH); |
||||
return centerPane; |
||||
} |
||||
|
||||
private CRPropertyDescriptor[] removeOldFitEditor(CRPropertyDescriptor[] extraTableEditor) { |
||||
List<CRPropertyDescriptor> list = new ArrayList<CRPropertyDescriptor>(); |
||||
for (CRPropertyDescriptor crPropertyDescriptor : extraTableEditor) { |
||||
if (!ComparatorUtils.equals(FIT_STATE_PC, crPropertyDescriptor.getName())) { |
||||
list.add(crPropertyDescriptor); |
||||
} |
||||
} |
||||
return list.toArray(new CRPropertyDescriptor[list.size()]); |
||||
} |
||||
|
||||
protected ElementCaseEditor updateSubBean() { |
||||
ElementCaseEditor elementCaseEditor = (ElementCaseEditor) creator.toData(); |
||||
if (themePane.isFollowingTheme() || ComparatorUtils.equals(getGlobalName(), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Layout_Padding_Duplicate"))) { |
||||
paddingBoundPane.update(elementCaseEditor); |
||||
} |
||||
elementCaseEditor.setToolBars((FormToolBarManager[]) elementCaseToolBarEditor.getValue()); |
||||
ReportFitAttr fitAttr = pcFitExpandablePane.update(); |
||||
elementCaseEditor.setReportFitAttr(fitAttr); |
||||
return elementCaseEditor; |
||||
} |
||||
|
||||
|
||||
protected void populateSubBean(ElementCaseEditor ob) { |
||||
paddingBoundPane.populate(ob); |
||||
elementCaseToolBarEditor.setValue(ob.getToolBars()); |
||||
extraPropertyGroupPane.populate(ob); |
||||
pcFitExpandablePane.populate(ob.getReportFitAttr()); |
||||
|
||||
} |
||||
} |
@ -1,200 +0,0 @@
|
||||
package com.fr.design.fit.attrpane; |
||||
|
||||
import com.fr.base.io.IOFile; |
||||
import com.fr.base.iofile.attr.WatermarkAttr; |
||||
import com.fr.base.theme.FormTheme; |
||||
import com.fr.base.theme.TemplateTheme; |
||||
import com.fr.design.data.DataCreatorUI; |
||||
import com.fr.design.designer.IntervalConstants; |
||||
import com.fr.design.designer.creator.XCreator; |
||||
import com.fr.design.designer.creator.XWFitLayout; |
||||
import com.fr.design.designer.properties.items.FRLayoutTypeItems; |
||||
import com.fr.design.designer.properties.items.Item; |
||||
import com.fr.design.foldablepane.UIExpandablePane; |
||||
import com.fr.design.gui.icombobox.UIComboBox; |
||||
import com.fr.design.gui.ilable.UILabel; |
||||
import com.fr.design.gui.style.FollowingThemePane; |
||||
import com.fr.design.gui.xpane.LayoutStylePane; |
||||
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.WidgetPropertyPane; |
||||
import com.fr.design.mainframe.widget.accessibles.AccessibleBodyWatermarkEditor; |
||||
import com.fr.design.utils.gui.UIComponentUtils; |
||||
import com.fr.design.widget.FRWidgetFactory; |
||||
import com.fr.design.widget.ui.designer.component.WidgetBoundPane; |
||||
import com.fr.design.widget.ui.designer.layout.FRAbsoluteLayoutDefinePane; |
||||
import com.fr.form.ui.LayoutBorderStyle; |
||||
import com.fr.form.ui.container.WAbsoluteBodyLayout; |
||||
import com.fr.form.ui.container.WAbsoluteLayout; |
||||
import com.fr.form.ui.container.WBodyLayoutType; |
||||
import com.fr.general.act.BorderPacker; |
||||
import com.fr.report.core.ReportUtils; |
||||
|
||||
import javax.swing.BorderFactory; |
||||
import javax.swing.DefaultComboBoxModel; |
||||
import javax.swing.JPanel; |
||||
import java.awt.BorderLayout; |
||||
import java.awt.Component; |
||||
|
||||
/** |
||||
* Created by kerry on 2020-04-22 |
||||
*/ |
||||
public class FRAbsoluteBodyLayoutExtendDefinePane extends FRAbsoluteLayoutDefinePane { |
||||
private static final int MAX_LABEL_WIDTH = 80; |
||||
|
||||
protected FollowingThemePane themePane; |
||||
private LayoutStylePane stylePane; |
||||
private AccessibleBodyWatermarkEditor watermarkEditor; |
||||
|
||||
private UIComboBox layoutCombox; |
||||
private WBodyLayoutType layoutType = WBodyLayoutType.ABSOLUTE; |
||||
|
||||
public FRAbsoluteBodyLayoutExtendDefinePane(XCreator xCreator) { |
||||
super(xCreator); |
||||
} |
||||
|
||||
|
||||
public void initComponent() { |
||||
initUIComboBox(); |
||||
this.setLayout(FRGUIPaneFactory.createBorderLayout()); |
||||
|
||||
JPanel panel1 = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||
this.add(panel1, BorderLayout.CENTER); |
||||
|
||||
UIExpandablePane scalePane = new UIExpandablePane( |
||||
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Widget_Area_Scaling"), |
||||
280, 20, |
||||
createAreaScalePane() |
||||
); |
||||
panel1.add(scalePane, BorderLayout.NORTH); |
||||
|
||||
UIExpandablePane advancedPane = new UIExpandablePane( |
||||
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Advanced"), |
||||
280, 20, |
||||
this.createAdvancePane()); |
||||
panel1.add(advancedPane, BorderLayout.CENTER); |
||||
|
||||
} |
||||
|
||||
public JPanel createAdvancePane() { |
||||
JPanel advancedContentPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||
|
||||
themePane = new FollowingThemePane(Toolkit.i18nText("Fine-Design_Form_Body_Style_Setting")); |
||||
stylePane = new LayoutStylePane(); |
||||
themePane.addFollowThemePane(stylePane, new FollowingThemePane.FollowingThemeActionChangeListener() { |
||||
@Override |
||||
public void onFollowingTheme(boolean following) { |
||||
stylePane.supportBodyStyle(!following); |
||||
|
||||
BorderPacker style = stylePane.updateBean(); |
||||
if (following) { |
||||
TemplateTheme theme = themePane.getUsingTheme(); |
||||
if (theme instanceof FormTheme) { |
||||
style = ((FormTheme) theme).getBodyStyle().merge(style); |
||||
} |
||||
} |
||||
stylePane.populateBean((LayoutBorderStyle) style); |
||||
} |
||||
}); |
||||
advancedContentPane.add(themePane, BorderLayout.NORTH); |
||||
|
||||
watermarkEditor = new AccessibleBodyWatermarkEditor(); |
||||
JPanel watermarkPane = TableLayoutHelper.createGapTableLayoutPane( |
||||
new Component[][]{ |
||||
new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_WaterMark")), watermarkEditor} |
||||
}, TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_W3, IntervalConstants.INTERVAL_L1); |
||||
watermarkPane.setBorder(BorderFactory.createEmptyBorder(IntervalConstants.INTERVAL_L1, 0, IntervalConstants.INTERVAL_L1, 0)); |
||||
advancedContentPane.add(watermarkPane, BorderLayout.CENTER); |
||||
|
||||
return advancedContentPane; |
||||
} |
||||
|
||||
public JPanel createAreaScalePane() { |
||||
initLayoutComboBox(); |
||||
|
||||
UILabel layoutTypeLabel = FRWidgetFactory.createLineWrapLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Attr_Layout_Type")); |
||||
UILabel scaleModeLabel = FRWidgetFactory.createLineWrapLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Widget_Scaling_Mode")); |
||||
|
||||
JPanel contentPane = TableLayoutHelper.createGapTableLayoutPane( |
||||
new Component[][]{ |
||||
{layoutTypeLabel, layoutCombox}, |
||||
{scaleModeLabel, comboBox} |
||||
}, |
||||
TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_W1, IntervalConstants.INTERVAL_L1); |
||||
|
||||
contentPane.setBorder(BorderFactory.createEmptyBorder(IntervalConstants.INTERVAL_L1, 0, IntervalConstants.INTERVAL_L1, 0)); |
||||
|
||||
JPanel containerPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||
containerPane.add(contentPane, BorderLayout.CENTER); |
||||
containerPane.setBorder(BorderFactory.createEmptyBorder(10, 0, 10, 0)); |
||||
|
||||
return containerPane; |
||||
} |
||||
|
||||
public void initLayoutComboBox() { |
||||
Item[] items = FRLayoutTypeItems.ITEMS; |
||||
DefaultComboBoxModel model = new DefaultComboBoxModel(); |
||||
for (Item item : items) { |
||||
model.addElement(item); |
||||
} |
||||
layoutCombox = new UIComboBox(model); |
||||
layoutCombox.setSelectedIndex(1); |
||||
} |
||||
|
||||
@Override |
||||
public String title4PopupWindow() { |
||||
return "absoluteBodyLayout"; |
||||
} |
||||
|
||||
public void populateSubPane(WAbsoluteLayout ob) { |
||||
layoutCombox.setSelectedIndex(1); |
||||
themePane.supportFollowingTheme(ob.supportThemed()); |
||||
themePane.setFollowingTheme(ob.isBorderStyleFollowingTheme()); |
||||
stylePane.populateBean((LayoutBorderStyle) ob.getBorderStyle()); |
||||
watermarkEditor.setValue(ReportUtils.getWatermarkAttrFromTemplate(getCurrentIOFile())); |
||||
} |
||||
|
||||
public WAbsoluteBodyLayout updateSubPane() { |
||||
WAbsoluteBodyLayout layout = (WAbsoluteBodyLayout) creator.toData(); |
||||
Item item = (Item) layoutCombox.getSelectedItem(); |
||||
Object value = item.getValue(); |
||||
int state = 0; |
||||
if (value instanceof Integer) { |
||||
state = (Integer) value; |
||||
} |
||||
|
||||
if (layoutType == WBodyLayoutType.ABSOLUTE) { |
||||
((XWFitLayout) creator.getBackupParent()).toData().resetStyle(); |
||||
if (state == WBodyLayoutType.FIT.getTypeValue()) { |
||||
XWFitLayout xwFitLayout = ((XWFitLayout)creator.getBackupParent()); |
||||
xwFitLayout.switch2FitBodyLayout(creator); |
||||
copyLayoutAttr(layout, xwFitLayout.toData()); |
||||
} |
||||
} |
||||
layout.setBorderStyleFollowingTheme(themePane.isFollowingTheme()); |
||||
layout.setBorderStyle(stylePane.updateBean()); |
||||
updateWatermark(); |
||||
return layout; |
||||
} |
||||
|
||||
private void updateWatermark() { |
||||
WatermarkAttr watermark = (WatermarkAttr) watermarkEditor.getValue(); |
||||
if (watermark != null) { |
||||
IOFile ioFile = getCurrentIOFile(); |
||||
ioFile.addAttrMark(watermark); |
||||
} |
||||
} |
||||
|
||||
private IOFile getCurrentIOFile() { |
||||
return WidgetPropertyPane.getInstance().getEditingFormDesigner().getTarget(); |
||||
} |
||||
|
||||
@Override |
||||
public DataCreatorUI dataUI() { |
||||
return null; |
||||
} |
||||
|
||||
|
||||
} |
@ -1,27 +0,0 @@
|
||||
package com.fr.design.fit.attrpane; |
||||
|
||||
import com.fr.design.designer.creator.XCreator; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.design.widget.ui.designer.layout.AbstractFRLayoutDefinePane; |
||||
import com.fr.form.ui.container.WAbsoluteLayout; |
||||
|
||||
/** |
||||
* Created by kerry on 2020-04-22 |
||||
*/ |
||||
public class FRAbsoluteLayoutExtendDefinePane extends AbstractFRLayoutDefinePane<WAbsoluteLayout> { |
||||
|
||||
public FRAbsoluteLayoutExtendDefinePane(XCreator xCreator) { |
||||
super(xCreator); |
||||
this.setLayout(FRGUIPaneFactory.createBorderLayout()); |
||||
} |
||||
|
||||
@Override |
||||
public void populateBean(WAbsoluteLayout ob) { |
||||
} |
||||
|
||||
@Override |
||||
public WAbsoluteLayout updateBean() { |
||||
WAbsoluteLayout wAbsoluteLayout = (WAbsoluteLayout) creator.toData(); |
||||
return wAbsoluteLayout; |
||||
} |
||||
} |
@ -1,282 +0,0 @@
|
||||
package com.fr.design.fit.attrpane; |
||||
|
||||
|
||||
import com.fr.base.io.IOFile; |
||||
import com.fr.base.iofile.attr.WatermarkAttr; |
||||
import com.fr.base.theme.FormTheme; |
||||
import com.fr.base.theme.TemplateTheme; |
||||
import com.fr.design.data.DataCreatorUI; |
||||
import com.fr.design.designer.IntervalConstants; |
||||
import com.fr.design.designer.creator.XCreator; |
||||
import com.fr.design.designer.creator.XLayoutContainer; |
||||
import com.fr.design.designer.creator.XWAbsoluteBodyLayout; |
||||
import com.fr.design.designer.creator.XWFitLayout; |
||||
import com.fr.design.designer.creator.XWScaleLayout; |
||||
import com.fr.design.designer.properties.items.FRLayoutTypeItems; |
||||
import com.fr.design.designer.properties.items.Item; |
||||
import com.fr.design.foldablepane.UIExpandablePane; |
||||
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.gui.style.FollowingThemePane; |
||||
import com.fr.design.gui.xpane.LayoutStylePane; |
||||
import com.fr.design.i18n.Toolkit; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.design.layout.TableLayoutHelper; |
||||
import com.fr.design.mainframe.FormDesigner; |
||||
import com.fr.design.mainframe.FormSelectionUtils; |
||||
import com.fr.design.mainframe.WidgetPropertyPane; |
||||
import com.fr.design.mainframe.widget.accessibles.AccessibleBodyWatermarkEditor; |
||||
import com.fr.design.utils.gui.UIComponentUtils; |
||||
import com.fr.design.widget.FRWidgetFactory; |
||||
import com.fr.design.widget.ui.designer.component.PaddingBoundPane; |
||||
import com.fr.design.widget.ui.designer.layout.AbstractFRLayoutDefinePane; |
||||
import com.fr.form.ui.LayoutBorderStyle; |
||||
import com.fr.form.ui.Widget; |
||||
import com.fr.form.ui.container.WAbsoluteBodyLayout; |
||||
import com.fr.form.ui.container.WAbsoluteLayout; |
||||
import com.fr.form.ui.container.WBodyLayoutType; |
||||
import com.fr.form.ui.container.WFitLayout; |
||||
import com.fr.general.ComparatorUtils; |
||||
import com.fr.general.act.BorderPacker; |
||||
import com.fr.log.FineLoggerFactory; |
||||
import com.fr.report.core.ReportUtils; |
||||
|
||||
import javax.swing.BorderFactory; |
||||
import javax.swing.DefaultComboBoxModel; |
||||
import javax.swing.JPanel; |
||||
import java.awt.BorderLayout; |
||||
import java.awt.Component; |
||||
import java.awt.Dimension; |
||||
|
||||
/** |
||||
* Created by kerry on 2020-04-22 |
||||
*/ |
||||
public class FRFitLayoutExtendDefinePane extends AbstractFRLayoutDefinePane<WFitLayout> { |
||||
private static final int ADAPT_LABEL_MAX_WIDTH = 80; |
||||
private XWFitLayout xWFitLayout; |
||||
private WFitLayout wFitLayout; |
||||
private UIComboBox layoutComboBox; |
||||
private UISpinner componentIntervel; |
||||
private PaddingBoundPane paddingBound; |
||||
private FollowingThemePane themePane; |
||||
private LayoutStylePane stylePane; |
||||
private AccessibleBodyWatermarkEditor watermarkEditor; |
||||
|
||||
public FRFitLayoutExtendDefinePane(XCreator xCreator) { |
||||
super(xCreator); |
||||
this.xWFitLayout = (XWFitLayout) xCreator; |
||||
wFitLayout = xWFitLayout.toData(); |
||||
initComponent(); |
||||
} |
||||
|
||||
|
||||
public void initComponent() { |
||||
this.setLayout(FRGUIPaneFactory.createBorderLayout()); |
||||
UIExpandablePane layoutExpandablePane = new UIExpandablePane( |
||||
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Layout"), |
||||
280, 20, |
||||
createLayoutPane() |
||||
); |
||||
this.add(layoutExpandablePane, BorderLayout.NORTH); |
||||
|
||||
JPanel advancePane = createAdvancePane(); |
||||
UIExpandablePane advanceExpandablePane = new UIExpandablePane( |
||||
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Advanced"), |
||||
280, 20, |
||||
advancePane |
||||
); |
||||
this.add(advanceExpandablePane, BorderLayout.CENTER); |
||||
} |
||||
|
||||
public JPanel createAdvancePane() { |
||||
JPanel contentPane0 = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||
|
||||
themePane = new FollowingThemePane(Toolkit.i18nText("Fine-Design_Form_Body_Style_Setting")); |
||||
stylePane = new LayoutStylePane(); |
||||
themePane.addFollowThemePane(stylePane, new FollowingThemePane.FollowingThemeActionChangeListener() { |
||||
@Override |
||||
public void onFollowingTheme(boolean following) { |
||||
stylePane.supportBodyStyle(!following); |
||||
|
||||
BorderPacker style = stylePane.updateBean(); |
||||
if (following) { |
||||
TemplateTheme theme = themePane.getUsingTheme(); |
||||
if (theme instanceof FormTheme) { |
||||
style = ((FormTheme) theme).getBodyStyle().merge(style); |
||||
} |
||||
} |
||||
stylePane.populateBean((LayoutBorderStyle) style); |
||||
} |
||||
}); |
||||
contentPane0.add(themePane, BorderLayout.NORTH); |
||||
|
||||
JPanel contentPane1 = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||
contentPane0.add(contentPane1, BorderLayout.CENTER); |
||||
|
||||
watermarkEditor = new AccessibleBodyWatermarkEditor(); |
||||
JPanel waterMarkPane = TableLayoutHelper.createGapTableLayoutPane( |
||||
new Component[][]{ |
||||
new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_WaterMark")), watermarkEditor} |
||||
}, TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_W3, IntervalConstants.INTERVAL_L1); |
||||
waterMarkPane.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0)); |
||||
contentPane1.add(waterMarkPane, BorderLayout.NORTH); |
||||
|
||||
paddingBound = new PaddingBoundPane(); |
||||
contentPane1.add(paddingBound, BorderLayout.CENTER); |
||||
|
||||
return contentPane0; |
||||
} |
||||
|
||||
public JPanel createLayoutPane() { |
||||
JPanel containerPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||
|
||||
layoutComboBox = initUIComboBox(FRLayoutTypeItems.ITEMS); |
||||
componentIntervel = new UISpinner(0, Integer.MAX_VALUE, 1, 0); |
||||
JPanel componentIntervelPane = UIComponentUtils.wrapWithBorderLayoutPane(componentIntervel); |
||||
|
||||
UILabel intervalLabel = FRWidgetFactory.createLineWrapLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Component_Interval")); |
||||
|
||||
JPanel contentPane = TableLayoutHelper.createGapTableLayoutPane( |
||||
new Component[][]{ |
||||
{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Attr_Layout_Type")), layoutComboBox}, |
||||
{intervalLabel, componentIntervelPane} |
||||
}, |
||||
TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_W1, IntervalConstants.INTERVAL_L1); |
||||
contentPane.setBorder(BorderFactory.createEmptyBorder(10, 0, 10, 0)); |
||||
containerPane.add(contentPane, BorderLayout.CENTER); |
||||
|
||||
return containerPane; |
||||
} |
||||
|
||||
|
||||
public UIComboBox initUIComboBox(Item[] items) { |
||||
DefaultComboBoxModel model = new DefaultComboBoxModel(); |
||||
for (Item item : items) { |
||||
model.addElement(item); |
||||
} |
||||
return new UIComboBox(model); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public String title4PopupWindow() { |
||||
return "fitLayout"; |
||||
} |
||||
|
||||
@Override |
||||
public void populateBean(WFitLayout ob) { |
||||
FormDesigner formDesigner = WidgetPropertyPane.getInstance().getEditingFormDesigner(); |
||||
XLayoutContainer rootLayout = selectedBodyLayout(formDesigner); |
||||
if (rootLayout != formDesigner.getRootComponent() |
||||
&& formDesigner.getSelectionModel().getSelection().getSelectedCreator() == formDesigner.getRootComponent()) { |
||||
formDesigner.getSelectionModel().setSelectedCreators( |
||||
FormSelectionUtils.rebuildSelection(xWFitLayout, new Widget[]{selectedBodyLayout(formDesigner).toData()})); |
||||
|
||||
} |
||||
paddingBound.populate(ob); |
||||
layoutComboBox.setSelectedIndex(ob.getBodyLayoutType().getTypeValue()); |
||||
componentIntervel.setValue(ob.getCompInterval()); |
||||
themePane.supportFollowingTheme(ob.supportThemed()); |
||||
themePane.setFollowingTheme(ob.isBorderStyleFollowingTheme()); |
||||
stylePane.populateBean((LayoutBorderStyle) ob.getBorderStyle()); |
||||
watermarkEditor.setValue(ReportUtils.getWatermarkAttrFromTemplate(getCurrentIOFile())); |
||||
} |
||||
|
||||
private XLayoutContainer selectedBodyLayout(FormDesigner formDesigner) { |
||||
XLayoutContainer rootLayout = formDesigner.getRootComponent(); |
||||
if (rootLayout.getComponentCount() == 1 && rootLayout.getXCreator(0).acceptType(XWAbsoluteBodyLayout.class)) { |
||||
rootLayout = (XWAbsoluteBodyLayout) rootLayout.getXCreator(0); |
||||
} |
||||
return rootLayout; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public WFitLayout updateBean() { |
||||
WFitLayout layout = (WFitLayout) creator.toData(); |
||||
if (ComparatorUtils.equals(getGlobalName(), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Layout_Padding_Duplicate"))) { |
||||
paddingBound.update(layout); |
||||
} |
||||
layout.setBorderStyleFollowingTheme(themePane.isFollowingTheme()); |
||||
LayoutBorderStyle borderStyle = stylePane.updateBean(); |
||||
if (borderStyle != null) { |
||||
layout.setBorderStyle(borderStyle); |
||||
} |
||||
updateWatermark(); |
||||
Item item = (Item) layoutComboBox.getSelectedItem(); |
||||
Object value = item.getValue(); |
||||
int state = 0; |
||||
if (value instanceof Integer) { |
||||
state = (Integer) value; |
||||
} |
||||
//todo 验证下
|
||||
layout.setLayoutType(WBodyLayoutType.parse(state)); |
||||
try { |
||||
if (state == WBodyLayoutType.ABSOLUTE.getTypeValue()) { |
||||
WAbsoluteBodyLayout wAbsoluteBodyLayout = new WAbsoluteBodyLayout("body"); |
||||
wAbsoluteBodyLayout.setCompState(WAbsoluteLayout.STATE_FIXED); |
||||
Component[] components = xWFitLayout.getComponents(); |
||||
xWFitLayout.removeAll(); |
||||
layout.resetStyle(); |
||||
XWAbsoluteBodyLayout xwAbsoluteBodyLayout = xWFitLayout.getBackupParent() == null ? new XWAbsoluteBodyLayout(wAbsoluteBodyLayout, new Dimension(0, 0)) : (XWAbsoluteBodyLayout) xWFitLayout.getBackupParent(); |
||||
xWFitLayout.getLayoutAdapter().addBean(xwAbsoluteBodyLayout, 0, 0); |
||||
for (Component component : components) { |
||||
XCreator xCreator = (XCreator) component; |
||||
//部分控件被ScaleLayout包裹着,绝对布局里面要放出来
|
||||
if (xCreator.acceptType(XWScaleLayout.class)) { |
||||
if (xCreator.getComponentCount() > 0 && ((XCreator) xCreator.getComponent(0)).shouldScaleCreator()) { |
||||
component = xCreator.getComponent(0); |
||||
component.setBounds(xCreator.getBounds()); |
||||
} |
||||
} |
||||
xwAbsoluteBodyLayout.add(component); |
||||
} |
||||
copyLayoutAttr(wFitLayout, wAbsoluteBodyLayout); |
||||
xWFitLayout.setBackupParent(xwAbsoluteBodyLayout); |
||||
FormDesigner formDesigner = WidgetPropertyPane.getInstance().getEditingFormDesigner(); |
||||
formDesigner.getSelectionModel().setSelectedCreators( |
||||
FormSelectionUtils.rebuildSelection(xWFitLayout, new Widget[]{wAbsoluteBodyLayout})); |
||||
} |
||||
} catch (Exception e) { |
||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||
|
||||
} |
||||
|
||||
int intervelValue = (int) componentIntervel.getValue(); |
||||
if (xWFitLayout.canAddInterval(intervelValue)) { |
||||
// 设置完间隔后,要同步处理界面组件,容器刷新后显示出对应效果
|
||||
setLayoutGap(intervelValue); |
||||
} |
||||
|
||||
return layout; |
||||
} |
||||
|
||||
private void updateWatermark() { |
||||
WatermarkAttr watermark = (WatermarkAttr) watermarkEditor.getValue(); |
||||
if (watermark != null) { |
||||
IOFile ioFile = getCurrentIOFile(); |
||||
ioFile.addAttrMark(watermark); |
||||
} |
||||
} |
||||
|
||||
private IOFile getCurrentIOFile() { |
||||
return WidgetPropertyPane.getInstance().getEditingFormDesigner().getTarget(); |
||||
} |
||||
|
||||
private void setLayoutGap(int value) { |
||||
int interval = wFitLayout.getCompInterval(); |
||||
if (value != interval) { |
||||
xWFitLayout.moveContainerMargin(); |
||||
xWFitLayout.moveCompInterval(xWFitLayout.getAcualInterval()); |
||||
wFitLayout.setCompInterval(value); |
||||
xWFitLayout.addCompInterval(xWFitLayout.getAcualInterval()); |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public DataCreatorUI dataUI() { |
||||
return null; |
||||
} |
||||
|
||||
} |
@ -1,303 +0,0 @@
|
||||
package com.fr.design.fit.attrpane; |
||||
|
||||
import com.fr.base.BaseUtils; |
||||
import com.fr.design.ExtraDesignClassManager; |
||||
import com.fr.design.data.DataCreatorUI; |
||||
import com.fr.design.designer.IntervalConstants; |
||||
import com.fr.design.designer.creator.CRPropertyDescriptor; |
||||
import com.fr.design.designer.creator.PropertyGroupPane; |
||||
import com.fr.design.designer.creator.XCreator; |
||||
import com.fr.design.designer.creator.XWParameterLayout; |
||||
import com.fr.design.designer.properties.PropertyTab; |
||||
import com.fr.design.file.HistoryTemplateListPane; |
||||
import com.fr.design.fit.DesignerUIModeConfig; |
||||
import com.fr.design.fit.common.TemplateTool; |
||||
import com.fr.design.foldablepane.UIExpandablePane; |
||||
import com.fr.design.fun.ParameterExpandablePaneUIProvider; |
||||
import com.fr.design.gui.ibutton.UIButtonGroup; |
||||
import com.fr.design.gui.icheckbox.UICheckBox; |
||||
import com.fr.design.gui.ilable.UILabel; |
||||
import com.fr.design.gui.ispinner.UISpinner; |
||||
import com.fr.design.gui.itextfield.UITextField; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.design.layout.TableLayout; |
||||
import com.fr.design.layout.TableLayoutHelper; |
||||
import com.fr.design.mainframe.FormDesigner; |
||||
import com.fr.design.mainframe.FormSelection; |
||||
import com.fr.design.mainframe.JTemplate; |
||||
import com.fr.design.mainframe.widget.accessibles.AccessibleBackgroundEditor; |
||||
import com.fr.design.utils.gui.LayoutUtils; |
||||
import com.fr.design.utils.gui.UIComponentUtils; |
||||
import com.fr.design.widget.ui.designer.AbstractDataModify; |
||||
import com.fr.design.widget.ui.designer.component.UIBoundSpinner; |
||||
import com.fr.form.ui.container.WParameterLayout; |
||||
import com.fr.general.Background; |
||||
import com.fr.report.stable.FormConstants; |
||||
|
||||
import javax.swing.BorderFactory; |
||||
import javax.swing.Icon; |
||||
import javax.swing.JPanel; |
||||
import java.awt.BorderLayout; |
||||
import java.awt.Component; |
||||
import java.awt.Rectangle; |
||||
import java.util.Set; |
||||
|
||||
public class RootDesignExtendDefinePane extends AbstractDataModify<WParameterLayout> { |
||||
private XWParameterLayout root; |
||||
private UISpinner designerWidth; |
||||
private UISpinner paraHeight; |
||||
private UICheckBox displayReport; |
||||
private UICheckBox useParamsTemplate; |
||||
private AccessibleBackgroundEditor background; |
||||
private UIButtonGroup hAlignmentPane; |
||||
private UITextField labelNameTextField; |
||||
//是否是新设计模式下决策报表
|
||||
private boolean newForm; |
||||
private PropertyGroupPane extraPropertyGroupPane; |
||||
|
||||
public RootDesignExtendDefinePane(XCreator xCreator) { |
||||
super(xCreator); |
||||
newForm = TemplateTool.getCurrentEditingNewJForm() != null && DesignerUIModeConfig.getInstance().newUIMode(); |
||||
this.root = (XWParameterLayout) xCreator; |
||||
initComponent(); |
||||
} |
||||
|
||||
|
||||
public void initComponent() { |
||||
this.setLayout(FRGUIPaneFactory.createBorderLayout()); |
||||
if (newForm) { |
||||
paraHeight = new UIBoundSpinner(0, Integer.MAX_VALUE, 1, 0); |
||||
} else { |
||||
designerWidth = new UIBoundSpinner(1, Integer.MAX_VALUE, 1); |
||||
} |
||||
JPanel advancePane = createAdvancePane(); |
||||
UIExpandablePane advanceExpandablePane = new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Advanced"), 280, 20, advancePane); |
||||
this.add(advanceExpandablePane, BorderLayout.NORTH); |
||||
JPanel layoutPane = createBoundsPane(); |
||||
UIExpandablePane layoutExpandablePane = new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Size"), 280, 20, layoutPane); |
||||
this.add(layoutExpandablePane, BorderLayout.CENTER); |
||||
this.addExtraUIExpandablePaneFromPlugin(); |
||||
} |
||||
|
||||
private void addExtraUIExpandablePaneFromPlugin() { |
||||
Set<ParameterExpandablePaneUIProvider> pluginCreators = ExtraDesignClassManager.getInstance().getArray(ParameterExpandablePaneUIProvider.XML_TAG); |
||||
JPanel panel = FRGUIPaneFactory.createYBoxEmptyBorderPane(); |
||||
for (ParameterExpandablePaneUIProvider provider : pluginCreators) { |
||||
UIExpandablePane uiExpandablePane = provider.createUIExpandablePane(); |
||||
PropertyTab propertyTab = provider.addToWhichPropertyTab(); |
||||
if (uiExpandablePane != null && propertyTab == PropertyTab.ATTR) { |
||||
panel.add(uiExpandablePane); |
||||
} |
||||
} |
||||
this.add(panel, BorderLayout.SOUTH); |
||||
} |
||||
|
||||
public JPanel createBoundsPane() { |
||||
double f = TableLayout.FILL; |
||||
double p = TableLayout.PREFERRED; |
||||
double[] rowSize = {p}; |
||||
double[] columnSize = {p, f}; |
||||
int[][] rowCount = {{1, 1}}; |
||||
Component[] component = newForm ? new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Designer_Fit_Design_Height")), paraHeight} : |
||||
new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Desin_Width")), designerWidth}; |
||||
Component[][] components = new Component[][]{component}; |
||||
JPanel panel = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, IntervalConstants.INTERVAL_W1, IntervalConstants.INTERVAL_L1); |
||||
JPanel jPanel = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||
panel.setBorder(BorderFactory.createEmptyBorder(10, 0, 10, 0)); |
||||
jPanel.add(panel); |
||||
return jPanel; |
||||
} |
||||
|
||||
public JPanel createAdvancePane() { |
||||
if (newForm) { |
||||
return getNewFormAdvancePane(); |
||||
} else { |
||||
return getTemplateAdvancePane(); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* @Description: 获取的非新决策报表AdvancePane |
||||
* @param |
||||
* @return: |
||||
* @Author: Henry.Wang |
||||
* @date: 2020/11/05 15:36 |
||||
*/ |
||||
private JPanel getTemplateAdvancePane() { |
||||
JPanel jPanel = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||
labelNameTextField = new UITextField(); |
||||
displayReport = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Display_Nothing_Before_Query")); |
||||
UIComponentUtils.setLineWrap(displayReport); |
||||
useParamsTemplate = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Use_Params_Template")); |
||||
background = new AccessibleBackgroundEditor(); |
||||
Icon[] hAlignmentIconArray = {BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_left_normal.png"), |
||||
BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_center_normal.png"), |
||||
BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_right_normal.png"),}; |
||||
Integer[] hAlignment = new Integer[]{FormConstants.LEFTPOSITION, FormConstants.CENTERPOSITION, FormConstants.RIGHTPOSITION}; |
||||
hAlignmentPane = new UIButtonGroup<Integer>(hAlignmentIconArray, hAlignment); |
||||
hAlignmentPane.setAllToolTips(new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_StyleAlignment_Left") |
||||
, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_StyleAlignment_Center"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_StyleAlignment_Right")}); |
||||
double f = TableLayout.FILL; |
||||
double p = TableLayout.PREFERRED; |
||||
double[] rowSize = {p, p, p, p, p}; |
||||
double[] columnSize = {p, f}; |
||||
int[][] rowCount = {{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}}; |
||||
Component[][] components = new Component[][]{ |
||||
new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Label_Name")), labelNameTextField}, |
||||
new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Base_Background")), background}, |
||||
new Component[]{displayReport, null}, |
||||
new Component[]{useParamsTemplate, null}, |
||||
new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Widget_Display_Position")), hAlignmentPane} |
||||
}; |
||||
JPanel panel = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, IntervalConstants.INTERVAL_W0, IntervalConstants.INTERVAL_L1); |
||||
panel.setBorder(BorderFactory.createEmptyBorder(IntervalConstants.INTERVAL_L1, 0, IntervalConstants.INTERVAL_L1, 0)); |
||||
CRPropertyDescriptor[] extraTableEditor = new CRPropertyDescriptor[0]; |
||||
extraTableEditor = root.getExtraTableEditor(); |
||||
extraPropertyGroupPane = new PropertyGroupPane(extraTableEditor, root); |
||||
|
||||
jPanel.add(panel, BorderLayout.NORTH); |
||||
jPanel.add(extraPropertyGroupPane, BorderLayout.CENTER); |
||||
return jPanel; |
||||
} |
||||
|
||||
/** |
||||
* @Description: 获取新决策报表的AdvancePane |
||||
* @param |
||||
* @return: |
||||
* @Author: Henry.Wang |
||||
* @date: 2020/11/05 15:36 |
||||
*/ |
||||
private JPanel getNewFormAdvancePane() { |
||||
JPanel jPanel = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||
labelNameTextField = new UITextField(); |
||||
displayReport = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Display_Nothing_Before_Query")); |
||||
UIComponentUtils.setLineWrap(displayReport); |
||||
useParamsTemplate = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Use_Params_Template")); |
||||
background = new AccessibleBackgroundEditor(); |
||||
|
||||
double f = TableLayout.FILL; |
||||
double p = TableLayout.PREFERRED; |
||||
double[] rowSize = {p, p, p, p}; |
||||
double[] columnSize = {p, f}; |
||||
int[][] rowCount = {{1, 1}, {1, 1}, {1, 1}, {1, 1}}; |
||||
Component[][] components = new Component[][]{ |
||||
new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Label_Name")), labelNameTextField}, |
||||
new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Base_Background")), background}, |
||||
new Component[]{displayReport, null}, |
||||
new Component[]{useParamsTemplate, null} |
||||
}; |
||||
JPanel panel = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, IntervalConstants.INTERVAL_W0, IntervalConstants.INTERVAL_L1); |
||||
panel.setBorder(BorderFactory.createEmptyBorder(IntervalConstants.INTERVAL_L1, 0, IntervalConstants.INTERVAL_L1, 0)); |
||||
|
||||
jPanel.add(panel, BorderLayout.NORTH); |
||||
|
||||
return jPanel; |
||||
} |
||||
|
||||
@Override |
||||
public String title4PopupWindow() { |
||||
return "parameter"; |
||||
} |
||||
|
||||
@Override |
||||
public void populateBean(WParameterLayout ob) { |
||||
labelNameTextField.setText(ob.getLabelName()); |
||||
background.setValue(ob.getBackground()); |
||||
displayReport.setSelected(ob.isDelayDisplayContent()); |
||||
useParamsTemplate.setSelected(ob.isUseParamsTemplate()); |
||||
if (newForm) { |
||||
FormDesigner designer = TemplateTool.getCurrentEditingNewJForm().getFormDesign(); |
||||
paraHeight.setValue(designer.getParaHeight()); |
||||
} else { |
||||
designerWidth.setValue(ob.getDesignWidth()); |
||||
hAlignmentPane.setSelectedItem(ob.getPosition()); |
||||
|
||||
if (extraPropertyGroupPane != null) { |
||||
extraPropertyGroupPane.populate(ob); |
||||
} |
||||
} |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public WParameterLayout updateBean() { |
||||
if (newForm) { |
||||
return updateNewFormBean(); |
||||
} else { |
||||
return updateTemplateBean(); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* @Description: 更新非新决策报表的bean |
||||
* @param |
||||
* @return: |
||||
* @Author: Henry.Wang |
||||
* @date: 2020/11/05 15:36 |
||||
*/ |
||||
private WParameterLayout updateTemplateBean() { |
||||
WParameterLayout wParameterLayout = (WParameterLayout) creator.toData(); |
||||
wParameterLayout.setLabelName(labelNameTextField.getText()); |
||||
if (isCompsOutOfDesignerWidth((int) designerWidth.getValue())) { |
||||
designerWidth.setValue(wParameterLayout.getDesignWidth()); |
||||
} else { |
||||
wParameterLayout.setDesignWidth((int) designerWidth.getValue()); |
||||
} |
||||
wParameterLayout.setDelayDisplayContent(displayReport.isSelected()); |
||||
wParameterLayout.setUseParamsTemplate(useParamsTemplate.isSelected()); |
||||
JTemplate jTemplate = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate(); |
||||
jTemplate.needAddTemplateIdAttr(useParamsTemplate.isSelected()); |
||||
wParameterLayout.setBackground((Background) background.getValue()); |
||||
wParameterLayout.setPosition((Integer) hAlignmentPane.getSelectedItem()); |
||||
return wParameterLayout; |
||||
} |
||||
|
||||
/** |
||||
* @Description: 更新新决策报表的bean |
||||
* @param |
||||
* @return: |
||||
* @Author: Henry.Wang |
||||
* @date: 2020/11/05 15:36 |
||||
*/ |
||||
private WParameterLayout updateNewFormBean() { |
||||
WParameterLayout wParameterLayout = (WParameterLayout) creator.toData(); |
||||
wParameterLayout.setLabelName(labelNameTextField.getText()); |
||||
|
||||
wParameterLayout.setDelayDisplayContent(displayReport.isSelected()); |
||||
wParameterLayout.setUseParamsTemplate(useParamsTemplate.isSelected()); |
||||
JTemplate jTemplate = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate(); |
||||
jTemplate.needAddTemplateIdAttr(useParamsTemplate.isSelected()); |
||||
wParameterLayout.setBackground((Background) background.getValue()); |
||||
//设置参数模板面板的高度
|
||||
int height = (int) paraHeight.getTextField().getValue(); |
||||
FormDesigner designer = TemplateTool.getCurrentEditingNewJForm().getFormDesign(); |
||||
FormSelection selection = designer.getSelectionModel().getSelection(); |
||||
XCreator creator = designer.getParaComponent(); |
||||
Rectangle rectangle = creator.getBounds(); |
||||
Rectangle newRectangle = new Rectangle(rectangle.x, rectangle.y, rectangle.width, height); |
||||
creator.setBounds(newRectangle); |
||||
if (paraHeight.getValue() != newRectangle.height) |
||||
paraHeight.setValue(newRectangle.height); |
||||
designer.setParaHeight(newRectangle.height); |
||||
designer.getArea().doLayout(); |
||||
LayoutUtils.layoutContainer(creator); |
||||
selection.fixCreator(designer); |
||||
designer.repaint(); |
||||
return wParameterLayout; |
||||
} |
||||
|
||||
private boolean isCompsOutOfDesignerWidth(int designerWidth) { |
||||
for (int i = 0; i < root.getComponentCount(); i++) { |
||||
Component comp = root.getComponent(i); |
||||
if (comp.getX() + comp.getWidth() > designerWidth) { |
||||
return true; |
||||
} |
||||
} |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public DataCreatorUI dataUI() { |
||||
return null; |
||||
} |
||||
} |
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue