Browse Source
* commit '7cb89b56c298384e9d37924392a4dc1609a8b467': (88 commits) REPORT-30467 检测时长延长 关闭与确定对调 REPORT-29118 mac下屏蔽 REPORT-29815 添加插件监听 REPORT-29815 统一下报表和表单的移动端属性快捷键 REPORT-30369 同步到final REPORT-30347 处理异常弹窗 MOBILE-26189 同步到final MOBILE-26198 && MOBILE-26189 交互调整 fix 漏交 MOBILE-26198 && MOBILE-26189 REPORT-29118 && REPORT-29117 CHART-13559 大数据下动画特效和高亮的label也要变灰 MOBILE-26174 && MOBILE-25651 REPORT-29462 设计器菜单栏-模板-纸张背景-渐变色,滑动右边游标,确定后再次查看,位置回到初始位置 代码调整 代码修改 REPORT-29882 8.0工程升级10.0后,模板web属性打不开 代码修改 REPORT-29536【打印设置-本地打印自定义纸张大小的custom比其他选项多出首行空格 REPORT-29576 异常弹窗处理 ...persist/10.0
Kara
5 years ago
153 changed files with 4353 additions and 906 deletions
@ -0,0 +1,57 @@
|
||||
package com.fr.design.fun; |
||||
|
||||
import com.fr.design.gui.icombobox.UIComboBox; |
||||
import com.fr.design.gui.icontainer.UIScrollPane; |
||||
import com.fr.design.mainframe.DockingView; |
||||
import com.fr.stable.fun.mark.Immutable; |
||||
|
||||
import javax.swing.JPanel; |
||||
|
||||
/** |
||||
* 组件库面板处理器 |
||||
* |
||||
* created by Harrison on 2020/03/16 |
||||
**/ |
||||
public interface ComponentLibraryPaneProcessor extends Immutable { |
||||
|
||||
String XML_TAG = "ComponentLibraryPaneProcessor"; |
||||
|
||||
int CURRENT_LEVEL = 1; |
||||
|
||||
/** |
||||
* 创建展示面板 |
||||
* |
||||
* @param isEdit 是否可以编辑 |
||||
* @return 展示面板 |
||||
*/ |
||||
UIScrollPane createShowPanel(boolean isEdit); |
||||
|
||||
/** |
||||
* 创建菜单的上部面板 |
||||
* |
||||
* @return 面板 |
||||
*/ |
||||
JPanel createMenuNorthPane(); |
||||
|
||||
/** |
||||
* 创建复选框 |
||||
* |
||||
* @return 复选框 |
||||
*/ |
||||
UIComboBox createMenuComBox(); |
||||
|
||||
void parentView(DockingView dockingView); |
||||
|
||||
/** |
||||
* 父面板 |
||||
* |
||||
* @param panel 面板 |
||||
*/ |
||||
void parentPane(JPanel panel); |
||||
|
||||
/** |
||||
* 创建完成 |
||||
*/ |
||||
void complete(); |
||||
|
||||
} |
@ -0,0 +1,36 @@
|
||||
package com.fr.design.fun; |
||||
|
||||
import com.fr.design.mainframe.JTemplate; |
||||
import com.fr.design.menu.ShortCut; |
||||
import com.fr.stable.fun.mark.Immutable; |
||||
|
||||
import javax.swing.JComponent; |
||||
import java.awt.Dimension; |
||||
import java.awt.image.BufferedImage; |
||||
|
||||
|
||||
/** |
||||
* Created by kerry on 2020-04-09 |
||||
* 临时接口,后续自适应内置后删除 |
||||
*/ |
||||
public interface FormAdaptiveConfigUIProcessor extends Immutable { |
||||
|
||||
String MARK_STRING = "FormAdaptiveConfigUIProcessor"; |
||||
int CURRENT_LEVEL = 1; |
||||
|
||||
/** |
||||
* 获取表单自适应配置菜单 |
||||
* @return 表单自适应配置菜单 |
||||
*/ |
||||
ShortCut getConfigShortCut(JTemplate jTemplate); |
||||
|
||||
/** |
||||
* 绘制自适应下报表块在表单界面中显示图片 |
||||
* @param size 绘制尺寸 |
||||
* @param elementCasePane 报表块内容对象 |
||||
* @return 自适应下报表块在表单界面中显示的图片 |
||||
*/ |
||||
BufferedImage paintFormElementCaseImage(Dimension size, JComponent elementCasePane); |
||||
|
||||
} |
||||
|
@ -0,0 +1,25 @@
|
||||
package com.fr.design.fun; |
||||
|
||||
import com.fr.design.beans.BasicBeanPane; |
||||
import com.fr.general.cardtag.mobile.MobileTemplateStyle; |
||||
import com.fr.stable.fun.mark.Mutable; |
||||
|
||||
/** |
||||
* @author hades |
||||
* @version 10.0 |
||||
* Created by hades on 2020/3/31 |
||||
*/ |
||||
public interface MobileTemplateStyleProvider extends Mutable { |
||||
|
||||
String XML_TAG = "MobileTemplateStyleProvider"; |
||||
|
||||
int CURRENT_LEVEL = 1; |
||||
|
||||
Class<? extends MobileTemplateStyle> classFroMobileTemplateStyle(); |
||||
|
||||
|
||||
Class<? extends BasicBeanPane<MobileTemplateStyle>> classFroMobileTemplateStyleAppearance(); |
||||
|
||||
String displayName(); |
||||
|
||||
} |
@ -0,0 +1,50 @@
|
||||
package com.fr.design.fun; |
||||
|
||||
import com.fr.design.mainframe.PaneHolder; |
||||
import com.fr.design.mainframe.PropertyItemBean; |
||||
import com.fr.stable.fun.mark.Mutable; |
||||
import org.jetbrains.annotations.Nullable; |
||||
|
||||
/** |
||||
* created by Harrison on 2020/03/23 |
||||
**/ |
||||
public interface PropertyItemPaneProvider<T> extends Mutable { |
||||
|
||||
int CURRENT_LEVEL = 1; |
||||
|
||||
String XML_TAG = "PropertyItemPaneProvider"; |
||||
|
||||
int FIRST = 100; |
||||
|
||||
int LAST = -100; |
||||
|
||||
/** |
||||
* 独一无二的标志 |
||||
* |
||||
* @return 标志 |
||||
*/ |
||||
String key(); |
||||
|
||||
/** |
||||
* 配置属性 |
||||
* |
||||
* @return 熟悉 |
||||
*/ |
||||
PropertyItemBean getItem(); |
||||
|
||||
/** |
||||
* 面板持有者 |
||||
* |
||||
* @param clazz 类型 |
||||
* @return 持有者 |
||||
*/ |
||||
@Nullable |
||||
PaneHolder<T> getPaneHolder(Class<?> clazz); |
||||
|
||||
/** |
||||
* 想要替代的类型 |
||||
* |
||||
* @return 替代类型 |
||||
*/ |
||||
String replaceKey(); |
||||
} |
@ -0,0 +1,39 @@
|
||||
package com.fr.design.fun; |
||||
|
||||
import com.fr.stable.fun.mark.Mutable; |
||||
import com.fr.stable.unit.UNIT; |
||||
|
||||
/** |
||||
* Created by kerry on 2020-04-09 |
||||
*/ |
||||
public interface ReportLengthUNITProvider extends Mutable { |
||||
String MARK_STRING = "ReportLengthUNITProvider"; |
||||
|
||||
int CURRENT_LEVEL = 1; |
||||
|
||||
/** |
||||
* 标尺单位显示字符 |
||||
* @return 标尺单位字符 |
||||
*/ |
||||
String unitText(); |
||||
|
||||
/** |
||||
* 标尺单位类型(之前是将int类型的值直接保存在数据库里面的) |
||||
* @return 返回标尺单位类型 |
||||
*/ |
||||
int unitType(); |
||||
|
||||
/** |
||||
* UNIT转标尺单位值 |
||||
* @param value UNIT |
||||
* @return 标尺单位值 |
||||
*/ |
||||
float unit2Value4Scale(UNIT value); |
||||
|
||||
/** |
||||
* 标尺单位值转UNIT |
||||
* @param value 标尺单位值 |
||||
* @return UNIT |
||||
*/ |
||||
UNIT float2UNIT(float value); |
||||
} |
@ -0,0 +1,23 @@
|
||||
package com.fr.design.fun.impl; |
||||
|
||||
|
||||
import com.fr.design.fun.FormAdaptiveConfigUIProcessor; |
||||
import com.fr.stable.fun.mark.API; |
||||
|
||||
/** |
||||
* Created by kerry on 2020-04-09 |
||||
*/ |
||||
@API(level = FormAdaptiveConfigUIProcessor.CURRENT_LEVEL) |
||||
public abstract class AbstractFormAdaptiveConfigUIProcessor implements FormAdaptiveConfigUIProcessor { |
||||
|
||||
@Override |
||||
public int currentAPILevel() { |
||||
return CURRENT_LEVEL; |
||||
} |
||||
|
||||
@Override |
||||
public int layerIndex() { |
||||
return DEFAULT_LAYER_INDEX; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,25 @@
|
||||
package com.fr.design.fun.impl; |
||||
|
||||
import com.fr.design.fun.MobileTemplateStyleProvider; |
||||
import com.fr.design.fun.MobileWidgetStyleProvider; |
||||
import com.fr.stable.fun.impl.AbstractProvider; |
||||
import com.fr.stable.fun.mark.API; |
||||
|
||||
/** |
||||
* @author hades |
||||
* @version 10.0 |
||||
* Created by hades on 2020/3/31 |
||||
*/ |
||||
@API(level = MobileWidgetStyleProvider.CURRENT_LEVEL) |
||||
public abstract class AbstractMobileTemplateStyleProvider extends AbstractProvider implements MobileTemplateStyleProvider { |
||||
|
||||
@Override |
||||
public int currentAPILevel() { |
||||
return CURRENT_LEVEL; |
||||
} |
||||
|
||||
@Override |
||||
public String mark4Provider() { |
||||
return getClass().getName(); |
||||
} |
||||
} |
@ -0,0 +1,31 @@
|
||||
package com.fr.design.fun.impl; |
||||
|
||||
import com.fr.design.fun.PropertyItemPaneProvider; |
||||
import com.fr.design.mainframe.PaneHolder; |
||||
import com.fr.stable.fun.impl.AbstractProvider; |
||||
import com.fr.stable.fun.mark.API; |
||||
|
||||
/** |
||||
* created by Harrison on 2020/03/23 |
||||
**/ |
||||
@API(level = PropertyItemPaneProvider.CURRENT_LEVEL) |
||||
public abstract class AbstractPropertyItemPaneProvider<T> extends AbstractProvider implements PropertyItemPaneProvider<T> { |
||||
|
||||
@Override |
||||
public PaneHolder<T> getPaneHolder(Class<?> clazz) { |
||||
|
||||
if (sign().equals(clazz)) { |
||||
return getPathHolder0(); |
||||
} |
||||
return null; |
||||
} |
||||
|
||||
protected abstract PaneHolder<T> getPathHolder0(); |
||||
|
||||
protected abstract Class<T> sign(); |
||||
|
||||
@Override |
||||
public int currentAPILevel() { |
||||
return PropertyItemPaneProvider.CURRENT_LEVEL; |
||||
} |
||||
} |
@ -0,0 +1,42 @@
|
||||
package com.fr.design.fun.impl; |
||||
|
||||
|
||||
import com.fr.design.fun.ReportLengthUNITProvider; |
||||
import com.fr.stable.StringUtils; |
||||
import com.fr.stable.fun.impl.AbstractProvider; |
||||
import com.fr.stable.fun.mark.API; |
||||
import com.fr.stable.unit.UNIT; |
||||
|
||||
/** |
||||
* Created by kerry on 2020-04-09 |
||||
*/ |
||||
@API(level = ReportLengthUNITProvider.CURRENT_LEVEL) |
||||
public abstract class AbstractReportLengthUNITProvider extends AbstractProvider implements ReportLengthUNITProvider { |
||||
|
||||
|
||||
@Override |
||||
public int currentAPILevel() { |
||||
return CURRENT_LEVEL; |
||||
} |
||||
|
||||
@Override |
||||
public String unitText() { |
||||
return StringUtils.EMPTY; |
||||
} |
||||
|
||||
@Override |
||||
public int unitType() { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public float unit2Value4Scale(UNIT value) { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public UNIT float2UNIT(float value) { |
||||
return UNIT.ZERO; |
||||
} |
||||
} |
||||
|
@ -0,0 +1,81 @@
|
||||
package com.fr.design.gui.imenu; |
||||
|
||||
import com.fr.design.constants.UIConstants; |
||||
import com.fr.design.utils.gui.GUIPaintUtils; |
||||
import com.fr.stable.Constants; |
||||
import sun.swing.SwingUtilities2; |
||||
|
||||
import javax.swing.ButtonModel; |
||||
import javax.swing.JMenu; |
||||
import javax.swing.JMenuItem; |
||||
import javax.swing.UIManager; |
||||
import javax.swing.plaf.basic.BasicMenuItemUI; |
||||
import java.awt.Color; |
||||
import java.awt.FontMetrics; |
||||
import java.awt.Graphics; |
||||
import java.awt.Graphics2D; |
||||
import java.awt.Rectangle; |
||||
|
||||
/** |
||||
* created by Harrison on 2020/03/22 |
||||
**/ |
||||
public class UIMenuItemUI extends BasicMenuItemUI { |
||||
|
||||
@Override |
||||
protected void paintBackground(Graphics g, JMenuItem menuItem, Color bgColor) { |
||||
if (menuItem.getIcon() == null) { |
||||
super.paintBackground(g, menuItem, bgColor); |
||||
return; |
||||
} |
||||
ButtonModel model = menuItem.getModel(); |
||||
Color oldColor = g.getColor(); |
||||
int menuWidth = menuItem.getWidth(); |
||||
int menuHeight = menuItem.getHeight(); |
||||
|
||||
g.setColor(UIConstants.NORMAL_BACKGROUND); |
||||
g.fillRect(0, 0, menuWidth, menuHeight); |
||||
if (menuItem.isOpaque()) { |
||||
if (model.isArmed() || (menuItem instanceof JMenu && model.isSelected())) { |
||||
GUIPaintUtils.fillPaint((Graphics2D) g, 30, 0, menuWidth - 30, menuHeight, true, Constants.NULL, UIConstants.FLESH_BLUE, 7); |
||||
} else { |
||||
GUIPaintUtils.fillPaint((Graphics2D) g, 30, 0, menuWidth - 30, menuHeight, true, Constants.NULL, menuItem.getBackground(), 7); |
||||
} |
||||
g.setColor(oldColor); |
||||
} else if (model.isArmed() || (menuItem instanceof JMenu && |
||||
model.isSelected())) { |
||||
GUIPaintUtils.fillPaint((Graphics2D) g, 30, 0, menuWidth - 30, menuHeight, true, Constants.NULL, UIConstants.FLESH_BLUE, 7); |
||||
g.setColor(oldColor); |
||||
} |
||||
} |
||||
|
||||
protected void paintText(Graphics g, JMenuItem menuItem, Rectangle textRect, String text) { |
||||
ButtonModel model = menuItem.getModel(); |
||||
FontMetrics fm = SwingUtilities2.getFontMetrics(menuItem, g); |
||||
int mnemIndex = menuItem.getDisplayedMnemonicIndex(); |
||||
|
||||
if (!model.isEnabled()) { |
||||
// *** paint the text disabled
|
||||
if (UIManager.get("MenuItem.disabledForeground") instanceof Color) { |
||||
g.setColor(UIManager.getColor("MenuItem.disabledForeground")); |
||||
SwingUtilities2.drawStringUnderlineCharAt(menuItem, g, text, |
||||
-1, textRect.x, textRect.y + fm.getAscent()); |
||||
} else { |
||||
g.setColor(menuItem.getBackground().brighter()); |
||||
SwingUtilities2.drawStringUnderlineCharAt(menuItem, g, text, |
||||
-1, textRect.x, textRect.y + fm.getAscent()); |
||||
g.setColor(menuItem.getBackground().darker()); |
||||
SwingUtilities2.drawStringUnderlineCharAt(menuItem, g, text, |
||||
-1, textRect.x - 1, textRect.y + |
||||
fm.getAscent() - 1); |
||||
} |
||||
} else { |
||||
// *** paint the text normally
|
||||
if (model.isArmed() || (menuItem instanceof JMenu && model.isSelected())) { |
||||
g.setColor(Color.WHITE); // Uses protected field.
|
||||
} |
||||
SwingUtilities2.drawStringUnderlineCharAt(menuItem, g, text, |
||||
-1, textRect.x, textRect.y + fm.getAscent()); |
||||
} |
||||
} |
||||
|
||||
} |
@ -0,0 +1,17 @@
|
||||
package com.fr.design.mainframe; |
||||
|
||||
import javax.swing.JPanel; |
||||
|
||||
/** |
||||
* created by Harrison on 2020/03/23 |
||||
**/ |
||||
public interface PaneHolder<T> { |
||||
|
||||
/** |
||||
* 得到 Pane |
||||
* |
||||
* @param arg 参数 |
||||
* @return 面板 |
||||
*/ |
||||
JPanel getInstance(T arg); |
||||
} |
@ -0,0 +1,78 @@
|
||||
package com.fr.design.mainframe; |
||||
|
||||
import java.awt.event.ActionListener; |
||||
import java.util.List; |
||||
|
||||
/** |
||||
* created by Harrison on 2020/03/23 |
||||
**/ |
||||
public class PropertyItemBean { |
||||
|
||||
private String name; |
||||
private String title; |
||||
private String btnIconName; |
||||
private String btnIconBaseDir; |
||||
private EastRegionContainerPane.PropertyMode[] visibleModes; |
||||
private EastRegionContainerPane.PropertyMode[] enableModes; |
||||
private List<ActionListener> buttonListeners; |
||||
|
||||
public PropertyItemBean() { |
||||
} |
||||
|
||||
public String getName() { |
||||
return name; |
||||
} |
||||
|
||||
public void setName(String name) { |
||||
this.name = name; |
||||
} |
||||
|
||||
public String getTitle() { |
||||
return title; |
||||
} |
||||
|
||||
public void setTitle(String title) { |
||||
this.title = title; |
||||
} |
||||
|
||||
public String getBtnIconName() { |
||||
return btnIconName; |
||||
} |
||||
|
||||
public void setBtnIconName(String btnIconName) { |
||||
this.btnIconName = btnIconName; |
||||
} |
||||
|
||||
public String getBtnIconBaseDir() { |
||||
|
||||
return btnIconBaseDir; |
||||
} |
||||
|
||||
public void setBtnIconBaseDir(String btnIconBaseDir) { |
||||
this.btnIconBaseDir = btnIconBaseDir; |
||||
} |
||||
|
||||
public EastRegionContainerPane.PropertyMode[] getVisibleModes() { |
||||
return visibleModes; |
||||
} |
||||
|
||||
public void setVisibleModes(EastRegionContainerPane.PropertyMode[] visibleModes) { |
||||
this.visibleModes = visibleModes; |
||||
} |
||||
|
||||
public EastRegionContainerPane.PropertyMode[] getEnableModes() { |
||||
return enableModes; |
||||
} |
||||
|
||||
public void setEnableModes(EastRegionContainerPane.PropertyMode[] enableModes) { |
||||
this.enableModes = enableModes; |
||||
} |
||||
|
||||
public List<ActionListener> getButtonListeners() { |
||||
return buttonListeners; |
||||
} |
||||
|
||||
public void setButtonListeners(List<ActionListener> buttonListeners) { |
||||
this.buttonListeners = buttonListeners; |
||||
} |
||||
} |
@ -0,0 +1,233 @@
|
||||
package com.fr.design.mainframe.mobile.ui; |
||||
|
||||
import com.fr.design.constants.LayoutConstants; |
||||
import com.fr.design.designer.IntervalConstants; |
||||
import com.fr.design.gui.ibutton.UIColorButton; |
||||
import com.fr.design.gui.icombobox.LineComboBox; |
||||
import com.fr.design.gui.ilable.UILabel; |
||||
import com.fr.design.gui.ispinner.UnsignedIntUISpinner; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.design.layout.TableLayoutHelper; |
||||
import com.fr.design.mainframe.widget.MobileTabFontConfPane; |
||||
import com.fr.design.mainframe.widget.UITitleSplitLine; |
||||
import com.fr.design.mainframe.widget.preview.MobileTemplatePreviewPane; |
||||
import com.fr.design.style.color.ColorSelectBox; |
||||
import com.fr.design.style.color.NewColorSelectBox; |
||||
import com.fr.form.ui.container.cardlayout.WCardTagLayout; |
||||
import com.fr.general.cardtag.mobile.MobileTemplateStyle; |
||||
import com.fr.general.cardtag.mobile.TabFontConfig; |
||||
import com.fr.general.cardtag.mobile.UniteStyle; |
||||
import com.fr.stable.CoreConstants; |
||||
|
||||
import javax.swing.*; |
||||
import java.awt.*; |
||||
|
||||
public class UniteStyleDefinePane extends MobileTemplateStyleDefinePane { |
||||
private static final int SPLIT_LINE_WIDTH = 520; |
||||
private static final int SPLIT_LINE_HEIGHT = 20; |
||||
|
||||
private static final int TOGGLE_BUTTON_WIDTH = 20; |
||||
private static final int LABEL_WIDTH = 75; |
||||
private static final int LINE_COMPONENT_WIDTH = 157; |
||||
private static final int LINE_COMPONENT_HEIGHT = 20; |
||||
|
||||
private UnsignedIntUISpinner paddingLeftSpinner; |
||||
private UnsignedIntUISpinner paddingRightSpinner; |
||||
|
||||
private NewColorSelectBox initialBackgroundColorBox; |
||||
private NewColorSelectBox selectedBackgroundColorBox; |
||||
|
||||
private LineComboBox borderWidthComboBox; |
||||
private ColorSelectBox borderColorBox; |
||||
private UnsignedIntUISpinner borderRadiusSpinner; |
||||
|
||||
private MobileTabFontConfPane tabFontConfPane; |
||||
private UIColorButton selectedFontColorButton; |
||||
|
||||
public UniteStyleDefinePane(WCardTagLayout tagLayout) { |
||||
super(tagLayout); |
||||
} |
||||
|
||||
@Override |
||||
protected void createBuiltinConfPane(JPanel centerPane) { |
||||
// ignore builtin conf pane
|
||||
} |
||||
|
||||
@Override |
||||
protected void createExtraConfPane(JPanel centerPane) { |
||||
UITitleSplitLine paddingSplit = new UITitleSplitLine(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Mobile_Tab_Button_Padding"), SPLIT_LINE_WIDTH); |
||||
paddingSplit.setPreferredSize(new Dimension(SPLIT_LINE_WIDTH, SPLIT_LINE_HEIGHT)); |
||||
centerPane.add(paddingSplit); |
||||
centerPane.add(this.createPaddingConfPane()); |
||||
|
||||
UITitleSplitLine backgroundSplit = new UITitleSplitLine(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Mobile_Tab_Button_Background"), SPLIT_LINE_WIDTH); |
||||
backgroundSplit.setPreferredSize(new Dimension(SPLIT_LINE_WIDTH, SPLIT_LINE_HEIGHT)); |
||||
centerPane.add(backgroundSplit); |
||||
centerPane.add(this.createBackgroundColorConfPanel()); |
||||
|
||||
UITitleSplitLine borderSplit = new UITitleSplitLine(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Border"), SPLIT_LINE_WIDTH); |
||||
borderSplit.setPreferredSize(new Dimension(SPLIT_LINE_WIDTH, SPLIT_LINE_HEIGHT)); |
||||
centerPane.add(borderSplit); |
||||
centerPane.add(this.createBorderConfPanel()); |
||||
|
||||
UITitleSplitLine fontSplit = new UITitleSplitLine(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Mobile_Tab_Char"), SPLIT_LINE_WIDTH); |
||||
fontSplit.setPreferredSize(new Dimension(SPLIT_LINE_WIDTH, SPLIT_LINE_HEIGHT)); |
||||
centerPane.add(fontSplit); |
||||
centerPane.add(this.createFontConfPanel()); |
||||
} |
||||
|
||||
private JPanel createPaddingConfPane() { |
||||
|
||||
this.paddingLeftSpinner = new UnsignedIntUISpinner(0, Integer.MAX_VALUE, 1, UniteStyle.DEFAULT_PADDING_LEFT); |
||||
this.paddingLeftSpinner.setPreferredSize(new Dimension(62, LINE_COMPONENT_HEIGHT)); |
||||
this.paddingRightSpinner = new UnsignedIntUISpinner(0, Integer.MAX_VALUE, 1, UniteStyle.DEFAULT_PADDING_RIGHT); |
||||
this.paddingRightSpinner.setPreferredSize(new Dimension(62, LINE_COMPONENT_HEIGHT)); |
||||
|
||||
UILabel paddingLeftLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Left") + ":", SwingConstants.RIGHT); |
||||
paddingLeftLabel.setPreferredSize(new Dimension(LABEL_WIDTH, LINE_COMPONENT_HEIGHT)); |
||||
UILabel paddingRightLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Right") + ":", SwingConstants.RIGHT); |
||||
paddingLeftLabel.setPreferredSize(new Dimension(LABEL_WIDTH, LINE_COMPONENT_HEIGHT)); |
||||
|
||||
JPanel paddingPanel = TableLayoutHelper.createGapTableLayoutPane(new Component[][]{new Component[]{ |
||||
paddingLeftLabel, paddingLeftSpinner, paddingRightLabel,paddingRightSpinner |
||||
}}, TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_L1, LayoutConstants.VGAP_MEDIUM); |
||||
paddingPanel.setBorder(BorderFactory.createEmptyBorder(0, 0, 5, 20)); |
||||
|
||||
return paddingPanel; |
||||
} |
||||
|
||||
private JPanel createBackgroundColorConfPanel() { |
||||
this.initialBackgroundColorBox = new NewColorSelectBox(LINE_COMPONENT_WIDTH); |
||||
this.initialBackgroundColorBox.setPreferredSize(new Dimension(LINE_COMPONENT_WIDTH, LINE_COMPONENT_HEIGHT)); |
||||
this.selectedBackgroundColorBox = new NewColorSelectBox(LINE_COMPONENT_WIDTH); |
||||
this.selectedBackgroundColorBox.setPreferredSize(new Dimension(LINE_COMPONENT_WIDTH, LINE_COMPONENT_HEIGHT)); |
||||
|
||||
UILabel initialBackgroundColorLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Mobile_Init_Fill") + ":", SwingConstants.RIGHT); |
||||
initialBackgroundColorLabel.setPreferredSize(new Dimension(LABEL_WIDTH, LINE_COMPONENT_HEIGHT)); |
||||
UILabel selectedBackgroundColorLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Mobile_Select_Fill") + ":", SwingConstants.RIGHT); |
||||
selectedBackgroundColorLabel.setPreferredSize(new Dimension(LABEL_WIDTH, LINE_COMPONENT_HEIGHT)); |
||||
|
||||
JPanel backgroundColorPanel = TableLayoutHelper.createGapTableLayoutPane(new Component[][]{ |
||||
new Component[]{ initialBackgroundColorLabel, initialBackgroundColorBox }, |
||||
new Component[]{ selectedBackgroundColorLabel, selectedBackgroundColorBox } |
||||
}, TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_L1, LayoutConstants.VGAP_MEDIUM); |
||||
backgroundColorPanel.setBorder(BorderFactory.createEmptyBorder(0, 0, 5, 20)); |
||||
|
||||
return backgroundColorPanel; |
||||
} |
||||
|
||||
private JPanel createBorderConfPanel() { |
||||
this.borderWidthComboBox = new LineComboBox(CoreConstants.UNDERLINE_STYLE_ARRAY); |
||||
this.borderWidthComboBox.setPreferredSize(new Dimension(LINE_COMPONENT_WIDTH, LINE_COMPONENT_HEIGHT)); |
||||
this.borderColorBox = new ColorSelectBox(LINE_COMPONENT_WIDTH); |
||||
this.borderColorBox.setPreferredSize(new Dimension(LINE_COMPONENT_WIDTH, LINE_COMPONENT_HEIGHT)); |
||||
this.borderRadiusSpinner = new UnsignedIntUISpinner(0, Integer.MAX_VALUE, 1, UniteStyle.DEFAULT_BORDER_RADIUS); |
||||
this.borderRadiusSpinner.setPreferredSize(new Dimension(LINE_COMPONENT_WIDTH, LINE_COMPONENT_HEIGHT)); |
||||
|
||||
UILabel borderSizeLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_FRFont_Line_Style") + ":", SwingConstants.RIGHT); |
||||
borderSizeLabel.setPreferredSize(new Dimension(LABEL_WIDTH, LINE_COMPONENT_HEIGHT)); |
||||
UILabel borderColorLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Colors") + ":", SwingConstants.RIGHT); |
||||
borderColorLabel.setPreferredSize(new Dimension(LABEL_WIDTH, LINE_COMPONENT_HEIGHT)); |
||||
UILabel borderRadiusLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Radius") + ":", SwingConstants.RIGHT); |
||||
borderRadiusLabel.setPreferredSize(new Dimension(LABEL_WIDTH, LINE_COMPONENT_HEIGHT)); |
||||
|
||||
JPanel borderPanel = TableLayoutHelper.createGapTableLayoutPane(new Component[][]{ |
||||
new Component[]{ borderSizeLabel, borderWidthComboBox}, |
||||
new Component[]{ borderColorLabel, borderColorBox }, |
||||
new Component[]{ borderRadiusLabel, borderRadiusSpinner } |
||||
}, TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_L1, LayoutConstants.VGAP_MEDIUM); |
||||
borderPanel.setBorder(BorderFactory.createEmptyBorder(0, 0, 5, 20)); |
||||
|
||||
return borderPanel; |
||||
} |
||||
|
||||
private JPanel createFontConfPanel() { |
||||
this.tabFontConfPane = new MobileTabFontConfPane(); |
||||
this.selectedFontColorButton = new UIColorButton(); |
||||
this.selectedFontColorButton.setPreferredSize(new Dimension(TOGGLE_BUTTON_WIDTH, LINE_COMPONENT_HEIGHT)); |
||||
JPanel selectedFontColorPanel = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); |
||||
selectedFontColorPanel.add(this.selectedFontColorButton); |
||||
|
||||
UILabel initialFontLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Mobile_Tab_Init_Char") + ":", SwingConstants.RIGHT); |
||||
initialFontLabel.setPreferredSize(new Dimension(LABEL_WIDTH, LINE_COMPONENT_HEIGHT)); |
||||
UILabel selectedFontLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Mobile_Tab_Select_Char") + ":", SwingConstants.RIGHT); |
||||
selectedFontLabel.setPreferredSize(new Dimension(LABEL_WIDTH, LINE_COMPONENT_HEIGHT)); |
||||
|
||||
JPanel fontPanel = TableLayoutHelper.createGapTableLayoutPane(new Component[][]{ |
||||
new Component[]{ initialFontLabel, tabFontConfPane }, |
||||
new Component[]{ selectedFontLabel, selectedFontColorPanel } |
||||
}, TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_L1, LayoutConstants.VGAP_MEDIUM); |
||||
fontPanel.setBorder(BorderFactory.createEmptyBorder(0, 0, 5, 20)); |
||||
|
||||
return fontPanel; |
||||
} |
||||
|
||||
@Override |
||||
protected void initDefaultConfig() { |
||||
this.paddingLeftSpinner.setValue(UniteStyle.DEFAULT_PADDING_LEFT); |
||||
this.paddingRightSpinner.setValue(UniteStyle.DEFAULT_PADDING_RIGHT); |
||||
|
||||
this.initialBackgroundColorBox.setSelectObject(UniteStyle.DEFAULT_INITIAL_BACKGROUND_COLOR); |
||||
this.selectedBackgroundColorBox.setSelectObject(UniteStyle.DEFAULT_SELECTED_BACKGROUND_COLOR); |
||||
|
||||
this.borderWidthComboBox.setSelectedLineStyle(UniteStyle.DEFAULT_BORDER_LINE.getLineStyle()); |
||||
this.borderColorBox.setSelectObject(UniteStyle.DEFAULT_BORDER_LINE.getColor()); |
||||
this.borderRadiusSpinner.setValue(UniteStyle.DEFAULT_BORDER_RADIUS); |
||||
|
||||
this.tabFontConfPane.populate(UniteStyle.DEFAULT_TAB_FONT.getFont()); |
||||
this.selectedFontColorButton.setColor(UniteStyle.DEFAULT_TAB_FONT.getSelectColor()); |
||||
} |
||||
|
||||
@Override |
||||
protected MobileTemplatePreviewPane createPreviewPane() { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
protected MobileTemplateStyle getDefaultTemplateStyle() { |
||||
return new UniteStyle(); |
||||
} |
||||
|
||||
@Override |
||||
public void populateSubStyle(MobileTemplateStyle ob) { |
||||
UniteStyle style = (UniteStyle) ob; |
||||
this.paddingLeftSpinner.setValue(style.getPaddingLeft()); |
||||
this.paddingRightSpinner.setValue(style.getPaddingRight()); |
||||
|
||||
this.initialBackgroundColorBox.setSelectObject(style.getInitialColor()); |
||||
this.selectedBackgroundColorBox.setSelectObject(style.getSelectColor()); |
||||
|
||||
this.borderWidthComboBox.setSelectedLineStyle(style.getBorderLineStyle()); |
||||
this.borderColorBox.setSelectObject(style.getBorderColor()); |
||||
this.borderRadiusSpinner.setValue(style.getBorderRadius()); |
||||
|
||||
this.tabFontConfPane.populate(style.getTabFontConfig().getFont()); |
||||
this.selectedFontColorButton.setColor(style.getTabFontConfig().getSelectColor()); |
||||
} |
||||
|
||||
@Override |
||||
public MobileTemplateStyle updateSubStyle() { |
||||
UniteStyle style = new UniteStyle(); |
||||
style.setPaddingLeft((int) this.paddingLeftSpinner.getValue()); |
||||
style.setPaddingRight((int) this.paddingRightSpinner.getValue()); |
||||
|
||||
style.setInitialColor(this.initialBackgroundColorBox.getSelectObject()); |
||||
style.setSelectColor(this.selectedBackgroundColorBox.getSelectObject()); |
||||
|
||||
style.setBorderLineStyle(this.borderWidthComboBox.getSelectedLineStyle()); |
||||
style.setBorderColor(this.borderColorBox.getSelectObject()); |
||||
style.setBorderRadius((int) this.borderRadiusSpinner.getValue()); |
||||
|
||||
TabFontConfig config = new TabFontConfig(); |
||||
config.setFont(this.tabFontConfPane.update()); |
||||
config.setSelectColor(this.selectedFontColorButton.getColor()); |
||||
style.setTabFontConfig(config); |
||||
|
||||
return style; |
||||
} |
||||
|
||||
@Override |
||||
protected String title4PopupWindow() { |
||||
return null; |
||||
} |
||||
} |
@ -0,0 +1,200 @@
|
||||
package com.fr.design.menu; |
||||
|
||||
import com.fr.design.gui.imenu.UIMenu; |
||||
import com.fr.design.gui.imenu.UIScrollMenu; |
||||
import com.fr.design.notification.SnapChat; |
||||
import com.fr.design.notification.SnapChatConfig; |
||||
import com.fr.design.notification.SnapChatKey; |
||||
|
||||
import javax.swing.JMenu; |
||||
import javax.swing.event.MenuEvent; |
||||
import javax.swing.event.MenuListener; |
||||
import java.awt.Color; |
||||
import java.awt.Graphics2D; |
||||
import java.awt.Image; |
||||
import java.awt.geom.Ellipse2D; |
||||
import java.awt.image.BufferedImage; |
||||
|
||||
/** |
||||
* created by Harrison on 2020/03/16 |
||||
**/ |
||||
public class SnapChatMenuDef extends MenuDef implements SnapChat { |
||||
|
||||
private SnapChatKey uniqueKey; |
||||
private SnapChatMenuUI menuUI = new SnapChatMenuUI(this); |
||||
|
||||
public SnapChatMenuDef(String name, SnapChatKey uniqueKey) { |
||||
super(name); |
||||
this.uniqueKey = uniqueKey; |
||||
} |
||||
|
||||
public SnapChatMenuDef(Boolean rePaint, SnapChatKey uniqueKey) { |
||||
super(rePaint); |
||||
this.uniqueKey = uniqueKey; |
||||
} |
||||
|
||||
public SnapChatMenuDef(String name, char mnemonic, SnapChatKey uniqueKey) { |
||||
super(name, mnemonic); |
||||
this.uniqueKey = uniqueKey; |
||||
} |
||||
|
||||
@Override |
||||
public boolean hasRead() { |
||||
|
||||
String calcKey = calcKey(); |
||||
Boolean val = SnapChatConfig.getInstance().hasRead(calcKey); |
||||
// 默认读过了。
|
||||
return val == null ? defaultStatus() : val; |
||||
} |
||||
|
||||
@Override |
||||
public void markRead() { |
||||
|
||||
String calcKey = calcKey(); |
||||
SnapChatConfig.getInstance().markRead(calcKey); |
||||
} |
||||
|
||||
@Override |
||||
public boolean defaultStatus() { |
||||
|
||||
return true; |
||||
} |
||||
|
||||
@Override |
||||
public void addShortCut(ShortCut shortCut) { |
||||
|
||||
addSnapChatNotification(shortCut); |
||||
super.addShortCut(shortCut); |
||||
} |
||||
|
||||
@Override |
||||
public void insertShortCut(int index, ShortCut shortCut) { |
||||
|
||||
addSnapChatNotification(shortCut); |
||||
super.insertShortCut(index, shortCut); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public SnapChatKey key() { |
||||
|
||||
return this.uniqueKey; |
||||
} |
||||
|
||||
@Override |
||||
protected MenuListener createMenuListener() { |
||||
|
||||
return new SnapChatMenuListener(); |
||||
} |
||||
|
||||
/** |
||||
* 添加提醒 |
||||
* |
||||
* @param shortCut 快捷方式 |
||||
*/ |
||||
private void addSnapChatNotification(ShortCut shortCut) { |
||||
|
||||
if (shortCut instanceof SnapChatUpdateAction) { |
||||
SnapChatUpdateAction action = (SnapChatUpdateAction) shortCut; |
||||
if (!action.hasRead()) { |
||||
String calcKey = calcKey(); |
||||
SnapChatConfig.getInstance().resetRead(calcKey); |
||||
} |
||||
} |
||||
} |
||||
|
||||
private String calcKey() { |
||||
|
||||
return key().calc(); |
||||
} |
||||
|
||||
@Override |
||||
protected UIMenu createJMenu0() { |
||||
|
||||
UIMenu createdJMenu; |
||||
if (hasScrollSubMenu) { |
||||
createdJMenu = new SnapChatUIScrollMenu(this.getName()); |
||||
} else if (isHeadMenu){ |
||||
createdJMenu = new SnapChatUIHeadMenu(this.getName()); |
||||
} else { |
||||
createdJMenu = new SnapChatUIMenu(this.getName()); |
||||
} |
||||
return createdJMenu; |
||||
} |
||||
|
||||
private class SnapChatMenuListener implements MenuListener { |
||||
|
||||
@Override |
||||
public void menuSelected(MenuEvent e) { |
||||
|
||||
markRead(); |
||||
Object source = e.getSource(); |
||||
if (!(source instanceof JMenu)) { |
||||
return; |
||||
} |
||||
updateMenu(); |
||||
} |
||||
|
||||
@Override |
||||
public void menuDeselected(MenuEvent e) { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void menuCanceled(MenuEvent e) { |
||||
|
||||
} |
||||
} |
||||
|
||||
private class SnapChatUIScrollMenu extends UIScrollMenu { |
||||
|
||||
public SnapChatUIScrollMenu(String s) { |
||||
super(s); |
||||
} |
||||
|
||||
@Override |
||||
public void updateUI() { |
||||
setUI(menuUI); |
||||
} |
||||
} |
||||
|
||||
private class SnapChatUIMenu extends UIMenu { |
||||
|
||||
public SnapChatUIMenu(String name) { |
||||
|
||||
super(name); |
||||
} |
||||
|
||||
@Override |
||||
public void updateUI() { |
||||
|
||||
setUI(menuUI); |
||||
} |
||||
} |
||||
|
||||
private class SnapChatUIHeadMenu extends UIMenu { |
||||
|
||||
public SnapChatUIHeadMenu(String name) { |
||||
|
||||
super(name); |
||||
} |
||||
|
||||
@Override |
||||
public void updateUI() { |
||||
|
||||
setUI(menuUI); |
||||
} |
||||
} |
||||
|
||||
public static void main(String[] args) { |
||||
|
||||
BufferedImage image = new BufferedImage(16, 16, Image.SCALE_DEFAULT); |
||||
Graphics2D g2d = image.createGraphics(); |
||||
g2d.setColor(Color.green); |
||||
Ellipse2D.Double shape = |
||||
new Ellipse2D.Double(2, 2, 1, 1); |
||||
g2d.fill(shape); |
||||
g2d.draw(shape); |
||||
System.out.println(); |
||||
} |
||||
} |
@ -0,0 +1,31 @@
|
||||
package com.fr.design.menu; |
||||
|
||||
import com.fr.design.gui.imenu.UIMenuItemUI; |
||||
|
||||
import javax.swing.JMenuItem; |
||||
import java.awt.Graphics; |
||||
import java.awt.Rectangle; |
||||
|
||||
/** |
||||
* created by Harrison on 2020/03/22 |
||||
**/ |
||||
class SnapChatMenuItemUI extends UIMenuItemUI { |
||||
|
||||
private final SnapChatUpdateAction snapChatUpdateAction; |
||||
|
||||
public SnapChatMenuItemUI(SnapChatUpdateAction snapChatUpdateAction) { |
||||
|
||||
this.snapChatUpdateAction = snapChatUpdateAction; |
||||
} |
||||
|
||||
@Override |
||||
protected void paintText(Graphics g, JMenuItem menuItem, Rectangle textRect, String text) { |
||||
|
||||
super.paintText(g, menuItem, textRect, text); |
||||
|
||||
if (!snapChatUpdateAction.hasRead()) { |
||||
SnapChatUtil.paintSnapChat(g, textRect); |
||||
} |
||||
} |
||||
|
||||
} |
@ -0,0 +1,29 @@
|
||||
package com.fr.design.menu; |
||||
|
||||
import com.fr.design.gui.imenu.UIMenuUI; |
||||
|
||||
import javax.swing.JMenuItem; |
||||
import java.awt.Graphics; |
||||
import java.awt.Rectangle; |
||||
|
||||
/** |
||||
* created by Harrison on 2020/03/22 |
||||
**/ |
||||
public class SnapChatMenuUI extends UIMenuUI { |
||||
|
||||
private SnapChatMenuDef menuDef; |
||||
|
||||
public SnapChatMenuUI(SnapChatMenuDef menuDef) { |
||||
this.menuDef = menuDef; |
||||
} |
||||
|
||||
@Override |
||||
protected void paintText(Graphics g, JMenuItem menuItem, Rectangle textRect, String text) { |
||||
|
||||
super.paintText(g, menuItem, textRect, text); |
||||
|
||||
if (!menuDef.hasRead()) { |
||||
SnapChatUtil.paintSnapChat(g, textRect); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,79 @@
|
||||
package com.fr.design.menu; |
||||
|
||||
import com.fr.design.actions.UpdateAction; |
||||
import com.fr.design.gui.imenu.UIMenuItem; |
||||
import com.fr.design.notification.SnapChat; |
||||
import com.fr.design.notification.SnapChatConfig; |
||||
import com.fr.design.notification.SnapChatKey; |
||||
|
||||
import java.awt.event.ActionEvent; |
||||
|
||||
/** |
||||
* created by Harrison on 2020/03/22 |
||||
**/ |
||||
public abstract class SnapChatUpdateAction extends UpdateAction implements SnapChat { |
||||
|
||||
private SnapChatKey uniqueKey; |
||||
|
||||
public SnapChatUpdateAction(SnapChatKey uniqueKey) { |
||||
this.uniqueKey = uniqueKey; |
||||
} |
||||
|
||||
@Override |
||||
public final void actionPerformed(ActionEvent e) { |
||||
|
||||
markRead(); |
||||
actionPerformed0(e); |
||||
} |
||||
|
||||
protected abstract void actionPerformed0(ActionEvent e); |
||||
|
||||
@Override |
||||
public boolean hasRead() { |
||||
|
||||
String calcKey = calcKey(); |
||||
Boolean val = SnapChatConfig.getInstance().hasRead(calcKey); |
||||
return val == null ? defaultStatus() : val; |
||||
} |
||||
|
||||
@Override |
||||
public void markRead() { |
||||
|
||||
String calcKey = calcKey(); |
||||
SnapChatConfig.getInstance().markRead(calcKey); |
||||
} |
||||
|
||||
@Override |
||||
public boolean defaultStatus() { |
||||
|
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public SnapChatKey key() { |
||||
|
||||
return this.uniqueKey; |
||||
} |
||||
|
||||
private String calcKey() { |
||||
|
||||
return key().calc(); |
||||
} |
||||
|
||||
@Override |
||||
public UIMenuItem createMenuItem() { |
||||
|
||||
Object object = this.getValue(UIMenuItem.class.getName()); |
||||
if (object == null && !(object instanceof UIMenuItem)) { |
||||
UIMenuItem menuItem = new UIMenuItem(this); |
||||
// 设置名字用作单元测
|
||||
menuItem.setName(getName()); |
||||
menuItem.setUI(new SnapChatMenuItemUI(this)); |
||||
object = menuItem; |
||||
|
||||
this.putValue(UIMenuItem.class.getName(), object); |
||||
} |
||||
return (UIMenuItem) object; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,33 @@
|
||||
package com.fr.design.menu; |
||||
|
||||
import java.awt.Color; |
||||
import java.awt.Graphics; |
||||
import java.awt.Graphics2D; |
||||
import java.awt.Rectangle; |
||||
import java.awt.geom.Ellipse2D; |
||||
|
||||
/** |
||||
* created by Harrison on 2020/03/22 |
||||
**/ |
||||
public class SnapChatUtil { |
||||
|
||||
public static void paintSnapChat(Graphics g, Rectangle textRect) { |
||||
|
||||
Color oldColor = g.getColor(); |
||||
|
||||
double x = textRect.getWidth(); |
||||
x += textRect.getX(); |
||||
x += 2; |
||||
|
||||
double y = textRect.getY(); |
||||
|
||||
Graphics2D g2d = (Graphics2D) g; |
||||
g2d.setColor(Color.red); |
||||
Ellipse2D.Double shape = |
||||
new Ellipse2D.Double(x, y, 4, 4); |
||||
g2d.fill(shape); |
||||
g2d.draw(shape); |
||||
|
||||
g2d.setColor(oldColor); |
||||
} |
||||
} |
@ -0,0 +1,35 @@
|
||||
package com.fr.design.notification; |
||||
|
||||
/** |
||||
* 阅后即焚的消息提醒 |
||||
* |
||||
* created by Harrison on 2020/03/16 |
||||
**/ |
||||
public interface SnapChat { |
||||
|
||||
/** |
||||
* 默认状态 |
||||
* |
||||
* @return 默认状态 |
||||
*/ |
||||
boolean defaultStatus(); |
||||
|
||||
/** |
||||
* 已读 |
||||
* |
||||
* @return 是否为已读 |
||||
*/ |
||||
boolean hasRead(); |
||||
|
||||
/** |
||||
* 标记为已读 |
||||
*/ |
||||
void markRead(); |
||||
|
||||
/** |
||||
* 独一无二的标志 |
||||
* |
||||
* @return 字符标志 |
||||
*/ |
||||
SnapChatKey key(); |
||||
} |
@ -0,0 +1,38 @@
|
||||
package com.fr.design.notification; |
||||
|
||||
import com.fr.stable.CommonUtils; |
||||
|
||||
/** |
||||
* created by Harrison on 2020/03/16 |
||||
**/ |
||||
public abstract class SnapChatAllTypes { |
||||
|
||||
public enum Menu implements SnapChatKey { |
||||
|
||||
/** |
||||
* 社区按钮 |
||||
*/ |
||||
BBS("BBS"); |
||||
|
||||
private static final String SIGN = "0001"; |
||||
|
||||
private String key; |
||||
|
||||
Menu(String key) { |
||||
this.key = key; |
||||
} |
||||
|
||||
public String getKey() { |
||||
return key; |
||||
} |
||||
|
||||
@Override |
||||
public String calc() { |
||||
|
||||
return CommonUtils.join( |
||||
new String[]{SIGN, getKey()}, "-" |
||||
); |
||||
} |
||||
} |
||||
|
||||
} |
@ -0,0 +1,93 @@
|
||||
package com.fr.design.notification; |
||||
|
||||
import com.fr.stable.StringUtils; |
||||
import com.fr.stable.xml.XMLPrintWriter; |
||||
import com.fr.stable.xml.XMLReadable; |
||||
import com.fr.stable.xml.XMLable; |
||||
import com.fr.stable.xml.XMLableReader; |
||||
|
||||
import java.util.HashMap; |
||||
import java.util.Map; |
||||
|
||||
/** |
||||
* created by Harrison on 2020/03/16 |
||||
**/ |
||||
@SuppressWarnings("unchecked") |
||||
public class SnapChatConfig implements XMLable { |
||||
|
||||
public static final String XML_TAG = "SnapChatConfig"; |
||||
|
||||
/** |
||||
* 已经阅读过的属性 |
||||
*/ |
||||
private Map<String, Boolean> markReadMap = new HashMap<>(8); |
||||
|
||||
private static final SnapChatConfig INSTANCE = new SnapChatConfig(); |
||||
|
||||
public static SnapChatConfig getInstance() { |
||||
return INSTANCE; |
||||
} |
||||
|
||||
public Boolean hasRead(String key) { |
||||
|
||||
Map<String, Boolean> map = markReadMap; |
||||
return map.get(key); |
||||
} |
||||
|
||||
public void markRead(String key) { |
||||
|
||||
markReadMap.put(key, Boolean.TRUE); |
||||
} |
||||
|
||||
public void resetRead(String key) { |
||||
|
||||
markReadMap.put(key, Boolean.FALSE); |
||||
} |
||||
|
||||
@Override |
||||
public void readXML(XMLableReader reader) { |
||||
|
||||
if (reader.isChildNode()) { |
||||
if ("item".equals(reader.getTagName())) { |
||||
String tmpVal = reader.getElementValue(); |
||||
Boolean markRead = Boolean.valueOf(tmpVal); |
||||
markReadMap.put(reader.getAttrAsString("key", StringUtils.EMPTY), markRead); |
||||
} |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public void writeXML(XMLPrintWriter writer) { |
||||
|
||||
writer.startTAG(XML_TAG); |
||||
writeMarkReadMapXML(writer); |
||||
writer.end(); |
||||
} |
||||
|
||||
private void readMarkReadMapXML(XMLableReader reader) { |
||||
|
||||
reader.readXMLObject(new XMLReadable() { |
||||
@Override |
||||
public void readXML(XMLableReader reader) { |
||||
} |
||||
}); |
||||
} |
||||
|
||||
/** |
||||
* 写入map |
||||
*/ |
||||
private void writeMarkReadMapXML(XMLPrintWriter writer) { |
||||
|
||||
writer.startTAG("MarkReadMap"); |
||||
for (Map.Entry<String, Boolean> item : markReadMap.entrySet()) { |
||||
writer.startTAG("item").attr("key", item.getKey()).textNode(item.getValue().toString()).end(); |
||||
} |
||||
writer.end(); |
||||
} |
||||
|
||||
@Override |
||||
public Object clone() throws CloneNotSupportedException { |
||||
|
||||
return super.clone(); |
||||
} |
||||
} |
@ -0,0 +1,9 @@
|
||||
package com.fr.design.notification; |
||||
|
||||
/** |
||||
* created by Harrison on 2020/03/16 |
||||
**/ |
||||
public interface SnapChatKey { |
||||
|
||||
String calc(); |
||||
} |
@ -0,0 +1,73 @@
|
||||
package com.fr.design.unit; |
||||
|
||||
import com.fr.design.ExtraDesignClassManager; |
||||
import com.fr.design.fun.ReportLengthUNITProvider; |
||||
import com.fr.design.unit.impl.CMReportLengthUNIT; |
||||
import com.fr.design.unit.impl.INCHReportLengthUNIT; |
||||
import com.fr.design.unit.impl.MMReportLengthUNIT; |
||||
import com.fr.design.unit.impl.PTReportLengthUNIT; |
||||
import com.fr.general.GeneralContext; |
||||
import com.fr.plugin.context.PluginContext; |
||||
import com.fr.plugin.manage.PluginFilter; |
||||
import com.fr.plugin.observer.PluginEvent; |
||||
import com.fr.plugin.observer.PluginEventListener; |
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
import java.util.Set; |
||||
|
||||
/** |
||||
* Created by kerry on 2020-04-09 |
||||
*/ |
||||
public class UnitConvertUtil { |
||||
private static List<ReportLengthUNITProvider> lengthUNITList = new ArrayList<ReportLengthUNITProvider>(); |
||||
|
||||
static { |
||||
GeneralContext.listenPluginRunningChanged(new PluginEventListener() { |
||||
@Override |
||||
public void on(PluginEvent pluginEvent) { |
||||
initSupportedReportLengthUNIT(); |
||||
} |
||||
}, new PluginFilter() { |
||||
@Override |
||||
public boolean accept(PluginContext pluginContext) { |
||||
return pluginContext.contain(ReportLengthUNITProvider.MARK_STRING); |
||||
} |
||||
}); |
||||
|
||||
initSupportedReportLengthUNIT(); |
||||
} |
||||
|
||||
private static void initSupportedReportLengthUNIT(){ |
||||
lengthUNITList.clear(); |
||||
lengthUNITList.add(new MMReportLengthUNIT()); |
||||
lengthUNITList.add(new CMReportLengthUNIT()); |
||||
lengthUNITList.add(new INCHReportLengthUNIT()); |
||||
lengthUNITList.add(new PTReportLengthUNIT()); |
||||
Set<ReportLengthUNITProvider> providers = ExtraDesignClassManager.getInstance().getArray(ReportLengthUNITProvider.MARK_STRING); |
||||
for (ReportLengthUNITProvider provider : providers) { |
||||
lengthUNITList.add(provider); |
||||
} |
||||
} |
||||
|
||||
private UnitConvertUtil() { |
||||
|
||||
} |
||||
|
||||
|
||||
public static ReportLengthUNITProvider parseLengthUNIT(int unitType) { |
||||
for (ReportLengthUNITProvider lengthUNIT : lengthUNITList) { |
||||
if (unitType == lengthUNIT.unitType()) { |
||||
return lengthUNIT; |
||||
} |
||||
} |
||||
return new MMReportLengthUNIT(); |
||||
} |
||||
|
||||
public static String[] getUnitItems() { |
||||
String[] unitItems = new String[lengthUNITList.size()]; |
||||
for (int i = 0; i < lengthUNITList.size(); i++) { |
||||
unitItems[i] = lengthUNITList.get(i).unitText(); |
||||
} |
||||
return unitItems; |
||||
} |
||||
} |
@ -0,0 +1,32 @@
|
||||
package com.fr.design.unit.impl; |
||||
|
||||
import com.fr.design.fun.impl.AbstractReportLengthUNITProvider; |
||||
import com.fr.stable.Constants; |
||||
import com.fr.stable.unit.CM; |
||||
import com.fr.stable.unit.UNIT; |
||||
|
||||
/** |
||||
* Created by kerry on 2020-04-09 |
||||
*/ |
||||
public class CMReportLengthUNIT extends AbstractReportLengthUNITProvider { |
||||
@Override |
||||
public String unitText() { |
||||
return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Unit_CM"); |
||||
} |
||||
|
||||
@Override |
||||
public int unitType() { |
||||
return Constants.UNIT_CM; |
||||
} |
||||
|
||||
@Override |
||||
public float unit2Value4Scale(UNIT value) { |
||||
return value.toCMValue4Scale2(); |
||||
} |
||||
|
||||
@Override |
||||
public UNIT float2UNIT(float value) { |
||||
return new CM(value); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,31 @@
|
||||
package com.fr.design.unit.impl; |
||||
|
||||
import com.fr.design.fun.impl.AbstractReportLengthUNITProvider; |
||||
import com.fr.stable.Constants; |
||||
import com.fr.stable.unit.INCH; |
||||
import com.fr.stable.unit.UNIT; |
||||
|
||||
/** |
||||
* Created by kerry on 2020-04-09 |
||||
*/ |
||||
public class INCHReportLengthUNIT extends AbstractReportLengthUNITProvider { |
||||
@Override |
||||
public String unitText() { |
||||
return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Unit_INCH"); |
||||
} |
||||
|
||||
@Override |
||||
public int unitType() { |
||||
return Constants.UNIT_INCH; |
||||
} |
||||
|
||||
@Override |
||||
public float unit2Value4Scale(UNIT value) { |
||||
return value.toINCHValue4Scale3(); |
||||
} |
||||
|
||||
@Override |
||||
public UNIT float2UNIT(float value) { |
||||
return new INCH(value); |
||||
} |
||||
} |
@ -0,0 +1,31 @@
|
||||
package com.fr.design.unit.impl; |
||||
|
||||
import com.fr.design.fun.impl.AbstractReportLengthUNITProvider; |
||||
import com.fr.stable.Constants; |
||||
import com.fr.stable.unit.MM; |
||||
import com.fr.stable.unit.UNIT; |
||||
|
||||
/** |
||||
* Created by kerry on 2020-04-09 |
||||
*/ |
||||
public class MMReportLengthUNIT extends AbstractReportLengthUNITProvider { |
||||
@Override |
||||
public String unitText() { |
||||
return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Unit_MM"); |
||||
} |
||||
|
||||
@Override |
||||
public int unitType() { |
||||
return Constants.UNIT_MM; |
||||
} |
||||
|
||||
@Override |
||||
public float unit2Value4Scale(UNIT value) { |
||||
return value.toMMValue4Scale2(); |
||||
} |
||||
|
||||
@Override |
||||
public UNIT float2UNIT(float value) { |
||||
return new MM(value); |
||||
} |
||||
} |
@ -0,0 +1,31 @@
|
||||
package com.fr.design.unit.impl; |
||||
|
||||
import com.fr.design.fun.impl.AbstractReportLengthUNITProvider; |
||||
import com.fr.stable.Constants; |
||||
import com.fr.stable.unit.PT; |
||||
import com.fr.stable.unit.UNIT; |
||||
|
||||
/** |
||||
* Created by kerry on 2020-04-09 |
||||
*/ |
||||
public class PTReportLengthUNIT extends AbstractReportLengthUNITProvider { |
||||
@Override |
||||
public String unitText() { |
||||
return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Unit_PT_Duplicate"); |
||||
} |
||||
|
||||
@Override |
||||
public int unitType() { |
||||
return Constants.UNIT_PT; |
||||
} |
||||
|
||||
@Override |
||||
public float unit2Value4Scale(UNIT value) { |
||||
return value.toPTValue4Scale2(); |
||||
} |
||||
|
||||
@Override |
||||
public UNIT float2UNIT(float value) { |
||||
return new PT(value); |
||||
} |
||||
} |
@ -0,0 +1,106 @@
|
||||
package com.fr.design.menu; |
||||
|
||||
import com.fr.config.dao.DaoContext; |
||||
import com.fr.config.dao.impl.LocalClassHelperDao; |
||||
import com.fr.config.dao.impl.LocalEntityDao; |
||||
import com.fr.config.dao.impl.LocalXmlEntityDao; |
||||
import com.fr.design.actions.UpdateAction; |
||||
import com.fr.design.notification.SnapChatAllTypes; |
||||
import com.fr.design.notification.SnapChatConfig; |
||||
import com.fr.stable.xml.XMLableReader; |
||||
import com.fr.store.StateHubManager; |
||||
import com.fr.store.impl.MemoryLock; |
||||
import com.fr.store.impl.MemoryStore; |
||||
import com.fr.transaction.Configurations; |
||||
import com.fr.transaction.LocalConfigurationHelper; |
||||
import org.easymock.EasyMock; |
||||
import org.junit.Assert; |
||||
import org.junit.Before; |
||||
import org.junit.Test; |
||||
import org.junit.runner.RunWith; |
||||
import org.powermock.api.easymock.PowerMock; |
||||
import org.powermock.api.support.membermodification.MemberMatcher; |
||||
import org.powermock.core.classloader.annotations.PowerMockIgnore; |
||||
import org.powermock.core.classloader.annotations.PrepareForTest; |
||||
import org.powermock.modules.junit4.PowerMockRunner; |
||||
import org.powermock.reflect.Whitebox; |
||||
|
||||
import java.awt.event.ActionEvent; |
||||
import java.util.HashMap; |
||||
|
||||
@RunWith(PowerMockRunner.class) |
||||
@PrepareForTest({SnapChatConfig.class, SnapChatUpdateAction.class}) |
||||
@PowerMockIgnore({"javax.crypto.*","javax.net.ssl.*","sun.security.ssl.*","com.sun.*"}) |
||||
public class SnapChatMenuDefTest { |
||||
|
||||
@Before |
||||
public void before() throws Exception { |
||||
|
||||
DaoContext.setXmlEntityDao(new LocalXmlEntityDao()); |
||||
DaoContext.setClassHelperDao(new LocalClassHelperDao()); |
||||
DaoContext.setEntityDao(new LocalEntityDao()); |
||||
StateHubManager.setLock(new MemoryLock()); |
||||
StateHubManager.setStorage(new MemoryStore()); |
||||
Configurations.setHelper(new LocalConfigurationHelper()); |
||||
} |
||||
|
||||
@Test |
||||
public void testAddShortCut() throws Exception { |
||||
|
||||
PowerMock.suppress(MemberMatcher.constructor(UpdateAction.class)); |
||||
SnapChatConfig snapChatConfig = EasyMock.partialMockBuilder(SnapChatConfig.class) |
||||
.addMockedMethod("readXML") |
||||
.createMock(); |
||||
Whitebox.setInternalState(snapChatConfig, "markReadMap", new HashMap()); |
||||
snapChatConfig.readXML(EasyMock.anyObject(XMLableReader.class)); |
||||
EasyMock.expectLastCall().anyTimes(); |
||||
EasyMock.replay(snapChatConfig); |
||||
|
||||
PowerMock.mockStatic(SnapChatConfig.class); |
||||
EasyMock.expect(SnapChatConfig.getInstance()).andReturn(snapChatConfig).anyTimes(); |
||||
PowerMock.replayAll(); |
||||
|
||||
SnapChatMenuDef menuDef = new SnapChatMenuDef("test", SnapChatAllTypes.Menu.BBS); |
||||
ShortCut action = new SnapChatUpdateAction(SnapChatAllTypes.Menu.BBS) { |
||||
@Override |
||||
protected void actionPerformed0(ActionEvent e) { |
||||
|
||||
} |
||||
}; |
||||
|
||||
Assert.assertTrue(menuDef.hasRead()); |
||||
|
||||
menuDef.addShortCut(action); |
||||
Assert.assertFalse(menuDef.hasRead()); |
||||
} |
||||
|
||||
@Test |
||||
public void testInsertShortCut() throws Exception { |
||||
|
||||
PowerMock.suppress(MemberMatcher.constructor(UpdateAction.class)); |
||||
SnapChatConfig snapChatConfig = EasyMock.partialMockBuilder(SnapChatConfig.class) |
||||
.addMockedMethod("readXML") |
||||
.createMock(); |
||||
Whitebox.setInternalState(snapChatConfig, "markReadMap", new HashMap()); |
||||
snapChatConfig.readXML(EasyMock.anyObject(XMLableReader.class)); |
||||
EasyMock.expectLastCall().anyTimes(); |
||||
EasyMock.replay(snapChatConfig); |
||||
|
||||
PowerMock.mockStatic(SnapChatConfig.class); |
||||
EasyMock.expect(SnapChatConfig.getInstance()).andReturn(snapChatConfig).anyTimes(); |
||||
PowerMock.replayAll(); |
||||
|
||||
SnapChatMenuDef menuDef = new SnapChatMenuDef("test", SnapChatAllTypes.Menu.BBS); |
||||
ShortCut action = new SnapChatUpdateAction(SnapChatAllTypes.Menu.BBS) { |
||||
@Override |
||||
protected void actionPerformed0(ActionEvent e) { |
||||
|
||||
} |
||||
}; |
||||
|
||||
Assert.assertTrue(menuDef.hasRead()); |
||||
|
||||
menuDef.insertShortCut(0, action); |
||||
Assert.assertFalse(menuDef.hasRead()); |
||||
} |
||||
} |
@ -0,0 +1,174 @@
|
||||
package com.fr.design.chartx.component.button; |
||||
|
||||
import com.fr.base.BaseUtils; |
||||
import com.fr.base.background.ColorBackground; |
||||
import com.fr.design.style.AbstractSelectBox; |
||||
import com.fr.design.style.color.ColorSelectPane; |
||||
|
||||
import javax.swing.JPanel; |
||||
import javax.swing.event.ChangeEvent; |
||||
import javax.swing.event.ChangeListener; |
||||
import java.awt.Color; |
||||
import java.awt.Dimension; |
||||
import java.awt.Graphics; |
||||
import java.awt.Graphics2D; |
||||
import java.awt.event.MouseAdapter; |
||||
import java.awt.event.MouseEvent; |
||||
import java.awt.event.MouseListener; |
||||
import java.awt.geom.Rectangle2D; |
||||
import java.awt.image.BufferedImage; |
||||
|
||||
/** |
||||
* @author Bjorn |
||||
* @version 10.0 |
||||
* Created by Bjorn on 2020-03-06 |
||||
*/ |
||||
public class ColorButton extends AbstractSelectBox<Color> { |
||||
|
||||
private static final double DEL_WIDTH = 7; |
||||
|
||||
public static final int WIDTH = 18; |
||||
|
||||
private BufferedImage closeIcon = BaseUtils.readImageWithCache("com/fr/design/images/toolbarbtn/chartChangeClose.png"); |
||||
|
||||
private Color color; |
||||
|
||||
private boolean isMoveOn = false; |
||||
|
||||
private ColorSelectPane colorPane; |
||||
|
||||
private boolean lastButton; |
||||
|
||||
private ChangeListener changeListener; |
||||
|
||||
public ColorButton(Color color) { |
||||
this.color = color; |
||||
addMouseListener(getMouseListener()); |
||||
} |
||||
|
||||
public Dimension getPreferredSize() { |
||||
return new Dimension(WIDTH, WIDTH); |
||||
} |
||||
|
||||
private void paintDeleteButton(Graphics g2d) { |
||||
Rectangle2D bounds = this.getBounds(); |
||||
|
||||
int x = (int) (bounds.getWidth() - DEL_WIDTH); |
||||
int y = 1; |
||||
|
||||
g2d.drawImage(closeIcon, x, y, closeIcon.getWidth(), closeIcon.getHeight(), null); |
||||
} |
||||
|
||||
public void setLastButton(boolean lastButton) { |
||||
this.lastButton = lastButton; |
||||
} |
||||
|
||||
@Override |
||||
public void paint(Graphics g) { |
||||
this.setSize(WIDTH, WIDTH); |
||||
Graphics2D g2d = (Graphics2D) g; |
||||
g2d.setPaint(color); |
||||
Rectangle2D rec = new Rectangle2D.Double(0, 0, WIDTH + 1, WIDTH + 1); |
||||
g2d.fill(rec); |
||||
|
||||
if (isMoveOn && !lastButton) { |
||||
paintDeleteButton(g); |
||||
} |
||||
} |
||||
|
||||
protected void deleteButton() { |
||||
|
||||
} |
||||
|
||||
|
||||
private void checkMoveOn(boolean moveOn) { |
||||
this.isMoveOn = moveOn; |
||||
repaint(); |
||||
} |
||||
|
||||
protected MouseListener getMouseListener() { |
||||
return new MouseAdapter() { |
||||
@Override |
||||
public void mouseClicked(MouseEvent e) { |
||||
mouseClick(e); |
||||
} |
||||
|
||||
public void mouseEntered(MouseEvent e) { |
||||
checkMoveOn(true); |
||||
} |
||||
|
||||
public void mouseExited(MouseEvent e) { |
||||
checkMoveOn(false); |
||||
} |
||||
}; |
||||
} |
||||
|
||||
|
||||
public void mouseClick(MouseEvent e) { |
||||
if (!lastButton) { |
||||
Rectangle2D bounds = this.getBounds(); |
||||
if (bounds == null) { |
||||
return; |
||||
} |
||||
if (e.getX() >= bounds.getWidth() - DEL_WIDTH && e.getY() <= DEL_WIDTH) { |
||||
deleteButton(); |
||||
hidePopupMenu(); |
||||
return; |
||||
} |
||||
} |
||||
//打开颜色选择面板
|
||||
showPopupMenu(); |
||||
} |
||||
|
||||
public JPanel initWindowPane(double preferredWidth) { |
||||
// 下拉的时候重新生成面板,刷新最近使用颜色
|
||||
colorPane = new ColorSelectPane(false) { |
||||
@Override |
||||
public void setVisible(boolean b) { |
||||
super.setVisible(b); |
||||
} |
||||
}; |
||||
colorPane.addChangeListener(new ChangeListener() { |
||||
public void stateChanged(ChangeEvent e) { |
||||
hidePopupMenu(); |
||||
color = ((ColorSelectPane) e.getSource()).getColor(); |
||||
fireDisplayComponent(ColorBackground.getInstance(color)); |
||||
ColorButton.this.stateChanged(); |
||||
} |
||||
}); |
||||
return colorPane; |
||||
} |
||||
|
||||
public void stateChanged() { |
||||
if (changeListener != null) { |
||||
changeListener.stateChanged(null); |
||||
} |
||||
} |
||||
|
||||
public void addChangeListener(ChangeListener changeListener) { |
||||
this.changeListener = changeListener; |
||||
} |
||||
|
||||
|
||||
/** |
||||
* 获取当前选中的颜色 |
||||
* |
||||
* @return 当前选中的颜色 |
||||
*/ |
||||
public Color getSelectObject() { |
||||
return this.color; |
||||
} |
||||
|
||||
/** |
||||
* 设置选中的颜色 |
||||
* |
||||
* @param color 颜色 |
||||
*/ |
||||
public void setSelectObject(Color color) { |
||||
this.color = color; |
||||
colorPane.setColor(color); |
||||
|
||||
fireDisplayComponent(ColorBackground.getInstance(color)); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,253 @@
|
||||
package com.fr.design.chartx.component.combobox; |
||||
|
||||
import com.fr.base.ChartColorMatching; |
||||
import com.fr.base.ChartPreStyleConfig; |
||||
import com.fr.design.gui.icombobox.UIComboBox; |
||||
import com.fr.design.gui.icombobox.UIComboBoxRenderer; |
||||
import com.fr.design.i18n.Toolkit; |
||||
import com.fr.general.GeneralUtils; |
||||
|
||||
import javax.swing.DefaultComboBoxModel; |
||||
import javax.swing.JLabel; |
||||
import javax.swing.JList; |
||||
import java.util.Iterator; |
||||
import java.util.LinkedHashMap; |
||||
import java.util.List; |
||||
import java.util.Map; |
||||
import java.util.Set; |
||||
import java.awt.Color; |
||||
import java.awt.Component; |
||||
import java.awt.Dimension; |
||||
import java.awt.FontMetrics; |
||||
import java.awt.Graphics; |
||||
import java.awt.Graphics2D; |
||||
import java.awt.LinearGradientPaint; |
||||
import java.awt.geom.Rectangle2D; |
||||
|
||||
/** |
||||
* @author Bjorn |
||||
* @version 10.0 |
||||
* Created by Bjorn on 2020-03-05 |
||||
* 一个带颜色展示的配色选择下拉框 |
||||
*/ |
||||
public class ColorSchemeComboBox extends UIComboBox { |
||||
|
||||
private Map<String, ColorInfo> colorSchemes; |
||||
|
||||
public ColorSchemeComboBox() { |
||||
this(null); |
||||
} |
||||
|
||||
public ColorSchemeComboBox(Map<String, ColorInfo> colorSchemes) { |
||||
//通过配色方案的集合初始化下拉控件,如果参数为null,从配置中读取配色方案。
|
||||
if (colorSchemes == null) { |
||||
colorSchemes = getColorSchemesFromConfig(); |
||||
} |
||||
this.colorSchemes = colorSchemes; |
||||
|
||||
this.setModel(new DefaultComboBoxModel(colorSchemes.keySet().toArray())); |
||||
|
||||
this.setRenderer(new ColorSchemeCellRenderer()); |
||||
} |
||||
|
||||
private Map<String, ColorInfo> getColorSchemesFromConfig() { |
||||
Map<String, ColorInfo> colorSchemes = new LinkedHashMap<>(); |
||||
ChartPreStyleConfig config = ChartPreStyleConfig.getInstance(); |
||||
|
||||
//所有的样式名称
|
||||
Iterator names = config.names(); |
||||
|
||||
//添加默认的方案和第一个方案
|
||||
String defaultName = config.getCurrentStyle(); |
||||
ChartColorMatching defaultStyle = (ChartColorMatching) config.getPreStyle(defaultName); |
||||
Object firstName = names.next(); |
||||
ChartColorMatching firstStyle = (ChartColorMatching) config.getPreStyle(firstName); |
||||
if (defaultStyle == null) { |
||||
defaultStyle = firstStyle; |
||||
} |
||||
colorSchemes.put(Toolkit.i18nText("Fine-Design_Report_Default"), colorMatchingToColorInfo(defaultStyle)); |
||||
colorSchemes.put(firstStyle.getId(), colorMatchingToColorInfo(firstStyle)); |
||||
|
||||
//添加其他的配色方案
|
||||
while (names.hasNext()) { |
||||
Object key = names.next(); |
||||
ChartColorMatching colorMatching = (ChartColorMatching) config.getPreStyle(key); |
||||
colorSchemes.put(colorMatching.getId(), colorMatchingToColorInfo(colorMatching)); |
||||
} |
||||
|
||||
//添加自定义组合色和自定义渐变色
|
||||
colorSchemes.put(Toolkit.i18nText("Fine-Design_Chart_Custom_Combination_Color"), null); |
||||
colorSchemes.put(Toolkit.i18nText("Fine-Design_Chart_Custom_Gradient"), null); |
||||
|
||||
return colorSchemes; |
||||
} |
||||
|
||||
public ColorInfo getSelectColorInfo() { |
||||
String selectedItem = (String) getSelectedItem(); |
||||
return colorSchemes.get(selectedItem); |
||||
} |
||||
|
||||
private ColorInfo colorMatchingToColorInfo(ChartColorMatching colorMatching) { |
||||
ColorInfo colorInfo = new ColorInfo(); |
||||
colorInfo.setGradient(colorMatching.getGradient()); |
||||
colorInfo.setColors(colorMatching.getColorList()); |
||||
return colorInfo; |
||||
} |
||||
|
||||
public SelectType getSelectType() { |
||||
int selectedIndex = this.getSelectedIndex(); |
||||
int itemCount = this.getItemCount(); |
||||
if (selectedIndex == itemCount - 1) { |
||||
return SelectType.GRADATION_COLOR; |
||||
} |
||||
if (selectedIndex == itemCount - 2) { |
||||
return SelectType.COMBINATION_COLOR; |
||||
} |
||||
if (selectedIndex == 0) { |
||||
return SelectType.DEFAULT; |
||||
} |
||||
return SelectType.NORMAL; |
||||
} |
||||
|
||||
public void setSelectType(SelectType selectType) { |
||||
int itemCount = this.getItemCount(); |
||||
switch (selectType) { |
||||
case DEFAULT: |
||||
setSelectedIndex(0); |
||||
break; |
||||
case GRADATION_COLOR: |
||||
setSelectedIndex(itemCount - 1); |
||||
break; |
||||
case COMBINATION_COLOR: |
||||
setSelectedIndex(itemCount - 2); |
||||
break; |
||||
} |
||||
} |
||||
|
||||
public enum SelectType { |
||||
DEFAULT, |
||||
COMBINATION_COLOR, |
||||
GRADATION_COLOR, |
||||
NORMAL |
||||
} |
||||
|
||||
public Set<String> getItems() { |
||||
return colorSchemes.keySet(); |
||||
} |
||||
|
||||
public class ColorInfo { |
||||
|
||||
private List<Color> colors; |
||||
|
||||
private boolean gradient; |
||||
|
||||
public List<Color> getColors() { |
||||
return colors; |
||||
} |
||||
|
||||
public void setColors(List<Color> colors) { |
||||
this.colors = colors; |
||||
} |
||||
|
||||
public boolean isGradient() { |
||||
return gradient; |
||||
} |
||||
|
||||
public void setGradient(boolean gradient) { |
||||
this.gradient = gradient; |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* CellRenderer. |
||||
*/ |
||||
class ColorSchemeCellRenderer extends UIComboBoxRenderer { |
||||
|
||||
private String schemeName = Toolkit.i18nText("Fine-Design_Report_Default"); |
||||
|
||||
//左边距
|
||||
private static final double X = 4d; |
||||
|
||||
//上边距
|
||||
private static final double Y = 4d; |
||||
|
||||
private static final String BLANK_SPACE = " "; |
||||
|
||||
private static final int HEIGHT = 20; |
||||
|
||||
private static final int MAX_COUNT = 5; |
||||
|
||||
private static final int BLANK = 1; |
||||
|
||||
@Override |
||||
public Dimension getPreferredSize() { |
||||
Dimension preferredSize = super.getPreferredSize(); |
||||
preferredSize.setSize(super.getPreferredSize().getWidth(), HEIGHT); |
||||
return preferredSize; |
||||
} |
||||
|
||||
@Override |
||||
public Dimension getMinimumSize() { |
||||
return getPreferredSize(); |
||||
} |
||||
|
||||
public Component getListCellRendererComponent( |
||||
JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { |
||||
JLabel comp = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); |
||||
this.schemeName = GeneralUtils.objectToString(value); |
||||
ColorInfo colorInfo = colorSchemes.get(schemeName); |
||||
if (colorInfo == null) { |
||||
comp.setText(BLANK_SPACE + schemeName); |
||||
} else { |
||||
FontMetrics fontMetrics = comp.getFontMetrics(comp.getFont()); |
||||
//宽度是5倍的高加上4倍的留白
|
||||
double width = (HEIGHT - 2 * Y) * MAX_COUNT + BLANK * (MAX_COUNT - 1); |
||||
String fill = BLANK_SPACE; |
||||
//图形和文字之间留的宽度大于3倍的X
|
||||
while (fontMetrics.stringWidth(fill) < width + 3 * X) { |
||||
fill += BLANK_SPACE; |
||||
} |
||||
comp.setText(fill + schemeName); |
||||
} |
||||
comp.setToolTipText(schemeName); |
||||
return comp; |
||||
} |
||||
|
||||
public void paint(Graphics g) { |
||||
super.paint(g); |
||||
|
||||
Graphics2D g2d = (Graphics2D) g; |
||||
|
||||
ColorInfo colorInfo = colorSchemes.get(schemeName); |
||||
if (colorInfo != null) { |
||||
if (colorInfo.isGradient()) { |
||||
drawGradient(g2d, colorInfo.getColors()); |
||||
} else { |
||||
drawCombineColor(g2d, colorInfo.getColors()); |
||||
} |
||||
} |
||||
} |
||||
|
||||
private void drawGradient(Graphics2D g2d, List<Color> colors) { |
||||
//上下留4px,宽度等于5倍高
|
||||
double height = HEIGHT - 2 * Y; |
||||
double width = height * MAX_COUNT + BLANK * (MAX_COUNT - 1); |
||||
LinearGradientPaint linearGradientPaint = new LinearGradientPaint((float) X, (float) Y, (float) (X + width), (float) Y, new float[]{0f, 1f}, colors.toArray(new Color[colors.size()])); |
||||
g2d.setPaint(linearGradientPaint); |
||||
Rectangle2D rec = new Rectangle2D.Double(X, Y, width, height); |
||||
g2d.fill(rec); |
||||
} |
||||
|
||||
private void drawCombineColor(Graphics2D g2d, List<Color> colors) { |
||||
int size = Math.min(colors.size(), MAX_COUNT); |
||||
double height = HEIGHT - 2 * Y; |
||||
//加上1px留白
|
||||
double width = ((height + BLANK) * MAX_COUNT - size) / size; |
||||
for (int i = 0; i < size; i++) { |
||||
g2d.setPaint(colors.get(i)); |
||||
Rectangle2D rec = new Rectangle2D.Double(X + (width + BLANK) * i, Y, width, height); |
||||
g2d.fill(rec); |
||||
} |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,235 @@
|
||||
package com.fr.design.mainframe.chart.gui.style; |
||||
|
||||
import com.fr.base.BaseUtils; |
||||
import com.fr.base.background.ColorBackground; |
||||
import com.fr.design.chartx.component.button.ColorButton; |
||||
import com.fr.design.event.UIObserver; |
||||
import com.fr.design.event.UIObserverListener; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.design.layout.VerticalFlowLayout; |
||||
import com.fr.design.style.AbstractSelectBox; |
||||
import com.fr.design.style.color.ColorSelectPane; |
||||
|
||||
import javax.swing.JPanel; |
||||
import javax.swing.event.ChangeEvent; |
||||
import javax.swing.event.ChangeListener; |
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
import java.awt.Color; |
||||
import java.awt.Dimension; |
||||
import java.awt.Graphics; |
||||
import java.awt.Graphics2D; |
||||
import java.awt.event.MouseAdapter; |
||||
import java.awt.event.MouseEvent; |
||||
import java.awt.event.MouseListener; |
||||
import java.awt.geom.Rectangle2D; |
||||
import java.awt.image.BufferedImage; |
||||
|
||||
/** |
||||
* 配色方案选择组合色之后,可以调整颜色的组件 |
||||
* |
||||
* @author Bjorn |
||||
* @version 10.0 |
||||
* Created by Bjorn on 2020-03-25 |
||||
*/ |
||||
public class ChartColorAdjustPane extends JPanel implements UIObserver { |
||||
|
||||
public static final Color[] DEFAULT_COLORS = { |
||||
new Color(99, 178, 238), |
||||
new Color(118, 218, 145), |
||||
new Color(248, 203, 127), |
||||
new Color(248, 149, 136), |
||||
new Color(124, 214, 207), |
||||
new Color(145, 146, 171), |
||||
new Color(120, 152, 225), |
||||
new Color(239, 166, 102), |
||||
new Color(237, 221, 134), |
||||
new Color(153, 135, 206), |
||||
}; |
||||
|
||||
private static final int COUNT_OF_ROW = 8; |
||||
|
||||
private static final int MAX_BUTTON = 40; |
||||
|
||||
private List<ColorButton> colorButtons = new ArrayList<>(); |
||||
|
||||
private List<UIObserverListener> uiObserverListener; |
||||
|
||||
private ChangeListener changeListener; |
||||
|
||||
|
||||
public ChartColorAdjustPane() { |
||||
this(DEFAULT_COLORS); |
||||
} |
||||
|
||||
public ChartColorAdjustPane(Color[] colors) { |
||||
iniListener(); |
||||
createColorButton(colors); |
||||
createContentPane(); |
||||
} |
||||
|
||||
public void updateColor(Color[] colors) { |
||||
createColorButton(colors); |
||||
relayout(); |
||||
} |
||||
|
||||
public Color[] getColors() { |
||||
int size = colorButtons.size(); |
||||
Color[] colors = new Color[size]; |
||||
for (int i = 0; i < size; i++) { |
||||
colors[i] = colorButtons.get(i).getSelectObject(); |
||||
} |
||||
return colors; |
||||
} |
||||
|
||||
private void relayout() { |
||||
this.removeAll(); |
||||
createContentPane(); |
||||
this.validate(); |
||||
this.repaint(); |
||||
} |
||||
|
||||
private void createContentPane() { |
||||
VerticalFlowLayout layout = new VerticalFlowLayout(0, 0, 0); |
||||
layout.setAlignLeft(true); |
||||
this.setLayout(layout); |
||||
|
||||
for (int i = 0, size = colorButtons.size(); i < size; i += COUNT_OF_ROW) { |
||||
JPanel panel = FRGUIPaneFactory.createLeftFlowZeroGapBorderPane(); |
||||
int count = i + COUNT_OF_ROW > colorButtons.size() ? colorButtons.size() : i + COUNT_OF_ROW; |
||||
for (int j = i; j < count; j++) { |
||||
colorButtons.get(j).setLastButton(false); |
||||
panel.add(colorButtons.get(j)); |
||||
} |
||||
if (i + COUNT_OF_ROW > colorButtons.size()) { |
||||
panel.add(new AddColorButton()); |
||||
this.add(panel); |
||||
} else if (i + COUNT_OF_ROW == colorButtons.size() && colorButtons.size() != MAX_BUTTON) { |
||||
this.add(panel); |
||||
this.add(new AddColorButton()); |
||||
} else { |
||||
this.add(panel); |
||||
} |
||||
} |
||||
if (colorButtons.size() == 1) { |
||||
colorButtons.get(0).setLastButton(true); |
||||
} |
||||
} |
||||
|
||||
private void createColorButton(Color[] colors) { |
||||
colorButtons.clear(); |
||||
int size = Math.min(colors.length, MAX_BUTTON); |
||||
for (int i = 0; i < size; i++) { |
||||
colorButtons.add(createColorButton(colors[i])); |
||||
} |
||||
} |
||||
|
||||
private ColorButton createColorButton(Color color) { |
||||
ColorButton colorButton = new ColorButton(color) { |
||||
@Override |
||||
protected void deleteButton() { |
||||
colorButtons.remove(this); |
||||
stateChanged(); |
||||
relayout(); |
||||
} |
||||
}; |
||||
|
||||
colorButton.addChangeListener(changeListener); |
||||
return colorButton; |
||||
} |
||||
|
||||
private void iniListener() { |
||||
uiObserverListener = new ArrayList<>(); |
||||
if (shouldResponseChangeListener()) { |
||||
this.addChangeListener(new ChangeListener() { |
||||
@Override |
||||
public void stateChanged(ChangeEvent e) { |
||||
for (UIObserverListener observerListener : uiObserverListener) { |
||||
observerListener.doChange(); |
||||
} |
||||
} |
||||
}); |
||||
} |
||||
} |
||||
|
||||
public void stateChanged() { |
||||
if (changeListener != null) { |
||||
changeListener.stateChanged(null); |
||||
} |
||||
} |
||||
|
||||
public void addChangeListener(ChangeListener changeListener) { |
||||
this.changeListener = changeListener; |
||||
} |
||||
|
||||
public void registerChangeListener(UIObserverListener listener) { |
||||
uiObserverListener.add(listener); |
||||
} |
||||
|
||||
public boolean shouldResponseChangeListener() { |
||||
return true; |
||||
} |
||||
|
||||
|
||||
private class AddColorButton extends AbstractSelectBox<Color> { |
||||
|
||||
BufferedImage image = BaseUtils.readImageWithCache("/com/fr/design/images/buttonicon/add.png"); |
||||
|
||||
public AddColorButton() { |
||||
addMouseListener(getMouseListener()); |
||||
} |
||||
|
||||
@Override |
||||
public void paint(Graphics g) { |
||||
this.setSize(ColorButton.WIDTH, ColorButton.WIDTH); |
||||
Graphics2D g2d = (Graphics2D) g; |
||||
g2d.setPaint(Color.WHITE); |
||||
Rectangle2D rec = new Rectangle2D.Double(0, 0, ColorButton.WIDTH + 1, ColorButton.WIDTH + 1); |
||||
g2d.fill(rec); |
||||
g2d.drawImage(image, 0, 0, ColorButton.WIDTH + 1, ColorButton.WIDTH + 1, null); |
||||
} |
||||
|
||||
public Dimension getPreferredSize() { |
||||
return new Dimension(ColorButton.WIDTH, ColorButton.WIDTH); |
||||
} |
||||
|
||||
protected MouseListener getMouseListener() { |
||||
return new MouseAdapter() { |
||||
@Override |
||||
public void mouseClicked(MouseEvent e) { |
||||
showPopupMenu(); |
||||
} |
||||
}; |
||||
} |
||||
|
||||
public JPanel initWindowPane(double preferredWidth) { |
||||
// 下拉的时候重新生成面板,刷新最近使用颜色
|
||||
ColorSelectPane colorPane = new ColorSelectPane(false) { |
||||
public void setVisible(boolean b) { |
||||
super.setVisible(b); |
||||
} |
||||
}; |
||||
colorPane.addChangeListener(new ChangeListener() { |
||||
public void stateChanged(ChangeEvent e) { |
||||
hidePopupMenu(); |
||||
Color color = ((ColorSelectPane) e.getSource()).getColor(); |
||||
fireDisplayComponent(ColorBackground.getInstance(color)); |
||||
if(colorButtons.size() < MAX_BUTTON) { |
||||
colorButtons.add(createColorButton(color)); |
||||
} |
||||
ChartColorAdjustPane.this.stateChanged(); |
||||
relayout(); |
||||
} |
||||
}); |
||||
return colorPane; |
||||
} |
||||
|
||||
public Color getSelectObject() { |
||||
return null; |
||||
} |
||||
|
||||
public void setSelectObject(Color color) { |
||||
|
||||
} |
||||
} |
||||
} |
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue