kuangshuai
3 years ago
44 changed files with 869 additions and 234 deletions
@ -1,5 +0,0 @@
|
||||
package com.fr.design.file; |
||||
|
||||
public interface Releasable { |
||||
void releaseResources(); |
||||
} |
@ -0,0 +1,148 @@
|
||||
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.fr.stable.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)); |
||||
} |
||||
} |
After Width: | Height: | Size: 255 B |
After Width: | Height: | Size: 220 B |
@ -1,47 +0,0 @@
|
||||
package com.fr.design.designer.creator; |
||||
|
||||
import com.fr.design.form.util.XCreatorConstants; |
||||
import com.fr.general.IOUtils; |
||||
import java.awt.AlphaComposite; |
||||
import java.awt.Color; |
||||
import java.awt.Graphics; |
||||
import java.awt.Graphics2D; |
||||
import java.awt.Image; |
||||
import java.awt.Rectangle; |
||||
|
||||
/** |
||||
* @author hades |
||||
* @version 10.0 |
||||
* Created by hades on 2021/06/30 |
||||
*/ |
||||
public class SelectedBorderIcon { |
||||
|
||||
private static final Image EDIT_ICON = IOUtils.readImage("/com/fr/design/images/control/show_edit.png"); |
||||
private static final Image SETTING_ICON = IOUtils.readImage("/com/fr/design/images/control/show_setting.png"); |
||||
private static final float ALPHA = 0.7F; |
||||
private static final int TIP_WIDTH = 20; |
||||
private static final int TIP_HEIGHT = 40; |
||||
private static final int ARC_VALUE = 4; |
||||
// 组件到整个提示之间的空隙
|
||||
private static final int CREATOR_TO_TIP_GAP = 5; |
||||
// icon在整个提示背景下缩进
|
||||
private static final int TIP_ICON_GAP = 2; |
||||
|
||||
/** |
||||
* 在bounds范围的右上角绘制特定图标 |
||||
* |
||||
* @param g |
||||
* @param bounds |
||||
*/ |
||||
public void paint(Graphics g, Rectangle bounds) { |
||||
Graphics2D g2d = (Graphics2D) g; |
||||
AlphaComposite alphaComposite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, ALPHA); |
||||
g2d.setColor(XCreatorConstants.EDIT_COLOR); |
||||
g2d.setComposite(alphaComposite); |
||||
g2d.fillRoundRect(bounds.x + bounds.width + CREATOR_TO_TIP_GAP, bounds.y, TIP_WIDTH, TIP_HEIGHT, ARC_VALUE, ARC_VALUE); |
||||
g2d.drawImage(EDIT_ICON, bounds.x + bounds.width + CREATOR_TO_TIP_GAP + TIP_ICON_GAP, bounds.y + TIP_ICON_GAP, EDIT_ICON.getWidth(null), EDIT_ICON.getHeight(null), null); |
||||
g2d.drawImage(SETTING_ICON, bounds.x + bounds.width + CREATOR_TO_TIP_GAP + TIP_ICON_GAP, bounds.y + CREATOR_TO_TIP_GAP + EDIT_ICON.getHeight(null), SETTING_ICON.getWidth(null), SETTING_ICON.getHeight(null), null); |
||||
g2d.setColor(Color.WHITE); |
||||
g2d.drawLine(bounds.x + bounds.width + CREATOR_TO_TIP_GAP + TIP_ICON_GAP, bounds.y + TIP_WIDTH, bounds.x + bounds.width + CREATOR_TO_TIP_GAP + TIP_ICON_GAP + EDIT_ICON.getWidth(null), bounds.y + TIP_WIDTH); |
||||
} |
||||
} |
@ -0,0 +1,191 @@
|
||||
package com.fr.design.designer.ui; |
||||
|
||||
import com.fr.design.designer.creator.XCreator; |
||||
import com.fr.design.gui.ilable.UILabel; |
||||
import com.fr.design.i18n.Toolkit; |
||||
import com.fr.design.mainframe.CoverReportPane; |
||||
import com.fr.design.mainframe.EditingMouseListener; |
||||
import com.fr.design.mainframe.FormDesigner; |
||||
import com.fr.general.IOUtils; |
||||
import com.fr.stable.ArrayUtils; |
||||
import java.awt.Color; |
||||
import java.awt.Component; |
||||
import java.awt.Container; |
||||
import java.awt.Dimension; |
||||
import java.awt.Graphics; |
||||
import java.awt.Graphics2D; |
||||
import java.awt.Insets; |
||||
import java.awt.LayoutManager; |
||||
import java.awt.Rectangle; |
||||
import java.awt.RenderingHints; |
||||
import java.awt.event.ActionEvent; |
||||
import java.awt.event.ActionListener; |
||||
import java.awt.event.MouseAdapter; |
||||
import java.awt.event.MouseEvent; |
||||
import java.awt.event.MouseListener; |
||||
import javax.swing.AbstractButton; |
||||
import javax.swing.Icon; |
||||
import javax.swing.JButton; |
||||
import javax.swing.JPanel; |
||||
import javax.swing.JToggleButton; |
||||
import javax.swing.event.ChangeEvent; |
||||
import javax.swing.event.ChangeListener; |
||||
|
||||
/** |
||||
* @author hades |
||||
* @version 10.0 |
||||
* Created by hades on 2021/7/8 |
||||
*/ |
||||
public class PopupControlPanel extends JPanel { |
||||
|
||||
private static final int ARC_VALUE = 4; |
||||
private static final Color FILLED_COLOR = new Color(60, 63, 65); |
||||
private static final int V_GAP = 10; |
||||
private static final int H_GAP = 2; |
||||
|
||||
private Dimension defaultDimension = new Dimension(20, 60); |
||||
private Rectangle rectangle; |
||||
private final JButton editButton; |
||||
private final JButton settingButton; |
||||
private final JToggleButton toggleButton; |
||||
private final XCreator creator; |
||||
private final UILabel firstLabel; |
||||
private final UILabel secondLabel; |
||||
|
||||
public PopupControlPanel(XCreator creator, FormDesigner designer) { |
||||
if (creator.isShared()) { |
||||
defaultDimension = new Dimension(20, 85); |
||||
} |
||||
setLayout(getCustomLayout()); |
||||
this.creator = creator; |
||||
editButton = createNormalButton(IOUtils.readIcon("/com/fr/design/images/control/show_edit.png"), Toolkit.i18nText("Fine-Design_Form_Edit_Widget")); |
||||
editButton.addMouseListener(new MouseAdapter() { |
||||
@Override |
||||
public void mouseClicked(MouseEvent e) { |
||||
int x = rectangle.x + rectangle.width / 2; |
||||
int y = rectangle.y + rectangle.height / 2; |
||||
XCreator childCreator = PopupControlPanel.this.creator.getEditingChildCreator(); |
||||
MouseListener[] listeners = designer.getMouseListeners(); |
||||
if (ArrayUtils.isNotEmpty(listeners) && listeners[0] instanceof EditingMouseListener) { |
||||
childCreator.respondClick(((EditingMouseListener) listeners[0]), new MouseEvent(childCreator, MouseEvent.MOUSE_CLICKED, e.getWhen(), e.getModifiers(), x, y, 2, false)); |
||||
} |
||||
} |
||||
}); |
||||
settingButton = createNormalButton(IOUtils.readIcon("/com/fr/design/images/control/show_setting.png"), Toolkit.i18nText("Fine-Design_Share_Help_Settings")); |
||||
|
||||
settingButton.addActionListener(new ActionListener() { |
||||
@Override |
||||
public void actionPerformed(ActionEvent e) { |
||||
CoverReportPane.showShareConfig(creator.toData()); |
||||
} |
||||
}); |
||||
toggleButton = new JToggleButton(IOUtils.readIcon("/com/fr/design/images/control/edit_lock.png")); |
||||
initButtonStyle(toggleButton); |
||||
toggleButton.setSelectedIcon(IOUtils.readIcon("com/fr/design/images/control/edit_unlock.png")); |
||||
toggleButton.setToolTipText(Toolkit.i18nText("Fine-Design_Form_Lock_Widget_Ratio")); |
||||
toggleButton.addChangeListener(new ChangeListener() { |
||||
@Override |
||||
public void stateChanged(ChangeEvent e) { |
||||
JToggleButton toggleBtn = (JToggleButton) e.getSource(); |
||||
String toolTipText = toggleBtn.isSelected() ? Toolkit.i18nText("Fine-Design_Form_UnLock_Widget_Ratio") : Toolkit.i18nText("Fine-Design_Form_Lock_Widget_Ratio"); |
||||
toggleBtn.setToolTipText(toolTipText); |
||||
} |
||||
}); |
||||
|
||||
firstLabel = createLabel(); |
||||
secondLabel = createLabel(); |
||||
|
||||
add(editButton); |
||||
add(toggleButton); |
||||
add(settingButton); |
||||
add(firstLabel); |
||||
add(secondLabel); |
||||
} |
||||
|
||||
protected LayoutManager getCustomLayout() { |
||||
return new LayoutManager() { |
||||
|
||||
@Override |
||||
public void removeLayoutComponent(Component comp) { |
||||
} |
||||
|
||||
@Override |
||||
public Dimension preferredLayoutSize(Container parent) { |
||||
return defaultDimension; |
||||
} |
||||
|
||||
@Override |
||||
public Dimension minimumLayoutSize(Container parent) { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public void layoutContainer(Container parent) { |
||||
int width = parent.getPreferredSize().width; |
||||
int buttonWidth = editButton.getPreferredSize().width; |
||||
int buttonHeight = editButton.getPreferredSize().height; |
||||
int x = (width - buttonWidth) / 2; |
||||
editButton.setBounds(x, V_GAP, buttonWidth, buttonHeight); |
||||
firstLabel.setBounds(x, V_GAP + editButton.getHeight() + V_GAP / 2, buttonWidth, buttonHeight); |
||||
toggleButton.setBounds(x, V_GAP * 2 + editButton.getHeight(), buttonWidth, buttonHeight); |
||||
if (creator.isShared()) { |
||||
secondLabel.setBounds(x, V_GAP * 2 + editButton.getHeight() + toggleButton.getHeight() + V_GAP / 2, buttonWidth, buttonHeight); |
||||
settingButton.setBounds(x, V_GAP * 3 + editButton.getHeight() + toggleButton.getHeight(), buttonWidth, buttonHeight); |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public void addLayoutComponent(String name, Component comp) { |
||||
} |
||||
}; |
||||
} |
||||
|
||||
private JButton createNormalButton(Icon icon, String toolTipText) { |
||||
JButton button = new JButton(icon); |
||||
initButtonStyle(button); |
||||
button.setToolTipText(toolTipText); |
||||
return button; |
||||
} |
||||
|
||||
private void initButtonStyle(AbstractButton button) { |
||||
button.setBorderPainted(false); |
||||
button.setBorder(null); |
||||
button.setMargin(new Insets(0, 0, 0, 0)); |
||||
button.setContentAreaFilled(false); |
||||
} |
||||
|
||||
private UILabel createLabel() { |
||||
return new UILabel() { |
||||
@Override |
||||
public void paint(Graphics g) { |
||||
super.paint(g); |
||||
Graphics2D g2d = (Graphics2D) g; |
||||
g2d.setColor(Color.WHITE); |
||||
g2d.drawLine(H_GAP, 0, toggleButton.getWidth() - H_GAP, 0); |
||||
|
||||
} |
||||
}; |
||||
} |
||||
|
||||
@Override |
||||
protected void paintComponent(Graphics g) { |
||||
super.paintComponent(g); |
||||
int w = this.getWidth(); |
||||
int h = this.getHeight(); |
||||
Graphics2D g2d = (Graphics2D) g; |
||||
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); |
||||
g2d.setColor(FILLED_COLOR); |
||||
g2d.fillRoundRect(0, 0, w - 1, h - 1, ARC_VALUE, ARC_VALUE); |
||||
g2d.setColor(Color.WHITE); |
||||
g2d.drawRoundRect(0, 0, w - 1, h - 1, ARC_VALUE, ARC_VALUE); |
||||
} |
||||
|
||||
public Dimension getDefaultDimension() { |
||||
return defaultDimension; |
||||
} |
||||
|
||||
public void setRelativeBounds(Rectangle rectangle) { |
||||
this.rectangle = rectangle; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,36 @@
|
||||
package com.fr.design.designer.ui; |
||||
|
||||
import com.fr.design.designer.creator.XCreator; |
||||
import com.fr.design.mainframe.DesignerContext; |
||||
import com.fr.design.mainframe.FormDesigner; |
||||
import java.awt.Rectangle; |
||||
import javax.swing.JDialog; |
||||
|
||||
/** |
||||
* @author hades |
||||
* @version 10.0 |
||||
* Created by hades on 2021/7/09 |
||||
*/ |
||||
public class SelectedPopupDialog extends JDialog { |
||||
|
||||
/** |
||||
* 弹窗的相对组件的偏移 |
||||
*/ |
||||
public static final int OFFSET_X = 5; |
||||
|
||||
private final PopupControlPanel controlPanel; |
||||
|
||||
public SelectedPopupDialog(XCreator creator, FormDesigner designer) { |
||||
super(DesignerContext.getDesignerFrame()); |
||||
this.setUndecorated(true); |
||||
this.setModal(false); |
||||
controlPanel = new PopupControlPanel(creator, designer); |
||||
this.getContentPane().add(controlPanel); |
||||
this.setSize(controlPanel.getDefaultDimension()); |
||||
} |
||||
|
||||
public void setRelativeBounds(Rectangle rectangle) { |
||||
this.controlPanel.setRelativeBounds(rectangle); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,7 @@
|
||||
package com.fr.design.mainframe; |
||||
|
||||
import com.fr.design.designer.creator.XCreator; |
||||
|
||||
public interface XCreateGather { |
||||
void dealWith(XCreator xCreator); |
||||
} |
Loading…
Reference in new issue