|
|
|
@ -16,8 +16,10 @@ import com.fr.log.FineLoggerFactory;
|
|
|
|
|
import com.fr.stable.ArrayUtils; |
|
|
|
|
import com.fr.stable.CoreConstants; |
|
|
|
|
import com.fr.stable.ProductConstants; |
|
|
|
|
import com.fr.stable.StringUtils; |
|
|
|
|
import com.fr.workspace.WorkContext; |
|
|
|
|
import com.fr.workspace.server.lock.TplOperator; |
|
|
|
|
import org.jetbrains.annotations.Nullable; |
|
|
|
|
|
|
|
|
|
import javax.swing.SwingWorker; |
|
|
|
|
import java.io.OutputStream; |
|
|
|
@ -33,22 +35,63 @@ public class TemplateUtils {
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 创建新的模板文件并打开模板 |
|
|
|
|
* @param prefix 模板文件名称前缀 |
|
|
|
|
* @param file 模板文件 |
|
|
|
|
* |
|
|
|
|
* @param prefix 模板文件名称前缀 |
|
|
|
|
* @param file 模板文件 |
|
|
|
|
* @param createByEditingTemplate 是否根据 当前编辑模板 来创建新模板 |
|
|
|
|
* 为true时以CurrentEditingTemplate为准创建新模板 |
|
|
|
|
* 为false时以传入的File文件为准创建新模板,此文件可以不是编辑状态 |
|
|
|
|
* @param openNewTemplate 是否需要在创建后打开模板 |
|
|
|
|
* @param openNewTemplate 是否需要在创建后打开模板 |
|
|
|
|
*/ |
|
|
|
|
public static void createAndOpenTemplate(String prefix, FILE file, boolean createByEditingTemplate, boolean openNewTemplate) { |
|
|
|
|
String fileName = file.getName(); |
|
|
|
|
createAndOpenTemplate(prefix, file, createByEditingTemplate, openNewTemplate, () -> {}); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 创建新的模板文件并并判断新的模板文件是否之前已经被开打,如果已经打开需要reOpen |
|
|
|
|
* |
|
|
|
|
* @param prefix 模板文件名称前缀 |
|
|
|
|
* @param file 模板文件 |
|
|
|
|
* @param createByEditingTemplate 是否根据 当前编辑模板 来创建新模板 |
|
|
|
|
* 为true时以CurrentEditingTemplate为准创建新模板 |
|
|
|
|
* 为false时以传入的File文件为准创建新模板,此文件可以不是编辑状态 |
|
|
|
|
* @param openNewTemplate 是否需要在创建后打开模板 |
|
|
|
|
*/ |
|
|
|
|
public static void createAndReOpenTemplate(String prefix, FILE file, boolean createByEditingTemplate, boolean openNewTemplate) { |
|
|
|
|
String oldPath = file.getPath(); |
|
|
|
|
file = getSavedFile(prefix, file); |
|
|
|
|
if (file == null) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
Runnable doAfterCreateTemplate; |
|
|
|
|
//判断一下要保存的文件是否已打开
|
|
|
|
|
int index = HistoryTemplateListCache.getInstance().contains(file); |
|
|
|
|
if (index == -1) { |
|
|
|
|
doAfterCreateTemplate = () -> {}; |
|
|
|
|
} else { |
|
|
|
|
JTemplate template = HistoryTemplateListCache.getInstance().getHistoryList().get(index); |
|
|
|
|
doAfterCreateTemplate = () -> HistoryTemplateListCache.getInstance().closeSelectedReport(template); |
|
|
|
|
} |
|
|
|
|
createAndOpenTemplate0(file, oldPath, createByEditingTemplate, openNewTemplate, doAfterCreateTemplate); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 返回值可以为null, 为null表示点击保存按钮或者传递进来的文件file本身不满足格式要求 |
|
|
|
|
* |
|
|
|
|
* @param prefix 模板文件名称前缀 |
|
|
|
|
* @param file 模板文件 |
|
|
|
|
* @return 最后选择的要保存的文件 |
|
|
|
|
*/ |
|
|
|
|
@Nullable |
|
|
|
|
private static FILE getSavedFile(String prefix, FILE file) { |
|
|
|
|
String fileName = file.getName(); |
|
|
|
|
int indexOfLastDot = fileName.lastIndexOf(CoreConstants.DOT); |
|
|
|
|
if (indexOfLastDot < 0) { |
|
|
|
|
return; |
|
|
|
|
return null; |
|
|
|
|
} |
|
|
|
|
String suffix = fileName.substring(indexOfLastDot + 1); |
|
|
|
|
FILEChooserPane fileChooserPane = FILEChooserPane.getInstance(true, true); |
|
|
|
|
FILEChooserPane fileChooserPane = FILEChooserPane.getInstance(true, true); |
|
|
|
|
fileChooserPane.setFileNameTextField(prefix + fileName, suffix); |
|
|
|
|
FileExtension fileExtension = FileExtension.parse(suffix); |
|
|
|
|
fileChooserPane.addChooseFILEFilter(new ChooseFileFilter(fileExtension, ProductConstants.APP_NAME + Toolkit.i18nText("Fine-Design_Report_Template_File"))); |
|
|
|
@ -57,36 +100,52 @@ public class TemplateUtils {
|
|
|
|
|
fileChooserPane.enableFileNameTextFiled(); |
|
|
|
|
|
|
|
|
|
if (isCancel(result)) { |
|
|
|
|
return; |
|
|
|
|
return null; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (isOk(result)) { |
|
|
|
|
file = fileChooserPane.getSelectedFILE(); |
|
|
|
|
_createAndOpenTemplate(file, oldPath, createByEditingTemplate, openNewTemplate); |
|
|
|
|
return fileChooserPane.getSelectedFILE(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return null; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 创建新的模板文件并打开模板,并在创建备份模板成功后执行doAfterCreate |
|
|
|
|
* |
|
|
|
|
* @param prefix 模板文件名称前缀 |
|
|
|
|
* @param file 模板文件 |
|
|
|
|
* @param createByEditingTemplate 是否根据 当前编辑模板 来创建新模板 |
|
|
|
|
* 为true时以CurrentEditingTemplate为准创建新模板 |
|
|
|
|
* 为false时以传入的File文件为准创建新模板,此文件可以不是编辑状态 |
|
|
|
|
* @param openNewTemplate 是否需要在创建后打开模板 |
|
|
|
|
* @param doAfterCreateTemplate 创建备份模板成功后调用 |
|
|
|
|
*/ |
|
|
|
|
public static void createAndOpenTemplate(String prefix, FILE file, boolean createByEditingTemplate, boolean openNewTemplate, Runnable doAfterCreateTemplate) { |
|
|
|
|
String oldPath = file.getPath(); |
|
|
|
|
file = getSavedFile(prefix, file); |
|
|
|
|
if (file == null) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private static void _createAndOpenTemplate(FILE file, String oldPath, boolean createByEditingTemplate, boolean openNewTemplate){ |
|
|
|
|
new SwingWorker<Void, Void>() { |
|
|
|
|
createAndOpenTemplate0(file, oldPath, createByEditingTemplate, openNewTemplate, doAfterCreateTemplate); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private static void createAndOpenTemplate0(FILE file, String oldPath, boolean createByEditingTemplate, boolean openNewTemplate, Runnable doAfterCreateTemplate) { |
|
|
|
|
new SwingWorker<Boolean, Void>() { |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
protected Void doInBackground() throws Exception { |
|
|
|
|
byte[] content = new byte[0]; |
|
|
|
|
if (createByEditingTemplate) { |
|
|
|
|
// 从当前编辑模板中生成备份文件
|
|
|
|
|
JTemplate<?, ?> template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); |
|
|
|
|
content = template.exportData(); |
|
|
|
|
} else { |
|
|
|
|
content = WorkContext.getWorkResource().readFully(oldPath); |
|
|
|
|
} |
|
|
|
|
if (ArrayUtils.isEmpty(content)) { |
|
|
|
|
throw new Exception(oldPath + " content is empty" ); |
|
|
|
|
} |
|
|
|
|
protected Boolean doInBackground() throws Exception { |
|
|
|
|
// 读取模板数据
|
|
|
|
|
byte[] content = getTemplateData(createByEditingTemplate, oldPath); |
|
|
|
|
OutputStream out = null; |
|
|
|
|
try { |
|
|
|
|
// 加锁
|
|
|
|
|
WorkContext.getCurrent().get(TplOperator.class).saveAs(file.getPath()); |
|
|
|
|
boolean saveAsLock = WorkContext.getCurrent().get(TplOperator.class).saveAs(file.getPath()); |
|
|
|
|
if (!saveAsLock) { |
|
|
|
|
// 加锁失败时,直接返回
|
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
out = file.asOutputStream(); |
|
|
|
|
out.write(content); |
|
|
|
|
} finally { |
|
|
|
@ -98,15 +157,18 @@ public class TemplateUtils {
|
|
|
|
|
// 解锁
|
|
|
|
|
WorkContext.getCurrent().get(TplOperator.class).closeAndFreeFile(file.getPath()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
return null; |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
protected void done() { |
|
|
|
|
try { |
|
|
|
|
get(); |
|
|
|
|
if (!get()) { |
|
|
|
|
throw new Exception("[RemoteDesign] back up template file failed"); |
|
|
|
|
} |
|
|
|
|
// 创建备份成功后,关闭原模板
|
|
|
|
|
doAfterCreateTemplate.run(); |
|
|
|
|
if (openNewTemplate) { |
|
|
|
|
DesignerContext.getDesignerFrame().openTemplate(file); |
|
|
|
|
} |
|
|
|
@ -118,7 +180,31 @@ public class TemplateUtils {
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
}.execute(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 读取模板文件数据 |
|
|
|
|
* |
|
|
|
|
* @param readCurrentEditingTemplate 是否读取当前编辑模板 |
|
|
|
|
* @param path 模板路径 |
|
|
|
|
* @return 模板文件数据 |
|
|
|
|
*/ |
|
|
|
|
private static byte[] getTemplateData(boolean readCurrentEditingTemplate, String path) throws Exception { |
|
|
|
|
byte[] content = new byte[0]; |
|
|
|
|
if (readCurrentEditingTemplate) { |
|
|
|
|
// 从当前编辑模板中读取模板文件数据
|
|
|
|
|
JTemplate<?, ?> template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); |
|
|
|
|
if (JTemplate.isValid(template)) { |
|
|
|
|
content = template.exportData(); |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
// 从给定的模板路径中读取模板文件数据
|
|
|
|
|
content = WorkContext.getWorkResource().readFully(path); |
|
|
|
|
} |
|
|
|
|
if (ArrayUtils.isEmpty(content)) { |
|
|
|
|
throw new Exception(StringUtils.messageFormat("{} content is empty", path)); |
|
|
|
|
} |
|
|
|
|
return content; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private static boolean isCancel(int result) { |
|
|
|
|