package com.fr.env.utils; import com.fr.common.annotations.Compatible; import com.fr.general.IOUtils; import com.fr.log.FineLoggerFactory; import com.fr.stable.EncodeConstants; import com.fanruan.product.ProductConstants; import com.fr.stable.StableUtils; import com.fr.stable.StringUtils; import com.fr.stable.xml.XMLPrintWriter; import com.fr.stable.xml.XMLReadable; import com.fr.stable.xml.XMLTools; import com.fr.stable.xml.XMLWriter; import com.fr.stable.xml.XMLableReader; import com.fr.third.javax.xml.stream.XMLStreamException; import java.io.BufferedWriter; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; import java.nio.charset.StandardCharsets; /** * @author Starryi * @version 10.0.18 * Created by Starryi on 2021/7/7 * 设计器访问和获取关键历史交互信息的持久化工具,该关键历史交互信息, * 如用户是否点击过某按钮,是否查看过某弹窗信息,上次选择过的文件所在目录等 */ @Compatible public class DesignerInteractionHistory implements XMLReadable, XMLWriter { private static final String FILE_NAME = "designer.ix.history.info"; private static final String ROOT_TAG = "History"; private static DesignerInteractionHistory history; public static DesignerInteractionHistory getInstance() { if (history == null) { history = new DesignerInteractionHistory(); readXMLFile(history, history.getHistoryFile()); } return history; } private File getHistoryFile() { return new File(StableUtils.pathJoin(ProductConstants.getEnvHome(), FILE_NAME)); } private static void readXMLFile(XMLReadable xmlReadable, File xmlFile) { if (xmlFile == null || !xmlFile.exists()) { return; } String charset = EncodeConstants.ENCODING_UTF_8; try { String decodeContent = getFileContent(xmlFile); InputStream xmlInputStream = new ByteArrayInputStream(decodeContent.getBytes(charset)); InputStreamReader inputStreamReader = new InputStreamReader(xmlInputStream, charset); XMLableReader xmlReader = XMLableReader.createXMLableReader(inputStreamReader); if (xmlReader != null) { xmlReader.readXMLObject(xmlReadable); } xmlInputStream.close(); } catch (IOException | XMLStreamException e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); } } private static String getFileContent(File xmlFile) throws FileNotFoundException, UnsupportedEncodingException { InputStream encodeInputStream = new FileInputStream(xmlFile); return IOUtils.inputStream2String(encodeInputStream); } private static void writeContentToFile(String fileContent, File file) { try (FileOutputStream fos = new FileOutputStream(file); OutputStreamWriter osw = new OutputStreamWriter(fos, StandardCharsets.UTF_8); BufferedWriter bw = new BufferedWriter(osw)) { bw.write(fileContent); } catch (Exception e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); } } public void saveXMLFile() { File xmlFile = this.getHistoryFile(); try { ByteArrayOutputStream out = new ByteArrayOutputStream(); XMLTools.writeOutputStreamXML(this, out); out.flush(); out.close(); String fileContent = new String(out.toByteArray(), StandardCharsets.UTF_8); writeContentToFile(fileContent, xmlFile); } catch (Exception e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); } } private static final String HAS_SHOWN_SHIFT_DRAG_RESIZING_TOOLTIP = "hasShownShiftDragResizingTooltip"; private static final String LAST_SELECTED_BORDER_IMAGE_DIR = "lastSelectedBorderImageDir"; // 是否已展示过按下Shift键可锁定比例拖拽尺寸的Tooltip private boolean hasShownShiftDragResizingTooltip = false; // 用户上次通过文件选择器选择的边框图片所在目录 private String lastSelectedBorderImageDir = StringUtils.EMPTY; public boolean isHasShownShiftDragResizingTooltip() { return hasShownShiftDragResizingTooltip; } public void setHasShownShiftDragResizingTooltip(boolean shown) { this.hasShownShiftDragResizingTooltip = shown; } public String getLastSelectedBorderImageDir() { return lastSelectedBorderImageDir; } public void setLastSelectedBorderImageDir(String dirPath) { this.lastSelectedBorderImageDir = dirPath; } @Override public void writeXML(XMLPrintWriter writer) { writer.startTAG(ROOT_TAG) .attr(HAS_SHOWN_SHIFT_DRAG_RESIZING_TOOLTIP, isHasShownShiftDragResizingTooltip()) .attr(LAST_SELECTED_BORDER_IMAGE_DIR, getLastSelectedBorderImageDir()) .end(); } @Override public void readXML(XMLableReader reader) { setHasShownShiftDragResizingTooltip(reader.getAttrAsBoolean(HAS_SHOWN_SHIFT_DRAG_RESIZING_TOOLTIP, false)); setLastSelectedBorderImageDir(reader.getAttrAsString(LAST_SELECTED_BORDER_IMAGE_DIR, StringUtils.EMPTY)); } }