Browse Source
* commit 'c52d2ca8185327d40f995873b7d09afdb0784380': (189 commits) ct ct . . . . 1 REPORT-13626 昨天传的没合到final REPORT-13074 远程设计向下兼容 1. 将尝试连接和正式连接提示分开。 REPORT-13431 功能点记录, 需要合并发送 1.发送前去重 2.SEND_DELAY原先定义有误,修正 REPORT-13074 远程设计向下兼容 1. 忘了注释掉 REPORT-13074 远程设计向下兼容 1. 修复一下逻辑。 更方便理解 REPORT-13074 远程设计向下兼容 1. 补充一些注释。 REPORT-13074 远程设计向下兼容 1. 加入序列化异常 SerilizationException , WorkspaceNoteHitException 2. 加入切换远程连接的检测,以及测试远程连接的提醒。 MOBILE-18801 CHART-3575 修改为需要的'分类名' CHART-3573 使用新的key来区别开'空值断开' CHART-3169 新特性图表 样式系列颜色风格 改为'渐变' REPORT-13689 & REPORT-13733 & REPORT-13716 & REPORT-13720 REPORT-13018 大赛后续开两个接口 ...10.0
Kara
6 years ago
234 changed files with 7724 additions and 3313 deletions
@ -0,0 +1,83 @@
|
||||
package com.fr.base.vcs; |
||||
|
||||
import com.fr.design.base.mode.DesignModeContext; |
||||
|
||||
/** |
||||
* 兼容 |
||||
* |
||||
* @deprecated user {@link com.fr.design.base.mode.DesignerMode} and {@link DesignModeContext} instead |
||||
*/ |
||||
@Deprecated |
||||
public enum DesignerMode { |
||||
|
||||
NORMAL() { |
||||
@Override |
||||
public void doSwitch() { |
||||
DesignModeContext.switchTo(com.fr.design.base.mode.DesignerMode.NORMAL); |
||||
} |
||||
}, |
||||
VCS() { |
||||
@Override |
||||
public void doSwitch() { |
||||
DesignModeContext.switchTo(com.fr.design.base.mode.DesignerMode.VCS); |
||||
} |
||||
}, |
||||
AUTHORITY() { |
||||
@Override |
||||
public void doSwitch() { |
||||
DesignModeContext.switchTo(com.fr.design.base.mode.DesignerMode.AUTHORITY); |
||||
} |
||||
}; |
||||
|
||||
abstract void doSwitch(); |
||||
|
||||
|
||||
/** |
||||
* @return 是否时版本控制模式 |
||||
* @deprecated use {@link DesignModeContext#isVcsMode()} instead |
||||
*/ |
||||
@Deprecated |
||||
public static boolean isVcsMode() { |
||||
return DesignModeContext.isVcsMode(); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* 切换设计器模式 |
||||
* |
||||
* @param mode mode |
||||
* @deprecated use {@link DesignModeContext#switchTo(com.fr.design.base.mode.DesignerMode)} instead |
||||
*/ |
||||
@Deprecated |
||||
public static void setMode(DesignerMode mode) { |
||||
mode.doSwitch(); |
||||
} |
||||
|
||||
/** |
||||
* @return 获取当前设计器模式 |
||||
* @deprecated use {@link DesignModeContext#getMode()} instead |
||||
*/ |
||||
@Deprecated |
||||
public static DesignerMode getMode() { |
||||
switch (DesignModeContext.getMode()) { |
||||
case VCS: |
||||
return VCS; |
||||
case AUTHORITY: |
||||
return AUTHORITY; |
||||
case NORMAL: |
||||
default: |
||||
return NORMAL; |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 是否为权限编辑 |
||||
* |
||||
* @return 是否为权限编辑 |
||||
* @deprecated use {@link DesignModeContext#isAuthorityEditing()} instead |
||||
*/ |
||||
@Deprecated |
||||
public static boolean isAuthorityEditing() { |
||||
return DesignModeContext.isAuthorityEditing(); |
||||
} |
||||
} |
@ -0,0 +1,223 @@
|
||||
package com.fr.design.actions.file.export; |
||||
|
||||
import com.fr.base.vcs.DesignerMode; |
||||
import com.fr.design.actions.JTemplateAction; |
||||
import com.fr.design.gui.iprogressbar.FRProgressBar; |
||||
import com.fr.design.i18n.Toolkit; |
||||
import com.fr.design.mainframe.DesignerContext; |
||||
import com.fr.design.mainframe.JTemplate; |
||||
import com.fr.exception.RemoteDesignPermissionDeniedException; |
||||
import com.fr.file.FILE; |
||||
import com.fr.file.FILEChooserPane; |
||||
import com.fr.file.filter.ChooseFileFilter; |
||||
import com.fr.io.exporter.DesignExportType; |
||||
import com.fr.io.exporter.ExporterKey; |
||||
import com.fr.log.FineLoggerFactory; |
||||
import com.fr.stable.ProductConstants; |
||||
import com.fr.stable.StringUtils; |
||||
import com.fr.third.jodd.io.FileNameUtil; |
||||
import com.fr.workspace.WorkContext; |
||||
import com.fr.workspace.server.exporter.TemplateExportOperator; |
||||
|
||||
import javax.swing.JOptionPane; |
||||
import javax.swing.SwingWorker; |
||||
import javax.swing.UIManager; |
||||
import java.awt.event.ActionEvent; |
||||
import java.io.OutputStream; |
||||
import java.util.Map; |
||||
|
||||
public abstract class AbstractExportAction<E extends JTemplate<?, ?>> extends JTemplateAction<E> { |
||||
|
||||
private FRProgressBar progressbar; |
||||
|
||||
public AbstractExportAction(E t) { |
||||
super(t); |
||||
} |
||||
|
||||
/** |
||||
* 导出接口名 |
||||
* |
||||
* @return String scopeName |
||||
*/ |
||||
public abstract ExporterKey exportKey(); |
||||
|
||||
/** |
||||
* 导出类型 |
||||
* |
||||
* @return DesignExportType tyoe |
||||
*/ |
||||
public abstract DesignExportType exportType(); |
||||
|
||||
/** |
||||
* 目标文件过滤器 |
||||
* |
||||
* @return ChooseFileFilter filter |
||||
*/ |
||||
protected abstract ChooseFileFilter getChooseFileFilter(); |
||||
|
||||
/** |
||||
* 目标文件扩展名 |
||||
* |
||||
* @return String extensionName |
||||
*/ |
||||
protected abstract String getDefaultExtension(); |
||||
|
||||
/** |
||||
* 处理参数 |
||||
* |
||||
* @return Map para |
||||
*/ |
||||
protected abstract Map<String, Object> processParameter(); |
||||
|
||||
|
||||
/** |
||||
* 执行方法 |
||||
*/ |
||||
@Override |
||||
public void actionPerformed(ActionEvent e) { |
||||
|
||||
if (!processNotSaved()) { |
||||
return; |
||||
} |
||||
|
||||
Map<String, Object> para = processParameter(); |
||||
|
||||
// 选择输入的文件
|
||||
FILEChooserPane fileChooserPane = FILEChooserPane.getMultiEnvInstance(true, false); |
||||
fileChooserPane.addChooseFILEFilter(this.getChooseFileFilter()); |
||||
|
||||
|
||||
String fileName = getTargetFileName(); |
||||
fileChooserPane.setFileNameTextField(fileName, "." + this.getDefaultExtension()); |
||||
int saveValue = fileChooserPane.showSaveDialog(DesignerContext.getDesignerFrame(), "." + this.getDefaultExtension()); |
||||
if (saveValue == FILEChooserPane.JOPTIONPANE_OK_OPTION || saveValue == FILEChooserPane.OK_OPTION) { |
||||
FILE target = fileChooserPane.getSelectedFILE(); |
||||
try { |
||||
target.mkfile(); |
||||
} catch (Exception exp) { |
||||
FineLoggerFactory.getLogger().error("Error In Make New File", exp); |
||||
} |
||||
FineLoggerFactory.getLogger().info("\"" + target.getName() + "\"" + Toolkit.i18nText("Fine-Design_Report_Prepare_Export") + "!"); |
||||
|
||||
progressbar = new FRProgressBar( |
||||
createExportWork(getSource(), target, para), |
||||
DesignerContext.getDesignerFrame(), |
||||
Toolkit.i18nText("Fine-Design_Report_Exporting"), |
||||
StringUtils.EMPTY, |
||||
0, |
||||
100); |
||||
|
||||
progressbar.start(); |
||||
} |
||||
} |
||||
|
||||
private FILE getSource() { |
||||
return this.getEditingComponent().getEditingFILE(); |
||||
} |
||||
|
||||
private String getTargetFileName() { |
||||
FILE source = getSource(); |
||||
String fileName = source.getName(); |
||||
return FileNameUtil.removeExtension(fileName); |
||||
} |
||||
|
||||
private boolean processNotSaved() { |
||||
//当前编辑的模板
|
||||
E e = getEditingComponent(); |
||||
if (!e.isALLSaved() && !DesignerMode.isVcsMode()) { |
||||
e.stopEditing(); |
||||
int returnVal = JOptionPane.showConfirmDialog( |
||||
DesignerContext.getDesignerFrame(), |
||||
Toolkit.i18nText("Fine-Design_Basic_Utils_Would_You_Like_To_Save") + " \"" + e.getEditingFILE() + "\" ?", |
||||
ProductConstants.PRODUCT_NAME, |
||||
JOptionPane.YES_NO_CANCEL_OPTION, |
||||
JOptionPane.QUESTION_MESSAGE |
||||
); |
||||
if (returnVal == JOptionPane.YES_OPTION) { |
||||
e.saveTemplate(); |
||||
FineLoggerFactory.getLogger().info( |
||||
Toolkit.i18nText("Fine-Design_Basic_Template_Already_Saved", e.getEditingFILE().getName()) |
||||
); |
||||
return true; |
||||
} else { |
||||
return false; |
||||
} |
||||
} else { |
||||
return true; |
||||
} |
||||
} |
||||
|
||||
private SwingWorker createExportWork(final FILE source, final FILE target, final Map<String, Object> parameterMap) { |
||||
final String path = source.getPath(); |
||||
final String name = target.getName(); |
||||
|
||||
return new SwingWorker<Void, Void>() { |
||||
|
||||
@Override |
||||
protected Void doInBackground() throws Exception { |
||||
//bug 10516
|
||||
Thread.sleep(100); |
||||
try (OutputStream outputStream = target.asOutputStream()) { |
||||
this.setProgress(10); |
||||
dealExporter(outputStream, path, parameterMap); |
||||
this.setProgress(80); |
||||
outputStream.flush(); |
||||
outputStream.close(); |
||||
this.setProgress(100); |
||||
|
||||
FineLoggerFactory.getLogger().info("\"" + name + "\"" + Toolkit.i18nText("Fine-Design_Report_Finish_Export") + "!"); |
||||
JOptionPane.showMessageDialog( |
||||
DesignerContext.getDesignerFrame(), |
||||
Toolkit.i18nText("Fine-Design_Report_Exported_Successfully") + "\n" + name); |
||||
|
||||
|
||||
} catch (RemoteDesignPermissionDeniedException exp) { |
||||
this.setProgress(100); |
||||
target.closeTemplate(); |
||||
FineLoggerFactory.getLogger().error(exp.getMessage(), exp); |
||||
JOptionPane.showMessageDialog( |
||||
DesignerContext.getDesignerFrame(), |
||||
Toolkit.i18nText("Fine-Engine_Remote_Design_Permission_Denied"), |
||||
UIManager.getString("OptionPane.messageDialogTitle"), |
||||
JOptionPane.ERROR_MESSAGE, |
||||
UIManager.getIcon("OptionPane.errorIcon") |
||||
); |
||||
} catch (Exception exp) { |
||||
this.setProgress(100); |
||||
target.closeTemplate(); |
||||
FineLoggerFactory.getLogger().error(exp.getMessage(), exp); |
||||
JOptionPane.showMessageDialog( |
||||
DesignerContext.getDesignerFrame(), |
||||
Toolkit.i18nText("Fine-Design_Report_Export_Failed") + "\n" + path, |
||||
UIManager.getString("OptionPane.messageDialogTitle"), |
||||
JOptionPane.ERROR_MESSAGE, |
||||
UIManager.getIcon("OptionPane.errorIcon") |
||||
); |
||||
} |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public void done() { |
||||
progressbar.close(); |
||||
} |
||||
}; |
||||
} |
||||
|
||||
private void dealExporter(OutputStream outputStream, String path, final Map<String, Object> para) throws Exception { |
||||
|
||||
// 没有办法处理这个 isLocal 判断,因为一个是修改参数传递结果,一个是返回值做结果
|
||||
// todo 后续想想办法
|
||||
if (WorkContext.getCurrent().isLocal()) { |
||||
WorkContext.getCurrent().get(TemplateExportOperator.class) |
||||
.export(exportKey(), exportType(), outputStream, path, para); |
||||
} else { |
||||
byte[] contents = |
||||
WorkContext.getCurrent().get(TemplateExportOperator.class) |
||||
.export(exportKey(), exportType(), null, path, para); |
||||
|
||||
outputStream.write(contents); |
||||
} |
||||
} |
||||
|
||||
} |
@ -0,0 +1,66 @@
|
||||
package com.fr.design.base.mode; |
||||
|
||||
import com.fr.design.designer.TargetComponent; |
||||
|
||||
import static com.fr.design.base.mode.DesignerMode.AUTHORITY; |
||||
|
||||
public class DesignModeContext { |
||||
|
||||
private static DesignerMode mode = DesignerMode.NORMAL; |
||||
|
||||
public static void switchTo(DesignerMode mode) { |
||||
DesignModeContext.mode = mode; |
||||
} |
||||
|
||||
public static DesignerMode getMode() { |
||||
return mode; |
||||
} |
||||
|
||||
/** |
||||
* 是否是版本控制模式 |
||||
* |
||||
* @return 是否是版本控制模式 |
||||
*/ |
||||
public static boolean isVcsMode() { |
||||
return mode == DesignerMode.VCS; |
||||
} |
||||
|
||||
/** |
||||
* @return 是否是禁止拷贝剪切模式 |
||||
*/ |
||||
public static boolean isBanCopyAndCut() { |
||||
return mode == DesignerMode.BAN_COPY_AND_CUT; |
||||
} |
||||
|
||||
|
||||
/** |
||||
* 是否为权限编辑 |
||||
* |
||||
* @return 是否为权限编辑 |
||||
*/ |
||||
public static boolean isAuthorityEditing() { |
||||
return mode == AUTHORITY; |
||||
} |
||||
|
||||
|
||||
public static void doCopy(TargetComponent principal) { |
||||
if (isBanCopyAndCut() || principal == null) { |
||||
return; |
||||
} |
||||
principal.copy(); |
||||
} |
||||
|
||||
public static boolean doPaste(TargetComponent principal) { |
||||
if (principal == null) { |
||||
return false; |
||||
} |
||||
return principal.paste(); |
||||
} |
||||
|
||||
public static boolean doCut(TargetComponent principal) { |
||||
if (isBanCopyAndCut() || principal == null) { |
||||
return false; |
||||
} |
||||
return principal.cut(); |
||||
} |
||||
} |
@ -0,0 +1,8 @@
|
||||
package com.fr.design.base.mode; |
||||
|
||||
public enum DesignerMode { |
||||
NORMAL, |
||||
BAN_COPY_AND_CUT, |
||||
VCS, |
||||
AUTHORITY |
||||
} |
@ -0,0 +1,7 @@
|
||||
package com.fr.design.designer; |
||||
|
||||
/** |
||||
* 暂时是空接口,标记一下模板设计时推出的代理其他 {@link TargetComponent} 的类 |
||||
*/ |
||||
public interface DesignerProxy { |
||||
} |
@ -0,0 +1,5 @@
|
||||
package com.fr.design.designer.properties; |
||||
|
||||
public enum PropertyTab { |
||||
ATTR, MOBILE |
||||
} |
@ -0,0 +1,93 @@
|
||||
package com.fr.design.dialog; |
||||
|
||||
import com.fr.design.gui.icombobox.UIComboBox; |
||||
import com.fr.design.gui.ilable.UILabel; |
||||
import com.fr.design.utils.gui.GUICoreUtils; |
||||
|
||||
import javax.swing.BorderFactory; |
||||
import javax.swing.JPanel; |
||||
import java.awt.BorderLayout; |
||||
import java.awt.Component; |
||||
import java.awt.FlowLayout; |
||||
import java.awt.event.ItemEvent; |
||||
import java.awt.event.ItemListener; |
||||
|
||||
/** |
||||
* 封装了"为该模版单独设置、采用服务器设置"选项功能的设置面板 |
||||
* Created by plough on 2018/11/7. |
||||
*/ |
||||
public abstract class AbstractTemplateServerSettingPane extends BasicPane { |
||||
private static final String[] CHOOSEITEM = new String[] { |
||||
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_I_Want_To_Set_Single"), |
||||
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Using_Server_Report_View_Settings") |
||||
}; |
||||
|
||||
protected static final int SINGLE_SET = 0; |
||||
protected static final int SERVER_SET = 1; |
||||
|
||||
protected UIComboBox chooseComboBox; |
||||
protected JPanel buttonPane; |
||||
private JPanel contentPane; |
||||
|
||||
protected AbstractTemplateServerSettingPane() { |
||||
initComponents(); |
||||
} |
||||
|
||||
private void initComponents() { |
||||
chooseComboBox = new UIComboBox(CHOOSEITEM); |
||||
chooseComboBox.addItemListener(itemListener); |
||||
UILabel belowSetLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Blow_Set")); |
||||
belowSetLabel.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 20)); |
||||
buttonPane = GUICoreUtils.createFlowPane(new Component[] { |
||||
belowSetLabel, chooseComboBox}, FlowLayout.LEFT, 0, 0); |
||||
buttonPane.setBorder(BorderFactory.createEmptyBorder(10, 20, 0, 0)); |
||||
|
||||
this.setLayout(new BorderLayout()); |
||||
this.add(buttonPane, BorderLayout.NORTH); |
||||
this.contentPane = getContentPane(); |
||||
this.add(contentPane, BorderLayout.CENTER); |
||||
} |
||||
|
||||
/** |
||||
* 包含设置项的主面板 |
||||
*/ |
||||
protected abstract JPanel getContentPane(); |
||||
|
||||
private ItemListener itemListener = new ItemListener() { |
||||
@Override |
||||
public void itemStateChanged(ItemEvent e) { |
||||
if (e.getStateChange() == ItemEvent.SELECTED) { |
||||
if (isUsingServerSettings()) { |
||||
populateServerSettings(); |
||||
setSettingPaneEnabled(false); |
||||
} else { |
||||
setSettingPaneEnabled(true); |
||||
} |
||||
} |
||||
} |
||||
}; |
||||
|
||||
private void setSettingPaneEnabled(boolean enabled) { |
||||
// GUICoreUtils.setEnabled 会遍历所有 Component。所以要先设置外层,如果是生效的,再设置内层
|
||||
GUICoreUtils.setEnabled(contentPane, enabled); |
||||
if (enabled) { |
||||
checkContentPaneEnabled(); |
||||
} |
||||
} |
||||
|
||||
protected boolean isUsingServerSettings() { |
||||
return chooseComboBox.getSelectedIndex() == SERVER_SET; |
||||
} |
||||
|
||||
/** |
||||
* 整个配置面板设置为可用后,可能还需要检测面板中部分区域的可用性 |
||||
*/ |
||||
protected void checkContentPaneEnabled() { |
||||
// do nothing
|
||||
} |
||||
|
||||
/** |
||||
* 读取服务器配置并 populate 到主面板中 |
||||
*/ |
||||
protected abstract void populateServerSettings(); |
||||
} |
@ -1,120 +0,0 @@
|
||||
package com.fr.design.extra.ucenter; |
||||
|
||||
import com.fr.base.Base64; |
||||
import com.fr.base.FRContext; |
||||
import com.fr.stable.StringUtils; |
||||
|
||||
import java.io.UnsupportedEncodingException; |
||||
import java.net.URLEncoder; |
||||
import java.security.MessageDigest; |
||||
import java.security.NoSuchAlgorithmException; |
||||
import java.util.Map; |
||||
|
||||
/** |
||||
* @author lp |
||||
* @date 2016/9/9 |
||||
*/ |
||||
public abstract class AbstractClient { |
||||
|
||||
static final String UC_API_MYSQL = "ucApiMysql"; |
||||
static final String UC_API_POST = "ucApiPost"; |
||||
|
||||
protected String urlEncode(String value) { |
||||
return URLEncoder.encode(value); |
||||
} |
||||
|
||||
protected String md5(String input) { |
||||
MessageDigest md; |
||||
try { |
||||
md = MessageDigest.getInstance("MD5"); |
||||
} catch (NoSuchAlgorithmException e) { |
||||
FRContext.getLogger().info(e.getMessage()); |
||||
return ""; |
||||
} |
||||
return byte2hex(md.digest(input.getBytes())); |
||||
} |
||||
|
||||
protected String md5(long input) { |
||||
return md5(String.valueOf(input)); |
||||
} |
||||
|
||||
protected String base64Decode(String input) { |
||||
try { |
||||
return new String(Base64.decode(input)); |
||||
} catch (Exception e) { |
||||
FRContext.getLogger().info(e.getMessage()); |
||||
return ""; |
||||
} |
||||
} |
||||
|
||||
protected String base64Encode(String input) { |
||||
try { |
||||
return Base64.encode(input.getBytes("iso-8859-1")); |
||||
} catch (Exception e) { |
||||
FRContext.getLogger().info(e.getMessage()); |
||||
return ""; |
||||
} |
||||
} |
||||
|
||||
protected String byte2hex(byte[] b) { |
||||
StringBuilder hs = new StringBuilder(); |
||||
String stmp = ""; |
||||
for (byte aB : b) { |
||||
stmp = (Integer.toHexString(aB & 0XFF)); |
||||
if (stmp.length() == 1) { |
||||
hs.append("0").append(stmp); |
||||
} else { |
||||
hs.append(stmp); |
||||
} |
||||
} |
||||
return hs.toString(); |
||||
} |
||||
|
||||
protected String subStr(String input, int begin, int length) { |
||||
return input.substring(begin, begin + length); |
||||
} |
||||
|
||||
protected String subStr(String input, int begin) { |
||||
if (begin > 0) { |
||||
return input.substring(begin); |
||||
} else { |
||||
return input.substring(input.length() + begin); |
||||
} |
||||
} |
||||
|
||||
protected long microTime() { |
||||
return System.currentTimeMillis(); |
||||
} |
||||
|
||||
protected long time() { |
||||
return System.currentTimeMillis() / 1000; |
||||
} |
||||
|
||||
protected String sprintf(String format, long input) { |
||||
String temp = "0000000000" + input; |
||||
return temp.substring(temp.length() - 10); |
||||
} |
||||
|
||||
protected String callUserFunc(String function, String model, String action, Map<String, Object> args) { |
||||
if (UC_API_MYSQL.equals(function)) { |
||||
return this.ucApiMysql(model, action, args); |
||||
} |
||||
if (UC_API_POST.equals(function)) { |
||||
return this.ucApiPost(model, action, args); |
||||
} |
||||
return StringUtils.EMPTY; |
||||
} |
||||
|
||||
public abstract String ucApiPost(String module, String action, Map<String, Object> arg); |
||||
|
||||
public abstract String ucApiMysql(String model, String action, Map args); |
||||
|
||||
protected String urlEncode(String value, String code) { |
||||
try { |
||||
return URLEncoder.encode(value, code); |
||||
} catch (UnsupportedEncodingException e) { |
||||
FRContext.getLogger().info(e.getMessage()); |
||||
} |
||||
return ""; |
||||
} |
||||
} |
@ -1,264 +0,0 @@
|
||||
package com.fr.design.extra.ucenter; |
||||
|
||||
import com.fr.base.FRContext; |
||||
import com.fr.general.CloudCenter; |
||||
|
||||
import java.io.BufferedReader; |
||||
import java.io.IOException; |
||||
import java.io.InputStream; |
||||
import java.io.InputStreamReader; |
||||
import java.io.OutputStream; |
||||
import java.net.Socket; |
||||
import java.net.URL; |
||||
import java.util.HashMap; |
||||
import java.util.Map; |
||||
import java.util.Objects; |
||||
|
||||
/** |
||||
* |
||||
* @author lp |
||||
* @date 2016/9/9 |
||||
*/ |
||||
public class Client extends AbstractClient { |
||||
|
||||
private static String UC_IP = ""; |
||||
private static String UC_API = ""; |
||||
private static String UC_CONNECT = ""; |
||||
private static String UC_KEY = "Rc85U37411p4zdvcedm8D4t4D3l9Sa42H0kd98Gbd82aA99a61S2Z5LbQ9u430M0"; |
||||
private static String UC_APPID = "4"; |
||||
private static String UC_CLIENT_RELEASE = "20090212"; |
||||
public static String UC_ROOT = ""; |
||||
private static String UC_API_FUNC = "mysql".equals(UC_CONNECT) ? UC_API_MYSQL : UC_API_POST; |
||||
|
||||
public String ucUserLogin(String username, String password) { |
||||
return ucUserLogin(username, password, 0, 0); |
||||
} |
||||
|
||||
public String ucUserLogin(String username, String password, int isUid, int checkQues) { |
||||
return ucUserLogin(username, password, isUid, checkQues, "", ""); |
||||
} |
||||
|
||||
/** |
||||
* 用户登录 |
||||
* |
||||
* @param username 用户名 |
||||
* @param password 密码 |
||||
* @param isUid 是否为uid |
||||
* @param checkQues 是否使用安全问题 |
||||
* @param questionId 安全提问 |
||||
* @param answer 安全提问答案 |
||||
* @return array (uid/status, username, password, email) |
||||
*/ |
||||
public String ucUserLogin(String username, String password, int isUid, int checkQues, String questionId, String answer) { |
||||
Map<String, Object> args = new HashMap<>(6); |
||||
args.put("username", username); |
||||
args.put("password", password); |
||||
args.put("isUid", isUid); |
||||
args.put("checkQues", checkQues); |
||||
args.put("questionId", questionId); |
||||
args.put("answer", answer); |
||||
String res = callUserFunc(UC_API_FUNC, "user", "login", args); |
||||
return "mysql".equals(UC_CONNECT) ? res : res; |
||||
} |
||||
|
||||
/** |
||||
* 拼接发送的post请求 |
||||
* |
||||
* @param module 模块 |
||||
* @param action 操作模式 |
||||
* @param arg 参数 |
||||
* @return 发送的请求加密内容 |
||||
*/ |
||||
@Override |
||||
public String ucApiPost(String module, String action, Map<String, Object> arg) { |
||||
StringBuilder str = new StringBuilder(); |
||||
String sep = ""; |
||||
for (String k : arg.keySet()) { |
||||
Object v = arg.get(k); |
||||
k = urlEncode(k); |
||||
if (v.getClass().isAssignableFrom(Map.class)) { |
||||
StringBuilder s2 = new StringBuilder(); |
||||
String sep2 = ""; |
||||
for (String k2 : ((Map<String, Object>) v).keySet()) { |
||||
Object v2 = ((Map<String, Object>) v).get(k2); |
||||
k2 = urlEncode(k2); |
||||
s2.append(sep2).append("{").append(k).append("}[").append(k2).append("]=").append(urlEncode(String.valueOf(v2))); |
||||
sep2 = "&"; |
||||
} |
||||
str.append(sep).append(s2); |
||||
} else { |
||||
str.append(sep).append(k).append("=").append(urlEncode(String.valueOf(v), "GBK")); |
||||
} |
||||
sep = "&"; |
||||
} |
||||
String postData = ucApiRequestdata(module, action, str.toString(), ""); |
||||
UC_API = CloudCenter.getInstance().acquireUrlByKind("bbs.ucapi"); |
||||
UC_IP = CloudCenter.getInstance().acquireUrlByKind("bbs.ip"); |
||||
return ucFopen2(UC_API + "/index.php", 500000, postData, "", true, UC_IP, 20, true); |
||||
} |
||||
|
||||
@Override |
||||
public String ucApiMysql(String model, String action, Map args) { |
||||
return ""; |
||||
} |
||||
|
||||
public String ucApiInput(String data) { |
||||
return urlEncode(ucAuthCode(data + "&agent=" + md5("") + "&time=" + time(), "ENCODE", UC_KEY), "GBK"); |
||||
} |
||||
|
||||
protected String ucApiRequestdata(String module, String action, String arg, String extra) { |
||||
String input = ucApiInput(arg); |
||||
return "m=" + module + "&a=" + action + "&inajax=2&release=" + UC_CLIENT_RELEASE + "&input=" + input + "&appid=" + UC_APPID + extra; |
||||
} |
||||
|
||||
public String ucAuthCode(String string, String operation, String key) { |
||||
return ucAuthCode(string, operation, key, 0); |
||||
} |
||||
|
||||
/** |
||||
* 内容加密 |
||||
* |
||||
* @param string 原文 |
||||
* @param operation decode或者encode |
||||
* @param key 密钥 |
||||
* @param expiry 密文有效时限 |
||||
* @return 加密之后的原文 |
||||
*/ |
||||
public String ucAuthCode(String string, String operation, String key, int expiry) { |
||||
int ckeyLength = 4; |
||||
key = md5(key != null ? key : UC_KEY); |
||||
String keya = md5(subStr(key, 0, 16)); |
||||
String keyb = md5(subStr(key, 16, 16)); |
||||
String keyc = "DECODE".equals(operation) ? subStr(string, 0, ckeyLength) : subStr(md5(microTime()), -ckeyLength); |
||||
String cryptkey = keya + md5(keya + keyc); |
||||
int keyLength = cryptkey.length(); |
||||
string = "DECODE".equals(operation) ? base64Decode(subStr(string, ckeyLength)) : sprintf("%010d", expiry > 0 ? expiry + time() : 0) + subStr(md5(string + keyb), 0, 16) + string; |
||||
int stringLength = string.length(); |
||||
StringBuilder result1 = new StringBuilder(); |
||||
int[] box = new int[256]; |
||||
for (int i = 0; i < 256; i++) { |
||||
box[i] = i; |
||||
} |
||||
int[] rndkey = new int[256]; |
||||
for (int i = 0; i <= 255; i++) { |
||||
rndkey[i] = (int) cryptkey.charAt(i % keyLength); |
||||
} |
||||
int j = 0; |
||||
for (int i = 0; i < 256; i++) { |
||||
j = (j + box[i] + rndkey[i]) % 256; |
||||
int tmp = box[i]; |
||||
box[i] = box[j]; |
||||
box[j] = tmp; |
||||
} |
||||
j = 0; |
||||
int a = 0; |
||||
for (int i = 0; i < stringLength; i++) { |
||||
a = (a + 1) % 256; |
||||
j = (j + box[a]) % 256; |
||||
int tmp = box[a]; |
||||
box[a] = box[j]; |
||||
box[j] = tmp; |
||||
result1.append((char) (((int) string.charAt(i)) ^ (box[(box[a] + box[j]) % 256]))); |
||||
} |
||||
if ("DECODE".equals(operation)) { |
||||
String result = result1.toString(); |
||||
try { |
||||
result = new String(result.getBytes("iso-8859-1"), "gbk"); |
||||
} catch (Exception e) { |
||||
result = result1.substring(0, result1.length()); |
||||
} |
||||
if ((Integer.parseInt(subStr(result, 0, 10)) == 0 || Long.parseLong(subStr(result, 0, 10)) - time() > 0) && subStr(result, 10, 16).equals(subStr(md5(subStr(result, 26) + keyb), 0, 16))) { |
||||
return subStr(result, 26); |
||||
} else { |
||||
return ""; |
||||
} |
||||
} else { |
||||
return keyc + base64Encode(result1.toString()).replaceAll("=", ""); |
||||
} |
||||
} |
||||
|
||||
protected String ucFopen2(String url, int limit, String post, String cookie, boolean bysocket, String ip, int timeout, boolean block) { |
||||
url += url.indexOf("?") > 0 ? "&" : "?" + "__times__=1"; |
||||
return ucFopen(url, limit, post, cookie, bysocket, ip, timeout, block); |
||||
} |
||||
|
||||
/** |
||||
* 本地模网络请求取数据 |
||||
* |
||||
* @param url 打开的url |
||||
* @param limit 取返回的数据的长度 |
||||
* @param post 要发送的 POST 数据,如uid=1&password=1234 |
||||
* @param cookie 要模拟的 COOKIE 数据,如uid=123&auth=a2323sd2323 |
||||
* @param bysocket TRUE/FALSE 是否通过SOCKET打开 |
||||
* @param ip IP地址 |
||||
* @param timeout 连接超时时间 |
||||
* @param block 是否为阻塞模式 defaul valuet:true |
||||
* @return 取到的字符串 |
||||
*/ |
||||
private String ucFopen(String url, int limit, String post, String cookie, boolean bysocket, String ip, int timeout, boolean block) { |
||||
StringBuilder result = new StringBuilder(); |
||||
URL matches; |
||||
String host = ""; |
||||
String path = ""; |
||||
int port = 80; |
||||
try { |
||||
matches = new URL(url); |
||||
host = matches.getHost(); |
||||
path = matches.getPath() != null ? matches.getPath() + (matches.getQuery() != null ? "?" + matches.getQuery() : "") : "/"; |
||||
if (matches.getPort() > 0) port = matches.getPort(); |
||||
} catch (Exception e1) { |
||||
FRContext.getLogger().info(e1.getMessage()); |
||||
} |
||||
StringBuilder out = new StringBuilder(); |
||||
if (post != null && post.length() > 0) { |
||||
out.append("POST ").append(path).append(" HTTP/1.0\r\n"); |
||||
out.append("Accept: */*\r\n"); |
||||
out.append("Accept-Language: zh-cn\r\n"); |
||||
out.append("Content-Type: application/x-www-form-urlencoded\r\n"); |
||||
out.append("User-Agent: \r\n"); |
||||
out.append("Host: ").append(host).append("\r\n"); |
||||
out.append("Content-Length: ").append(post.length()).append("\r\n"); |
||||
out.append("Connection: Close\r\n"); |
||||
out.append("Cache-Control: no-cache\r\n"); |
||||
out.append("Cookie: \r\n\r\n"); |
||||
out.append(post); |
||||
} else { |
||||
out.append("GET $path HTTP/1.0\r\n"); |
||||
out.append("Accept: */*\r\n"); |
||||
out.append("Accept-Language: zh-cn\r\n"); |
||||
out.append("User-Agent: Java/1.5.0_01\r\n"); |
||||
out.append("Host: $host\r\n"); |
||||
out.append("Connection: Close\r\n"); |
||||
out.append("Cookie: $cookie\r\n\r\n"); |
||||
} |
||||
try { |
||||
Socket fp = new Socket(ip != null && ip.length() > 10 ? ip : host, port); |
||||
if (!fp.isConnected()) { |
||||
return ""; |
||||
} else { |
||||
OutputStream os = fp.getOutputStream(); |
||||
os.write(out.toString().getBytes()); |
||||
InputStream ins = fp.getInputStream(); |
||||
BufferedReader reader = new BufferedReader(new InputStreamReader(ins, "iso-8859-1")); |
||||
while (true) { |
||||
String header = reader.readLine(); |
||||
if (header == null || "".equals(header) || Objects.equals(header, "\r\n") || Objects.equals(header, "\n")) { |
||||
break; |
||||
} |
||||
} |
||||
while (true) { |
||||
String data = reader.readLine(); |
||||
if (data == null || "".equals(data)) { |
||||
break; |
||||
} else { |
||||
result.append(data); |
||||
} |
||||
} |
||||
fp.close(); |
||||
} |
||||
} catch (IOException e) { |
||||
FRContext.getLogger().info(e.getMessage()); |
||||
} |
||||
return result.toString(); |
||||
} |
||||
} |
@ -1,41 +0,0 @@
|
||||
package com.fr.design.extra.ucenter; |
||||
|
||||
import com.fr.base.FRContext; |
||||
import com.sun.org.apache.xerces.internal.parsers.DOMParser; |
||||
import org.w3c.dom.Document; |
||||
import org.w3c.dom.NodeList; |
||||
import org.xml.sax.InputSource; |
||||
import org.xml.sax.SAXException; |
||||
|
||||
import java.io.IOException; |
||||
import java.io.StringReader; |
||||
import java.util.LinkedList; |
||||
|
||||
/** |
||||
* @author lp |
||||
* @date 2016/9/9 |
||||
*/ |
||||
public class XMLHelper { |
||||
|
||||
public static LinkedList<String> ucUnserialize(String input) { |
||||
|
||||
LinkedList<String> result = new LinkedList<String>(); |
||||
DOMParser parser = new DOMParser(); |
||||
try { |
||||
parser.parse(new InputSource(new StringReader(input))); |
||||
Document doc = parser.getDocument(); |
||||
NodeList nl = doc.getChildNodes().item(0).getChildNodes(); |
||||
int length = nl.getLength(); |
||||
for (int i = 0; i < length; i++) { |
||||
if (nl.item(i).getNodeType() == Document.ELEMENT_NODE) { |
||||
result.add(nl.item(i).getTextContent()); |
||||
} |
||||
} |
||||
} catch (SAXException e) { |
||||
FRContext.getLogger().info(e.getMessage()); |
||||
} catch (IOException e1) { |
||||
FRContext.getLogger().info(e1.getLocalizedMessage()); |
||||
} |
||||
return result; |
||||
} |
||||
} |
@ -1,31 +0,0 @@
|
||||
package com.fr.design.fun; |
||||
|
||||
import com.fr.stable.fun.ReportFitAttrProvider; |
||||
import com.fr.stable.fun.mark.Immutable; |
||||
|
||||
import java.beans.PropertyDescriptor; |
||||
|
||||
/** |
||||
* Created by Slpire on 2016/10/28. |
||||
*/ |
||||
public interface FormElementCaseEditorProcessor extends Immutable { |
||||
String MARK_STRING = "PropertyEditor"; |
||||
|
||||
int CURRENT_LEVEL = 1; |
||||
|
||||
|
||||
/** |
||||
* 生成属性表 |
||||
* @param temp 传入当前操作的class |
||||
* @param reportFitAttr 传入的自适应属性 |
||||
* @return 返回属性表 |
||||
*/ |
||||
PropertyDescriptor[] createPropertyDescriptor(Class<?> temp, ReportFitAttrProvider reportFitAttr); |
||||
|
||||
/** |
||||
* 返回pc自适应属性值 |
||||
* @param fitAttrProvider 传入的自适应属性 |
||||
* @return 返回pc自适应属性值 |
||||
*/ |
||||
int getFitStateInPC(ReportFitAttrProvider fitAttrProvider); |
||||
} |
@ -1,21 +1,44 @@
|
||||
package com.fr.design.fun; |
||||
|
||||
import com.fr.design.beans.BasicBeanPane; |
||||
import com.fr.design.gui.controlpane.NameableCreator; |
||||
import com.fr.stable.fun.Level; |
||||
import com.fr.js.Hyperlink; |
||||
import com.fr.stable.fun.mark.Mutable; |
||||
|
||||
/** |
||||
* Created by zack on 2016/1/20. |
||||
*/ |
||||
public interface HyperlinkProvider extends Mutable { |
||||
public interface HyperlinkProvider<T extends Hyperlink> extends Mutable { |
||||
String XML_TAG = "HyperlinkProvider"; |
||||
|
||||
int CURRENT_LEVEL = 2; |
||||
|
||||
|
||||
/** |
||||
* 创建一个超级连接类型 |
||||
* @return NameableCreator |
||||
* 超级链接的描述信息,如果是实现类中重载了这个方法,就不需要再实现下面的三个方法: |
||||
* @see HyperlinkProvider#text() |
||||
* @see HyperlinkProvider#target() |
||||
* @see HyperlinkProvider#appearance() |
||||
* 如果并不重载,就需要分别实现上面的三个方法,不推荐重载这个方法 |
||||
* @return 描述信息 |
||||
*/ |
||||
NameableCreator createHyperlinkCreator(); |
||||
|
||||
/** |
||||
* 超级链接的名字 |
||||
* @return 名字 |
||||
*/ |
||||
String text(); |
||||
|
||||
/** |
||||
* 超级链接的实现类 |
||||
* @return 实现类 |
||||
*/ |
||||
Class<T> target(); |
||||
|
||||
/** |
||||
* 超级链接的界面配置类 |
||||
* @return 配置类 |
||||
*/ |
||||
Class<? extends BasicBeanPane<T>> appearance(); |
||||
} |
@ -0,0 +1,31 @@
|
||||
package com.fr.design.fun; |
||||
|
||||
import com.fr.design.designer.properties.PropertyTab; |
||||
import com.fr.design.foldablepane.UIExpandablePane; |
||||
import com.fr.stable.fun.mark.Mutable; |
||||
|
||||
/** |
||||
* created by hades on 18/10/16 |
||||
* 该接口支持在设计器cpt&frm参数界面的属性和移动端下添加一个UIExpandablePane(可展开面板) |
||||
*/ |
||||
public interface ParameterExpandablePaneUIProvider extends Mutable { |
||||
|
||||
String XML_TAG = "ParameterExpandablePaneUIProvider"; |
||||
|
||||
int CURRENT_LEVEL = 1; |
||||
|
||||
/** |
||||
* 创建可展开面板并添加子容器 |
||||
* |
||||
* @return UIExpandablePane |
||||
*/ |
||||
UIExpandablePane createUIExpandablePane(); |
||||
|
||||
/** |
||||
* 指定添加UIExpandablePane到哪个PropertyTab下,例如属性,移动端 |
||||
* |
||||
* @return PropertyTab |
||||
*/ |
||||
PropertyTab addToWhichPropertyTab(); |
||||
|
||||
} |
@ -0,0 +1,55 @@
|
||||
package com.fr.design.fun; |
||||
|
||||
import com.fr.design.actions.UpdateAction; |
||||
import com.fr.design.designer.TargetComponent; |
||||
import com.fr.design.gui.imenu.UIPopupMenu; |
||||
import com.fr.design.mainframe.BaseFormDesigner; |
||||
import com.fr.design.selection.SelectableElement; |
||||
import com.fr.stable.fun.mark.Mutable; |
||||
|
||||
import java.util.List; |
||||
|
||||
/** |
||||
* 设计器右键菜单接口 |
||||
*/ |
||||
public interface RightSelectionHandlerProvider extends Mutable { |
||||
|
||||
int CURRENT_LEVEL = 1; |
||||
|
||||
String XML_TAG = "RightSelectionHandlerProvider"; |
||||
|
||||
|
||||
/** |
||||
* 对单元格或者悬浮元素的右键菜单项进行增删改 |
||||
* |
||||
* @param ePane 选择的元素 |
||||
* @param popupMenu 右键主菜单 |
||||
*/ |
||||
void dmlMenu(TargetComponent ePane, UIPopupMenu popupMenu); |
||||
|
||||
|
||||
/** |
||||
* 当前实现是否可以作用于当前元素 |
||||
* |
||||
* @param selectableElement 当前选中元素分为CellSelection和FloatSelection(单元格和悬浮元素) |
||||
* @return |
||||
*/ |
||||
boolean accept(SelectableElement selectableElement); |
||||
|
||||
|
||||
/** |
||||
* 对表单,参数面板内置的右键选项进行增删改处理 |
||||
* |
||||
* @param actions 默认的action集合 注意:主体代码要求这边的action必须是UndoableAction 的子类而非updateAction |
||||
*/ |
||||
void dmlUpdateActions(BaseFormDesigner formDesigner, List<UpdateAction> actions); |
||||
|
||||
/** |
||||
* 当前实现是否可以作用于当前元素 |
||||
* |
||||
* @param formDesigner 当前选中元素分为表单编辑器和参数面板(表单组件元素以及各种控件) |
||||
* @return |
||||
*/ |
||||
boolean accept(BaseFormDesigner formDesigner); |
||||
|
||||
} |
@ -1,44 +0,0 @@
|
||||
package com.fr.design.fun.impl; |
||||
|
||||
import com.fr.design.fun.FormElementCaseEditorProcessor; |
||||
import com.fr.stable.fun.ReportFitAttrProvider; |
||||
import com.fr.stable.fun.mark.API; |
||||
|
||||
import java.beans.PropertyDescriptor; |
||||
|
||||
/** |
||||
* Created by zhouping on 2015/9/10. |
||||
*/ |
||||
@API(level = FormElementCaseEditorProcessor.CURRENT_LEVEL) |
||||
public abstract class AbstractFormElementCaseEditorProcessor implements FormElementCaseEditorProcessor { |
||||
|
||||
public int currentAPILevel() { |
||||
return CURRENT_LEVEL; |
||||
} |
||||
|
||||
public int layerIndex() { |
||||
return DEFAULT_LAYER_INDEX; |
||||
} |
||||
|
||||
|
||||
/** |
||||
* 生成属性表 |
||||
* @param temp 传入当前操作的class |
||||
* @param reportFitAttr 传入的自适应属性 |
||||
* @return 返回属性表 |
||||
*/ |
||||
@Override |
||||
public PropertyDescriptor[] createPropertyDescriptor(Class<?> temp, ReportFitAttrProvider reportFitAttr) { |
||||
return new PropertyDescriptor[0]; |
||||
} |
||||
|
||||
/** |
||||
* 返回pc自适应属性值 |
||||
* @param fitAttrProvider 传入的自适应属性 |
||||
* @return 返回pc自适应属性值 |
||||
*/ |
||||
@Override |
||||
public int getFitStateInPC(ReportFitAttrProvider fitAttrProvider) { |
||||
return 0; |
||||
} |
||||
} |
@ -0,0 +1,19 @@
|
||||
package com.fr.design.fun.impl; |
||||
|
||||
import com.fr.design.fun.ParameterExpandablePaneUIProvider; |
||||
import com.fr.stable.fun.impl.AbstractProvider; |
||||
import com.fr.stable.fun.mark.API; |
||||
|
||||
@API(level = ParameterExpandablePaneUIProvider.CURRENT_LEVEL) |
||||
public abstract class AbstractParameterExpandablePaneUIProvider extends AbstractProvider implements ParameterExpandablePaneUIProvider{ |
||||
|
||||
@Override |
||||
public int currentAPILevel() { |
||||
return CURRENT_LEVEL; |
||||
} |
||||
|
||||
@Override |
||||
public String mark4Provider() { |
||||
return getClass().getName(); |
||||
} |
||||
} |
@ -0,0 +1,45 @@
|
||||
package com.fr.design.fun.impl; |
||||
|
||||
import com.fr.design.actions.UpdateAction; |
||||
import com.fr.design.designer.TargetComponent; |
||||
import com.fr.design.fun.RightSelectionHandlerProvider; |
||||
import com.fr.design.gui.imenu.UIPopupMenu; |
||||
import com.fr.design.mainframe.BaseFormDesigner; |
||||
import com.fr.design.selection.SelectableElement; |
||||
import com.fr.stable.fun.impl.AbstractProvider; |
||||
import com.fr.stable.fun.mark.API; |
||||
|
||||
import java.util.List; |
||||
|
||||
@API(level = RightSelectionHandlerProvider.CURRENT_LEVEL) |
||||
public abstract class AbstractRightSelectionHandlerProvider extends AbstractProvider implements RightSelectionHandlerProvider { |
||||
@Override |
||||
public int currentAPILevel() { |
||||
return CURRENT_LEVEL; |
||||
} |
||||
|
||||
@Override |
||||
public String mark4Provider() { |
||||
return getClass().getName(); |
||||
} |
||||
|
||||
@Override |
||||
public void dmlUpdateActions(BaseFormDesigner formDesigner, List<UpdateAction> actions) { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public boolean accept(BaseFormDesigner formDesigner) { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public void dmlMenu(TargetComponent ePane, UIPopupMenu popupMenu) { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public boolean accept(SelectableElement selectableElement) { |
||||
return false; |
||||
} |
||||
} |
@ -1,184 +0,0 @@
|
||||
package com.fr.design.hyperlink; |
||||
|
||||
import com.fr.design.actions.UpdateAction; |
||||
import com.fr.design.dialog.BasicDialog; |
||||
import com.fr.design.dialog.DialogActionAdapter; |
||||
import com.fr.design.gui.ibutton.UIButton; |
||||
import com.fr.design.gui.icheckbox.UICheckBox; |
||||
import com.fr.design.gui.icombobox.UIComboBox; |
||||
import com.fr.design.gui.ilable.UILabel; |
||||
import com.fr.design.gui.itextfield.UITextField; |
||||
import com.fr.design.gui.itree.filetree.ReportletPane; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.design.layout.TableLayout; |
||||
import com.fr.design.layout.TableLayoutHelper; |
||||
import com.fr.design.utils.gui.GUICoreUtils; |
||||
|
||||
import com.fr.js.ReportletHyperlink; |
||||
import com.fr.stable.StringUtils; |
||||
|
||||
import javax.swing.*; |
||||
import java.awt.*; |
||||
import java.awt.event.ActionEvent; |
||||
import java.awt.event.ActionListener; |
||||
|
||||
/** |
||||
* 热点链接部分 上方 定义特征 样式 报表 等属性的界面. |
||||
* |
||||
* @author kunsnat |
||||
*/ |
||||
public class ReporletHyperNorthPane extends AbstractHyperNorthPane<ReportletHyperlink> { |
||||
private UITextField itemNameTextField; |
||||
private boolean needRenamePane = false; |
||||
private UITextField reportPathTextField; |
||||
private UICheckBox showParameterInterface; |
||||
private UIButton browserButton; |
||||
|
||||
// richer:参数传递方式
|
||||
private UIComboBox postComboBox; |
||||
|
||||
public ReporletHyperNorthPane(boolean needRenamePane) { |
||||
this.needRenamePane = needRenamePane; |
||||
this.inits(); |
||||
} |
||||
|
||||
public ReporletHyperNorthPane() { |
||||
this.inits(); |
||||
} |
||||
|
||||
/** |
||||
* 初始化组件 |
||||
*/ |
||||
public void inits() { |
||||
super.initComponents(); |
||||
} |
||||
|
||||
@Override |
||||
protected JPanel setHeaderPanel() { |
||||
JPanel headerPane = FRGUIPaneFactory.createBorderLayout_L_Pane(); |
||||
double p = TableLayout.PREFERRED; |
||||
double[] rowSize = {p, p, p}; |
||||
double[] columnSize = {p, TableLayout.FILL}; |
||||
// Reportlet.
|
||||
JPanel reportletNamePane = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||
|
||||
reportPathTextField = new UITextField(20); |
||||
reportletNamePane.add(reportPathTextField, BorderLayout.CENTER); |
||||
|
||||
browserButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Select")); |
||||
browserButton.setPreferredSize(new Dimension(browserButton.getPreferredSize().width, 20)); |
||||
reportletNamePane.add(browserButton, BorderLayout.EAST); |
||||
browserButton.addActionListener(new ActionListener() { |
||||
public void actionPerformed(ActionEvent evt) { |
||||
final ReportletPane reportletPane = new ReportletPane(); |
||||
reportletPane.setSelectedReportletPath(reportPathTextField.getText()); |
||||
BasicDialog reportletDialog = reportletPane.showWindow(SwingUtilities.getWindowAncestor(ReporletHyperNorthPane.this)); |
||||
|
||||
reportletDialog.addDialogActionListener(new DialogActionAdapter() { |
||||
public void doOk() { |
||||
reportPathTextField.setText(reportletPane.getSelectedReportletPath()); |
||||
} |
||||
}); |
||||
reportletDialog.setVisible(true); |
||||
} |
||||
}); |
||||
|
||||
Component[][] components; |
||||
if (!this.needRenamePane) { |
||||
components = new Component[][]{ |
||||
{new UILabel(" " + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Hyperlink_Reportlet") + ":"), reportletNamePane}, |
||||
}; |
||||
} else { |
||||
itemNameTextField = new UITextField(); |
||||
components = new Component[][]{ |
||||
{new UILabel(" " + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Hyperlink_Name") + ":"), itemNameTextField}, |
||||
{new UILabel(" " + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Hyperlink_Reportlet") + ":"), reportletNamePane}, |
||||
}; |
||||
} |
||||
JPanel northPane = TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize); |
||||
headerPane.add(northPane, BorderLayout.NORTH); |
||||
return headerPane; |
||||
} |
||||
|
||||
@Override |
||||
protected String title4PopupWindow() { |
||||
return "reportlet"; |
||||
} |
||||
|
||||
@Override |
||||
protected void populateSubHyperlinkBean(ReportletHyperlink link) { |
||||
if (itemNameTextField != null) { |
||||
this.itemNameTextField.setText(link.getItemName()); |
||||
} |
||||
this.reportPathTextField.setText(link.getReportletPath()); |
||||
this.showParameterInterface.setSelected(link.isShowParameterInterface()); |
||||
this.postComboBox.setSelectedIndex(link.isByPost() ? 1 : 0); |
||||
} |
||||
|
||||
@Override |
||||
protected ReportletHyperlink updateSubHyperlinkBean() { |
||||
ReportletHyperlink reportletHyperlink = new ReportletHyperlink(); |
||||
updateSubHyperlinkBean(reportletHyperlink); |
||||
|
||||
return reportletHyperlink; |
||||
} |
||||
|
||||
@Override |
||||
protected void updateSubHyperlinkBean(ReportletHyperlink reportletHyperlink) { |
||||
if (itemNameTextField != null) { |
||||
reportletHyperlink.setItemName(this.itemNameTextField.getText()); |
||||
} |
||||
reportletHyperlink.setReportletPath(this.reportPathTextField.getText()); |
||||
reportletHyperlink.setShowParameterInterface(this.showParameterInterface.isSelected()); |
||||
reportletHyperlink.setByPost(postComboBox.getSelectedIndex() == 1 ? true : false); |
||||
} |
||||
|
||||
public String getReportletName() { |
||||
return StringUtils.isBlank(this.reportPathTextField.getText()) ? StringUtils.EMPTY : this.reportPathTextField.getText().substring(1); |
||||
} |
||||
|
||||
/** |
||||
* 获取按钮焦点 |
||||
*/ |
||||
public void requestButtonFocus() { |
||||
this.browserButton.requestFocus(); |
||||
JPopupMenu popup = new JPopupMenu(); |
||||
FakeTipAction tip = new FakeTipAction(); |
||||
tip.setEnabled(false); |
||||
popup.add(tip); |
||||
GUICoreUtils.showPopupCloseMenu(popup, this.browserButton); |
||||
} |
||||
|
||||
private class FakeTipAction extends UpdateAction { |
||||
public FakeTipAction() { |
||||
this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Template_Select")); |
||||
} |
||||
|
||||
public void actionPerformed(ActionEvent e) { |
||||
//do nothing
|
||||
} |
||||
} |
||||
|
||||
@Override |
||||
protected JPanel setFootPanel() { |
||||
double p = TableLayout.PREFERRED; |
||||
double[] rowSize = {p, p, p}; |
||||
double[] columnSize = {p, TableLayout.FILL}; |
||||
showParameterInterface = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Parameter_UI_Display")); |
||||
JPanel showParameterPanel = new JPanel(); |
||||
showParameterPanel.add(new UILabel()); |
||||
showParameterPanel.add(showParameterInterface); |
||||
|
||||
postComboBox = new UIComboBox(new String[]{"GET", "POST"}); |
||||
JPanel postPanel = new JPanel(); |
||||
postPanel.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Reportlet_Parameter_Type"))); |
||||
postPanel.add(postComboBox); |
||||
Component[][] components = {{postPanel}, |
||||
{showParameterPanel}, |
||||
{new UILabel(" ")} |
||||
}; |
||||
|
||||
return TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,450 @@
|
||||
package com.fr.design.hyperlink; |
||||
|
||||
import com.fr.base.BaseFormula; |
||||
import com.fr.design.actions.UpdateAction; |
||||
import com.fr.design.dialog.BasicDialog; |
||||
import com.fr.design.dialog.DialogActionAdapter; |
||||
import com.fr.design.formula.TinyFormulaPane; |
||||
import com.fr.design.gui.ibutton.UIButton; |
||||
import com.fr.design.gui.ibutton.UIRadioButton; |
||||
import com.fr.design.gui.icheckbox.UICheckBox; |
||||
import com.fr.design.gui.icombobox.UIComboBox; |
||||
import com.fr.design.gui.ilable.UILabel; |
||||
import com.fr.design.gui.itextfield.UINumberField; |
||||
import com.fr.design.gui.itextfield.UITextField; |
||||
import com.fr.design.gui.itree.filetree.ReportletPane; |
||||
import com.fr.design.i18n.Toolkit; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.design.layout.TableLayoutHelper; |
||||
import com.fr.design.utils.gui.GUICoreUtils; |
||||
import com.fr.js.ReportletHyperlink; |
||||
import com.fr.js.ReportletHyperlinkDialogAttr; |
||||
import com.fr.stable.CommonUtils; |
||||
import com.fr.stable.FormulaProvider; |
||||
import com.fr.stable.StringUtils; |
||||
|
||||
import javax.swing.BorderFactory; |
||||
import javax.swing.ButtonGroup; |
||||
import javax.swing.JPanel; |
||||
import javax.swing.JPopupMenu; |
||||
import javax.swing.SwingUtilities; |
||||
import javax.swing.event.ChangeEvent; |
||||
import javax.swing.event.ChangeListener; |
||||
import java.awt.BorderLayout; |
||||
import java.awt.Component; |
||||
import java.awt.Dimension; |
||||
import java.awt.FlowLayout; |
||||
import java.awt.event.ActionEvent; |
||||
import java.awt.event.ActionListener; |
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
|
||||
/** |
||||
* 热点链接部分 上方 定义特征 样式 报表 等属性的界面. |
||||
* |
||||
* @author kunsnat |
||||
*/ |
||||
public class ReportletHyperNorthPane extends AbstractHyperNorthPane<ReportletHyperlink> { |
||||
/** |
||||
* item name text filed |
||||
*/ |
||||
private UITextField itemNameTextField; |
||||
/** |
||||
* 是否展示item name |
||||
*/ |
||||
private boolean needRenamePane = false; |
||||
/** |
||||
* 参数路径输入框 |
||||
*/ |
||||
private UITextField reportPathTextField; |
||||
/** |
||||
* 是否展示参数面板勾选框 |
||||
*/ |
||||
private UICheckBox showParameterInterface; |
||||
/** |
||||
* 选择文件按钮 |
||||
*/ |
||||
private UIButton browserButton; |
||||
|
||||
/** |
||||
* 参数传递方式下拉选择框 |
||||
*/ |
||||
private UIComboBox postComboBox; |
||||
/** |
||||
* 对话框标题输入框 |
||||
*/ |
||||
private TinyFormulaPane titleFiled; |
||||
|
||||
|
||||
/** |
||||
* 对话框居中按钮 |
||||
*/ |
||||
private UIRadioButton center; |
||||
/** |
||||
* 对话框位置自定义按钮 |
||||
*/ |
||||
private UIRadioButton custom; |
||||
/** |
||||
* 距左 |
||||
*/ |
||||
private UINumberField leftLocation; |
||||
/** |
||||
* 距上 |
||||
*/ |
||||
private UINumberField topLocation; |
||||
|
||||
|
||||
public ReportletHyperNorthPane(boolean needRenamePane) { |
||||
this.needRenamePane = needRenamePane; |
||||
} |
||||
|
||||
public ReportletHyperNorthPane() { |
||||
} |
||||
|
||||
/** |
||||
* 初始化面板 |
||||
*/ |
||||
@Override |
||||
protected void initComponents() { |
||||
this.setLayout(FRGUIPaneFactory.createM_BorderLayout()); |
||||
this.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); |
||||
|
||||
final List<Component[]> dialogComponents = new ArrayList<>(); |
||||
final List<Component[]> othersComponents = new ArrayList<>(); |
||||
|
||||
initRenamePanel(dialogComponents, othersComponents); |
||||
initHeaderPanel(dialogComponents, othersComponents); |
||||
initTargetComboBoxPanel(dialogComponents, othersComponents); |
||||
|
||||
initTitlePanel(dialogComponents); |
||||
initDialogSizePanel(dialogComponents); |
||||
initDialogLocationPanel(dialogComponents); |
||||
|
||||
initFooterPanel(dialogComponents, othersComponents); |
||||
|
||||
initPlaceHolder(othersComponents); |
||||
|
||||
bindListener(dialogComponents, othersComponents); |
||||
|
||||
// 创建内容面板
|
||||
JPanel content = TableLayoutHelper.createTableLayoutPane(dialogComponents.toArray(new Component[dialogComponents.size()][]), TableLayoutHelper.FILL_LASTCOL_AND_ROW); |
||||
this.add(content, BorderLayout.CENTER); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* 生成最上方的配置面板 |
||||
* |
||||
* @return JPanel |
||||
*/ |
||||
@Override |
||||
protected JPanel setHeaderPanel() { |
||||
|
||||
JPanel reportletNamePane = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||
// 路径输入框
|
||||
reportPathTextField = new UITextField(20); |
||||
reportletNamePane.add(reportPathTextField, BorderLayout.CENTER); |
||||
|
||||
// 选择路径按钮
|
||||
browserButton = new UIButton(Toolkit.i18nText("Fine-Design_Basic_Select")); |
||||
browserButton.setPreferredSize(new Dimension(browserButton.getPreferredSize().width, 20)); |
||||
reportletNamePane.add(browserButton, BorderLayout.EAST); |
||||
browserButton.addActionListener(new ActionListener() { |
||||
@Override |
||||
public void actionPerformed(ActionEvent evt) { |
||||
final ReportletPane reportletPane = new ReportletPane(); |
||||
reportletPane.setSelectedReportletPath(reportPathTextField.getText()); |
||||
BasicDialog reportletDialog = reportletPane.showWindow(SwingUtilities.getWindowAncestor(ReportletHyperNorthPane.this)); |
||||
|
||||
reportletDialog.addDialogActionListener(new DialogActionAdapter() { |
||||
@Override |
||||
public void doOk() { |
||||
reportPathTextField.setText(reportletPane.getSelectedReportletPath()); |
||||
} |
||||
}); |
||||
reportletDialog.setVisible(true); |
||||
} |
||||
}); |
||||
return reportletNamePane; |
||||
} |
||||
|
||||
@Override |
||||
protected String title4PopupWindow() { |
||||
return "reportlet"; |
||||
} |
||||
|
||||
@Override |
||||
protected void populateSubHyperlinkBean(ReportletHyperlink link) { |
||||
if (itemNameTextField != null) { |
||||
this.itemNameTextField.setText(link.getItemName()); |
||||
} |
||||
this.reportPathTextField.setText(link.getReportletPath()); |
||||
this.showParameterInterface.setSelected(link.isShowParameterInterface()); |
||||
this.postComboBox.setSelectedIndex(link.isByPost() ? 1 : 0); |
||||
|
||||
ReportletHyperlinkDialogAttr attr = link.getAttr(); |
||||
titleFiled.populateBean(StringUtils.EMPTY); |
||||
leftLocation.setText(StringUtils.EMPTY); |
||||
topLocation.setText(StringUtils.EMPTY); |
||||
center.setSelected(true); |
||||
if (attr != null) { |
||||
Object title = attr.getTitle(); |
||||
String titleContent; |
||||
if (title instanceof FormulaProvider) { |
||||
titleContent = ((FormulaProvider) title).getContent(); |
||||
} else { |
||||
titleContent = title == null ? StringUtils.EMPTY : title.toString(); |
||||
} |
||||
titleFiled.populateBean(titleContent); |
||||
boolean isCenter = attr.isCenter(); |
||||
if (!isCenter) { |
||||
int left = attr.getLeft(), top = attr.getTop(); |
||||
leftLocation.setText(Integer.toString(left)); |
||||
topLocation.setText(Integer.toString(top)); |
||||
} |
||||
center.setSelected(isCenter); |
||||
custom.setSelected(!isCenter); |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
protected ReportletHyperlink updateSubHyperlinkBean() { |
||||
ReportletHyperlink reportletHyperlink = new ReportletHyperlink(); |
||||
updateSubHyperlinkBean(reportletHyperlink); |
||||
return reportletHyperlink; |
||||
} |
||||
|
||||
@Override |
||||
protected void updateSubHyperlinkBean(ReportletHyperlink reportletHyperlink) { |
||||
if (itemNameTextField != null) { |
||||
reportletHyperlink.setItemName(this.itemNameTextField.getText()); |
||||
} |
||||
reportletHyperlink.setReportletPath(this.reportPathTextField.getText()); |
||||
reportletHyperlink.setShowParameterInterface(this.showParameterInterface.isSelected()); |
||||
reportletHyperlink.setByPost(postComboBox.getSelectedIndex() == 1); |
||||
|
||||
ReportletHyperlinkDialogAttr attr = new ReportletHyperlinkDialogAttr(); |
||||
String title = titleFiled.updateBean(); |
||||
if (CommonUtils.maybeFormula(title)) { |
||||
attr.setTitle(BaseFormula.createFormulaBuilder().build(titleFiled.updateBean())); |
||||
} else { |
||||
attr.setTitle(title); |
||||
} |
||||
attr.setCenter(center.isSelected()); |
||||
if (!attr.isCenter()) { |
||||
attr.setLeft((int) leftLocation.getValue()); |
||||
attr.setTop((int) topLocation.getValue()); |
||||
} |
||||
reportletHyperlink.setAttr(attr); |
||||
|
||||
} |
||||
|
||||
public String getReportletName() { |
||||
String text = this.reportPathTextField.getText(); |
||||
return StringUtils.isBlank(text) ? StringUtils.EMPTY : text.substring(1); |
||||
} |
||||
|
||||
/** |
||||
* 获取按钮焦点 |
||||
*/ |
||||
public void requestButtonFocus() { |
||||
this.browserButton.requestFocus(); |
||||
JPopupMenu popup = new JPopupMenu(); |
||||
FakeTipAction tip = new FakeTipAction(); |
||||
tip.setEnabled(false); |
||||
popup.add(tip); |
||||
GUICoreUtils.showPopupCloseMenu(popup, this.browserButton); |
||||
} |
||||
|
||||
private class FakeTipAction extends UpdateAction { |
||||
public FakeTipAction() { |
||||
this.setName(Toolkit.i18nText("Fine-Design_Basic_Template_Select")); |
||||
} |
||||
|
||||
@Override |
||||
public void actionPerformed(ActionEvent e) { |
||||
// do nothing
|
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 底部面板,参数传递方式 |
||||
* |
||||
* @return JPanel |
||||
*/ |
||||
@Override |
||||
protected JPanel setFootPanel() { |
||||
JPanel content = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 0)); |
||||
|
||||
// 参数传递方式下拉框
|
||||
postComboBox = new UIComboBox(new String[]{"GET", "POST"}); |
||||
postComboBox.setPreferredSize(new Dimension(60, 20)); |
||||
postComboBox.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); |
||||
content.add(postComboBox); |
||||
|
||||
|
||||
showParameterInterface = new UICheckBox(Toolkit.i18nText("Fine-Design_Basic_Parameter_UI_Display")); |
||||
|
||||
showParameterInterface.setBorder(BorderFactory.createEmptyBorder(0, 20, 0, 0)); |
||||
content.add(showParameterInterface); |
||||
return content; |
||||
} |
||||
|
||||
private void bindListener(final List<Component[]> dialogComponents, final List<Component[]> othersComponents) { |
||||
final UIComboBox targetFrameComboBox = this.getTargetFrameComboBox(); |
||||
targetFrameComboBox.addActionListener(new ActionListener() { |
||||
@Override |
||||
public void actionPerformed(ActionEvent e) { |
||||
boolean show = DIALOG == targetFrameComboBox.getSelectedIndex(); |
||||
JPanel content; |
||||
List<Component[]> cs = show ? dialogComponents : othersComponents; |
||||
ReportletHyperNorthPane.this.removeAll(); |
||||
content = TableLayoutHelper.createTableLayoutPane(cs.toArray(new Component[cs.size()][]), TableLayoutHelper.FILL_LASTCOL_AND_ROW); |
||||
ReportletHyperNorthPane.this.add(content, BorderLayout.CENTER); |
||||
ReportletHyperNorthPane.this.revalidate(); |
||||
ReportletHyperNorthPane.this.repaint(); |
||||
} |
||||
}); |
||||
} |
||||
|
||||
private void initPlaceHolder(List<Component[]> othersComponents) { |
||||
JPanel empty1 = new JPanel(); |
||||
empty1.setPreferredSize(new Dimension(20, 20)); |
||||
JPanel empty2 = new JPanel(); |
||||
empty2.setPreferredSize(new Dimension(20, 20)); |
||||
JPanel empty3 = new JPanel(); |
||||
empty3.setPreferredSize(new Dimension(20, 23)); |
||||
|
||||
othersComponents.add(new Component[]{empty1, new JPanel()}); |
||||
othersComponents.add(new Component[]{empty2, new JPanel()}); |
||||
othersComponents.add(new Component[]{empty3, new JPanel()}); |
||||
} |
||||
|
||||
private void initRenamePanel(List<Component[]> dialogComponents, List<Component[]> othersComponents) { |
||||
// 是否有重命名属性
|
||||
if (this.needRenamePane) { |
||||
itemNameTextField = new UITextField(); |
||||
Component[] renameComponents = new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Basic_Hyperlink_Name") + ":"), itemNameTextField}; |
||||
dialogComponents.add(renameComponents); |
||||
othersComponents.add(renameComponents); |
||||
} |
||||
} |
||||
|
||||
private void initHeaderPanel(List<Component[]> dialogComponents, List<Component[]> othersComponents) { |
||||
//最上方位置的面板
|
||||
JPanel headerPane = this.setHeaderPanel(); |
||||
Component[] headerComponents = new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Basic_Hyperlink_Reportlet") + ":"), headerPane}; |
||||
dialogComponents.add(headerComponents); |
||||
othersComponents.add(headerComponents); |
||||
} |
||||
|
||||
private void initTargetComboBoxPanel(List<Component[]> dialogComponents, List<Component[]> othersComponents) { |
||||
// 链接打开于
|
||||
UIComboBox targetFrameComboBox = new UIComboBox(getTargetFrames()); |
||||
this.setTargetFrameComboBox(targetFrameComboBox); |
||||
targetFrameComboBox.setEditable(true); |
||||
targetFrameComboBox.setPreferredSize(new Dimension(100, 20)); |
||||
JPanel targetFramePanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 0)); |
||||
targetFramePanel.add(targetFrameComboBox); |
||||
Component[] targetComponents = new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Basic_Hyperlink_Link_Opened_In") + ":"), targetFramePanel}; |
||||
dialogComponents.add(targetComponents); |
||||
othersComponents.add(targetComponents); |
||||
} |
||||
|
||||
private void initTitlePanel(List<Component[]> dialogComponents) { |
||||
// 对话框标题
|
||||
titleFiled = new TinyFormulaPane(); |
||||
titleFiled.getUITextField().setColumns(15); |
||||
final JPanel titlePanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 0)); |
||||
titlePanel.add(titleFiled); |
||||
Component[] titleComponents = new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Basic_Hyperlink_Dialog_Title") + ":"), titlePanel}; |
||||
dialogComponents.add(titleComponents); |
||||
} |
||||
|
||||
private void initDialogSizePanel(List<Component[]> dialogComponents) {// 对话框大小
|
||||
final JPanel sizeJPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 0)); |
||||
UILabel heightLabel = new UILabel(Toolkit.i18nText("Fine-Design_Chart_Height") + ":"); |
||||
heightLabel.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 10)); |
||||
sizeJPanel.add(heightLabel); |
||||
UINumberField heightTextFiled = new UINumberField(); |
||||
heightTextFiled.setMinValue(0); |
||||
heightTextFiled.setText(String.valueOf(DEFAULT_H_VALUE)); |
||||
heightTextFiled.setPreferredSize(new Dimension(40, 20)); |
||||
sizeJPanel.add(heightTextFiled); |
||||
this.setHeightTextFiled(heightTextFiled); |
||||
UILabel widthLabel = new UILabel(Toolkit.i18nText("Fine-Design_Basic_Designer_Width") + ":"); |
||||
widthLabel.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 10)); |
||||
sizeJPanel.add(widthLabel); |
||||
UINumberField widthTextFiled = new UINumberField(); |
||||
widthTextFiled.setMinValue(0); |
||||
widthTextFiled.setText(String.valueOf(DEFAULT_V_VALUE)); |
||||
widthTextFiled.setPreferredSize(new Dimension(40, 20)); |
||||
sizeJPanel.add(widthTextFiled); |
||||
this.setWidthTextFiled(widthTextFiled); |
||||
sizeJPanel.setVisible(true); |
||||
dialogComponents.add(new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Basic_Hyperlink_Dialog_Size") + ":"), sizeJPanel}); |
||||
} |
||||
|
||||
private void initDialogLocationPanel(List<Component[]> dialogComponents) { |
||||
// 显示位置
|
||||
final JPanel locationPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 0)); |
||||
// 居中
|
||||
center = new UIRadioButton(Toolkit.i18nText("Fine-Design_Basic_Hyperlink_Dialog_Position_Center")); |
||||
// 自定义
|
||||
custom = new UIRadioButton(Toolkit.i18nText("Fine-Design_Basic_Hyperlink_Dialog_Position_Custom")); |
||||
|
||||
custom.setBorder(BorderFactory.createEmptyBorder(4, 20, 4, 5)); |
||||
ButtonGroup group = new ButtonGroup(); |
||||
group.setSelected(center.getModel(), true); |
||||
group.add(center); |
||||
group.add(custom); |
||||
locationPanel.add(center); |
||||
locationPanel.add(custom); |
||||
|
||||
// 位置 距左
|
||||
final UILabel leftLabel = new UILabel(Toolkit.i18nText("Fine-Design_Basic_Hyperlink_Dialog_Position_Left")); |
||||
leftLabel.setBorder(BorderFactory.createEmptyBorder(0, 20, 0, 10)); |
||||
leftLocation = new UINumberField(); |
||||
leftLocation.setMinValue(0); |
||||
leftLocation.setPreferredSize(new Dimension(40, 20)); |
||||
// 位置 距上
|
||||
final UILabel topLabel = new UILabel(Toolkit.i18nText("Fine-Design_Basic_Hyperlink_Dialog_Position_Top")); |
||||
topLabel.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 10)); |
||||
topLocation = new UINumberField(); |
||||
topLocation.setMinValue(0); |
||||
topLocation.setPreferredSize(new Dimension(40, 20)); |
||||
|
||||
locationPanel.add(leftLabel); |
||||
locationPanel.add(leftLocation); |
||||
locationPanel.add(topLabel); |
||||
locationPanel.add(topLocation); |
||||
leftLabel.setVisible(false); |
||||
leftLocation.setVisible(false); |
||||
topLabel.setVisible(false); |
||||
topLocation.setVisible(false); |
||||
ChangeListener actionListener = new ChangeListener() { |
||||
@Override |
||||
public void stateChanged(ChangeEvent e) { |
||||
boolean visible = custom.isSelected(); |
||||
leftLabel.setVisible(visible); |
||||
leftLocation.setVisible(visible); |
||||
topLabel.setVisible(visible); |
||||
topLocation.setVisible(visible); |
||||
} |
||||
}; |
||||
// 默认居中
|
||||
center.setSelected(true); |
||||
center.addChangeListener(actionListener); |
||||
custom.addChangeListener(actionListener); |
||||
|
||||
dialogComponents.add(new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Basic_Hyperlink_Dialog_Show_Position") + ":"), locationPanel}); |
||||
} |
||||
|
||||
private void initFooterPanel(List<Component[]> dialogComponents, List<Component[]> othersComponents) { |
||||
// 最下方的配置面板
|
||||
// 参数传递方式
|
||||
Component[] footerComponents = new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Basic_Reportlet_Parameter_Type") + ":"), this.setFootPanel()}; |
||||
dialogComponents.add(footerComponents); |
||||
othersComponents.add(footerComponents); |
||||
} |
||||
} |
@ -1,6 +1,8 @@
|
||||
package com.fr.design.mainframe; |
||||
|
||||
public interface JTemplateProvider { |
||||
public interface JTemplateProvider<T> { |
||||
|
||||
public void fireTargetModified(); |
||||
void fireTargetModified(); |
||||
|
||||
T getTarget(); |
||||
} |
@ -0,0 +1,119 @@
|
||||
package com.fr.design.mainframe.mobile.ui; |
||||
|
||||
import com.fr.base.GraphHelper; |
||||
import com.fr.design.mainframe.widget.preview.MobileTemplatePreviewPane; |
||||
import com.fr.form.ui.CardSwitchButton; |
||||
import com.fr.form.ui.container.cardlayout.WCardTagLayout; |
||||
import com.fr.general.FRFont; |
||||
import com.fr.general.cardtag.mobile.DefaultMobileTemplateStyle; |
||||
import com.fr.general.cardtag.mobile.MobileTemplateStyle; |
||||
import com.fr.general.cardtag.mobile.TabFontConfig; |
||||
|
||||
import java.awt.BasicStroke; |
||||
import java.awt.Color; |
||||
import java.awt.Dimension; |
||||
import java.awt.FontMetrics; |
||||
import java.awt.Graphics; |
||||
import java.awt.Graphics2D; |
||||
import java.awt.RenderingHints; |
||||
|
||||
public class DefaultMobileStyleDefinePane extends MobileTemplateStyleDefinePane { |
||||
|
||||
public DefaultMobileStyleDefinePane(WCardTagLayout tagLayout) { |
||||
super(tagLayout); |
||||
} |
||||
|
||||
@Override |
||||
public void populateBean(MobileTemplateStyle ob) { |
||||
updatePreviewPane(); |
||||
} |
||||
|
||||
protected void createConfigPane() { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
protected void initDefaultConfig() { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public MobileTemplateStyle updateSubStyle() { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public MobileTemplateStyle updateBean() { |
||||
return getDefaultTemplateStyle(); |
||||
} |
||||
|
||||
public MobileTemplateStyle updateConfig(){ |
||||
return getDefaultTemplateStyle(); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
protected MobileTemplateStyle getDefaultTemplateStyle() { |
||||
return new DefaultMobileTemplateStyle(new TabFontConfig(getTagLayout().getTitleFont())); |
||||
} |
||||
|
||||
@Override |
||||
public void populateSubStyle(MobileTemplateStyle ob) { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
protected String title4PopupWindow() { |
||||
return null; |
||||
} |
||||
|
||||
protected MobileTemplatePreviewPane createPreviewPane() { |
||||
return new DefaultStylePreviewPane(); |
||||
} |
||||
|
||||
public class DefaultStylePreviewPane extends MobileTemplatePreviewPane { |
||||
|
||||
public DefaultStylePreviewPane() { |
||||
this.setBackground(DefaultMobileTemplateStyle.DEFAULT_INITIAL_COLOR); |
||||
} |
||||
|
||||
public Color getInitialColor() { |
||||
return DefaultMobileTemplateStyle.DEFAULT_INITIAL_COLOR; |
||||
} |
||||
|
||||
public void repaint() { |
||||
super.repaint(); |
||||
} |
||||
|
||||
@Override |
||||
public void paint(Graphics g) { |
||||
super.paint(g); |
||||
Dimension dimension = this.getSize(); |
||||
int panelWidth = dimension.width; |
||||
int panelHeight = dimension.height; |
||||
Graphics2D g2d = (Graphics2D) g.create(); |
||||
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); |
||||
FRFont frFont = this.getTabFontConfig().getFont(); |
||||
FontMetrics fm = GraphHelper.getFontMetrics(frFont); |
||||
WCardTagLayout cardTagLayout = DefaultMobileStyleDefinePane.this.getTagLayout(); |
||||
int eachWidth = panelWidth / cardTagLayout.getWidgetCount(); |
||||
g2d.setFont(frFont); |
||||
int fontHeight = fm.getHeight(); |
||||
int ascentHeight = fm.getAscent(); |
||||
for (int i = 0; i < cardTagLayout.getWidgetCount(); i++) { |
||||
g2d.setColor(frFont.getForeground()); |
||||
CardSwitchButton cardSwitchButton = cardTagLayout.getSwitchButton(i); |
||||
String displayName = calculateDisplayName(cardSwitchButton.getText(), fm, eachWidth); |
||||
int width = fm.stringWidth(displayName); |
||||
g2d.drawString(displayName, (eachWidth - width) / 2, (panelHeight - fontHeight) / 2 + ascentHeight); |
||||
if (i == 0) { |
||||
g2d.setColor(Color.BLACK); |
||||
g2d.setStroke(new BasicStroke(2.0f)); |
||||
g2d.drawLine(0, panelHeight - 1, eachWidth, panelHeight - 1); |
||||
} |
||||
g2d.translate(eachWidth, 0); |
||||
} |
||||
} |
||||
} |
||||
|
||||
} |
@ -0,0 +1,195 @@
|
||||
package com.fr.design.mainframe.mobile.ui; |
||||
|
||||
import com.fr.base.GraphHelper; |
||||
import com.fr.base.Icon; |
||||
import com.fr.base.IconManager; |
||||
import com.fr.design.constants.LayoutConstants; |
||||
import com.fr.design.designer.IntervalConstants; |
||||
import com.fr.design.gui.ilable.UILabel; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.design.layout.TableLayoutHelper; |
||||
import com.fr.design.mainframe.widget.UITitleSplitLine; |
||||
import com.fr.design.mainframe.widget.preview.MobileTemplatePreviewPane; |
||||
import com.fr.form.ui.CardSwitchButton; |
||||
import com.fr.form.ui.container.cardlayout.WCardTagLayout; |
||||
import com.fr.general.FRFont; |
||||
import com.fr.general.cardtag.mobile.DownMenuStyle; |
||||
import com.fr.general.cardtag.mobile.LineDescription; |
||||
import com.fr.general.cardtag.mobile.MobileTemplateStyle; |
||||
import javax.swing.BorderFactory; |
||||
import javax.swing.JPanel; |
||||
import javax.swing.event.ChangeEvent; |
||||
import javax.swing.event.ChangeListener; |
||||
import java.awt.Color; |
||||
import java.awt.Component; |
||||
import java.awt.Dimension; |
||||
import java.awt.FlowLayout; |
||||
import java.awt.FontMetrics; |
||||
import java.awt.Graphics; |
||||
import java.awt.Graphics2D; |
||||
import java.awt.RenderingHints; |
||||
import java.awt.Stroke; |
||||
import java.util.ArrayList; |
||||
|
||||
public class DownMenuStyleDefinePane extends StyleDefinePaneWithSelectConf { |
||||
private LinePane splitLinePane; |
||||
private TabIconConfigPane initIconConfigPane; |
||||
private TabIconConfigPane selectIconConfigPane; |
||||
|
||||
public DownMenuStyleDefinePane(WCardTagLayout tagLayout) { |
||||
super(tagLayout); |
||||
} |
||||
|
||||
protected void createExtraConfPane(JPanel centerPane) { |
||||
JPanel panel = FRGUIPaneFactory.createVerticalFlowLayout_Pane(true, FlowLayout.LEADING, 0, 0); |
||||
panel.setBorder(BorderFactory.createEmptyBorder(0, 20, 5, 20)); |
||||
UITitleSplitLine iconSplitLine = new UITitleSplitLine(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Icon"), 520); |
||||
iconSplitLine.setPreferredSize(new Dimension(520, 20)); |
||||
centerPane.add(iconSplitLine); |
||||
|
||||
initIconConfigPane = new TabIconConfigPane(getTagLayout().getWidgetCount()); |
||||
selectIconConfigPane = new TabIconConfigPane(getTagLayout().getWidgetCount()); |
||||
|
||||
UILabel initIconLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Mobile_Initial_Icon")); |
||||
UILabel selectIconLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Mobile_Select_Icon")); |
||||
initIconLabel.setPreferredSize(new Dimension(55, 20)); |
||||
selectIconLabel.setPreferredSize(new Dimension(55, 20)); |
||||
JPanel initIconContainPane = TableLayoutHelper.createGapTableLayoutPane(new Component[][]{new Component[]{initIconLabel, initIconConfigPane}}, TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_L1, LayoutConstants.VGAP_MEDIUM); |
||||
JPanel selectIconContainePane = TableLayoutHelper.createGapTableLayoutPane(new Component[][]{new Component[]{selectIconLabel, selectIconConfigPane}}, TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_L1, LayoutConstants.VGAP_MEDIUM); |
||||
initIconContainPane.setPreferredSize(new Dimension(240, 50)); |
||||
selectIconContainePane.setPreferredSize(new Dimension(240, 50)); |
||||
panel.add(initIconContainPane); |
||||
panel.add(selectIconContainePane); |
||||
UITitleSplitLine splitLine = new UITitleSplitLine(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Mobile_Spit_Line"), 520); |
||||
splitLine.setPreferredSize(new Dimension(520, 20)); |
||||
splitLinePane = new LinePane(); |
||||
splitLinePane.addLineChangeListener(new ChangeListener() { |
||||
@Override |
||||
public void stateChanged(ChangeEvent e) { |
||||
updatePreviewPane(); |
||||
} |
||||
}); |
||||
centerPane.add(panel); |
||||
centerPane.add(splitLine); |
||||
centerPane.add(splitLinePane); |
||||
} |
||||
|
||||
@Override |
||||
protected void initDefaultConfig() { |
||||
this.initialColorBox.setSelectObject(DownMenuStyle.DEFAULT_INITIAL_COLOR); |
||||
this.fontConfPane.populate(DownMenuStyle.DEFAULT_TAB_FONT.getFont()); |
||||
this.selectColorBox.setSelectObject(DownMenuStyle.DEFAULT_SELECT_COLOR); |
||||
this.selectFontColor.setColor(DownMenuStyle.DEFAULT_SELECT_FONT_COLOR); |
||||
this.splitLinePane.populate(DownMenuStyle.DEFAULT_SPLIT_LINE); |
||||
} |
||||
|
||||
@Override |
||||
protected MobileTemplatePreviewPane createPreviewPane() { |
||||
return new DownMenuStylePreviewPane(); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public void populateSubStyle(MobileTemplateStyle ob) { |
||||
super.populateSubStyle(ob); |
||||
DownMenuStyle downMenuStyle = (DownMenuStyle) ob; |
||||
splitLinePane.populate(downMenuStyle.getSplitLine()); |
||||
ArrayList<String> initialIconNames = new ArrayList<String>(); |
||||
ArrayList<String> selectIconNames = new ArrayList<String>(); |
||||
for (int i = 0; i < getTagLayout().getWidgetCount(); i++) { |
||||
CardSwitchButton cardSwitchButton = (CardSwitchButton) getTagLayout().getWidget(i); |
||||
initialIconNames.add(cardSwitchButton.getInitIconName()); |
||||
selectIconNames.add(cardSwitchButton.getSelectIconName()); |
||||
} |
||||
initIconConfigPane.populate(initialIconNames); |
||||
selectIconConfigPane.populate(selectIconNames); |
||||
} |
||||
|
||||
@Override |
||||
protected MobileTemplateStyle getDefaultTemplateStyle() { |
||||
return new DownMenuStyle(); |
||||
} |
||||
|
||||
@Override |
||||
public MobileTemplateStyle updateStyleWithSelectConf() { |
||||
DownMenuStyle downMenuStyle = new DownMenuStyle(); |
||||
downMenuStyle.setSplitLine(splitLinePane.update()); |
||||
ArrayList<String> initialIconNames = initIconConfigPane.update(); |
||||
ArrayList<String> selectIconNames = selectIconConfigPane.update(); |
||||
for (int i = 0; i < getTagLayout().getWidgetCount(); i++) { |
||||
CardSwitchButton cardSwitchButton = (CardSwitchButton) getTagLayout().getWidget(i); |
||||
cardSwitchButton.setInitIconName(initialIconNames.get(i)); |
||||
cardSwitchButton.setSelectIconName(selectIconNames.get(i)); |
||||
} |
||||
return downMenuStyle; |
||||
} |
||||
|
||||
@Override |
||||
protected String title4PopupWindow() { |
||||
return null; |
||||
} |
||||
|
||||
public class DownMenuStylePreviewPane extends MobileTemplatePreviewPane { |
||||
private static final int ICON_OFFSET = 16; |
||||
private static final int GAP = 6; |
||||
private static final String PAINT_ICON = "fund_white"; |
||||
private static final String ICON_PATH = "/com/fr/web/images/fund_white.png"; |
||||
private LineDescription splitLine; |
||||
|
||||
public DownMenuStylePreviewPane() { |
||||
this.setBackground(Color.decode("#3888EE")); |
||||
} |
||||
|
||||
public void repaint() { |
||||
super.repaint(); |
||||
} |
||||
|
||||
@Override |
||||
public void paint(Graphics g) { |
||||
super.paint(g); |
||||
Color selectFontColor = this.getTabFontConfig().getSelectColor(); |
||||
Dimension dimension = this.getSize(); |
||||
int panelWidth = dimension.width; |
||||
int panelHeight = dimension.height; |
||||
Graphics2D g2d = (Graphics2D) g.create(); |
||||
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); |
||||
FRFont frFont = this.getTabFontConfig().getFont(); |
||||
FontMetrics fm = GraphHelper.getFontMetrics(frFont); |
||||
WCardTagLayout cardTagLayout = DownMenuStyleDefinePane.this.getTagLayout(); |
||||
int eachWidth = panelWidth / cardTagLayout.getWidgetCount(); |
||||
g2d.setFont(frFont); |
||||
int fontHeight = fm.getHeight(); |
||||
int ascent = fm.getAscent(); |
||||
for (int i = 0; i < cardTagLayout.getWidgetCount(); i++) { |
||||
g2d.setColor(i == 0 ? selectFontColor : frFont.getForeground()); |
||||
CardSwitchButton cardSwitchButton = cardTagLayout.getSwitchButton(i); |
||||
String displayName = calculateDisplayName(cardSwitchButton.getText(), fm, eachWidth); |
||||
int width = fm.stringWidth(displayName); |
||||
if(i == 0){ |
||||
Color oldColor = g2d.getColor(); |
||||
g2d.setColor(this.getSelectColor()); |
||||
g2d.fillRect(0, 0 ,eachWidth, panelHeight); |
||||
g2d.setColor(oldColor); |
||||
} |
||||
Icon icon = new Icon(PAINT_ICON, ICON_PATH); |
||||
g2d.drawImage(IconManager.getIconManager().getDefaultIconImage(icon), (eachWidth - ICON_OFFSET) / 2, (panelHeight - ICON_OFFSET - GAP - fontHeight) / 2, null); |
||||
g2d.drawString(displayName, (eachWidth - width) / 2, (panelHeight + ICON_OFFSET + GAP - fontHeight) / 2 + ascent); |
||||
Stroke oldStroke = g2d.getStroke(); |
||||
if (splitLine.getLineStyle() != 0) { |
||||
g2d.setColor(splitLine.getColor()); |
||||
g2d.setStroke(GraphHelper.getStroke(splitLine.getLineStyle())); |
||||
g2d.drawLine(eachWidth, 0, eachWidth, panelHeight); |
||||
} |
||||
g2d.setStroke(oldStroke); |
||||
g2d.translate(eachWidth, 0); |
||||
|
||||
} |
||||
|
||||
} |
||||
|
||||
public void populateConfig(MobileTemplateStyle templateStyle) { |
||||
super.populateConfig(templateStyle); |
||||
this.splitLine = ((DownMenuStyle) templateStyle).getSplitLine(); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,107 @@
|
||||
package com.fr.design.mainframe.mobile.ui; |
||||
|
||||
import com.fr.design.constants.LayoutConstants; |
||||
import com.fr.design.designer.IntervalConstants; |
||||
import com.fr.design.gui.icombobox.LineComboBox; |
||||
import com.fr.design.gui.ilable.UILabel; |
||||
import com.fr.design.layout.TableLayoutHelper; |
||||
import com.fr.design.layout.VerticalFlowLayout; |
||||
import com.fr.design.style.color.NewColorSelectBox; |
||||
import com.fr.general.cardtag.mobile.LineDescription; |
||||
import com.fr.stable.CoreConstants; |
||||
import javax.swing.BorderFactory; |
||||
import javax.swing.JPanel; |
||||
import javax.swing.event.ChangeEvent; |
||||
import javax.swing.event.ChangeListener; |
||||
import javax.swing.event.EventListenerList; |
||||
import java.awt.Component; |
||||
import java.awt.Dimension; |
||||
import java.awt.FlowLayout; |
||||
import java.awt.event.ItemEvent; |
||||
import java.awt.event.ItemListener; |
||||
|
||||
public class LinePane extends JPanel { |
||||
private LineComboBox lineStyle; |
||||
private NewColorSelectBox lineColor; |
||||
private EventListenerList lineChangeListener = new EventListenerList(); |
||||
|
||||
public LinePane() { |
||||
init(); |
||||
} |
||||
|
||||
private void init() { |
||||
this.setLayout(new VerticalFlowLayout(FlowLayout.CENTER, 0, 10)); |
||||
this.setBorder(BorderFactory.createEmptyBorder(0, 20, 5, 20)); |
||||
UILabel lineLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_FRFont_Line_Style")); |
||||
UILabel colorLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Colors")); |
||||
lineLabel.setPreferredSize(new Dimension(55, 20)); |
||||
colorLabel.setPreferredSize(new Dimension(55, 20)); |
||||
|
||||
lineStyle = new LineComboBox(CoreConstants.UNDERLINE_STYLE_ARRAY); |
||||
lineStyle.setPreferredSize(new Dimension(152, 20)); |
||||
lineColor = new NewColorSelectBox(137); |
||||
lineStyle.addItemListener(new ItemListener() { |
||||
@Override |
||||
public void itemStateChanged(ItemEvent e) { |
||||
fireLineStateChanged(); |
||||
} |
||||
}); |
||||
lineColor.addSelectChangeListener(new ChangeListener() { |
||||
@Override |
||||
public void stateChanged(ChangeEvent e) { |
||||
fireLineStateChanged(); |
||||
} |
||||
}); |
||||
this.add(TableLayoutHelper.createGapTableLayoutPane(new Component[][]{new Component[]{lineLabel, lineStyle}}, TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_L1, LayoutConstants.VGAP_MEDIUM)); |
||||
this.add(TableLayoutHelper.createGapTableLayoutPane(new Component[][]{new Component[]{colorLabel, lineColor}}, TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_L1, LayoutConstants.VGAP_MEDIUM)); |
||||
} |
||||
|
||||
public LineDescription update() { |
||||
LineDescription lineDescription = new LineDescription(); |
||||
lineDescription.setColor(lineColor.getSelectObject()); |
||||
lineDescription.setLineStyle(lineStyle.getSelectedLineStyle()); |
||||
return lineDescription; |
||||
} |
||||
|
||||
public void populate(LineDescription lineDescription) { |
||||
lineStyle.setSelectedLineStyle(lineDescription.getLineStyle()); |
||||
lineColor.setSelectObject(lineDescription.getColor()); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* 添加监听 |
||||
* |
||||
* @param changeListener 监听列表 |
||||
*/ |
||||
public void addLineChangeListener(ChangeListener changeListener) { |
||||
lineChangeListener.add(ChangeListener.class, changeListener); |
||||
} |
||||
|
||||
/** |
||||
* 移除监听 |
||||
* Removes an old ColorChangeListener. |
||||
* |
||||
* @param changeListener 监听列表 |
||||
*/ |
||||
public void removeLineChangeListener(ChangeListener changeListener) { |
||||
lineChangeListener.remove(ChangeListener.class, changeListener); |
||||
} |
||||
|
||||
/** |
||||
* 颜色状态改变 |
||||
*/ |
||||
public void fireLineStateChanged() { |
||||
Object[] listeners = lineChangeListener.getListenerList(); |
||||
ChangeEvent e = null; |
||||
|
||||
for (int i = listeners.length - 2; i >= 0; i -= 2) { |
||||
if (listeners[i] == ChangeListener.class) { |
||||
if (e == null) { |
||||
e = new ChangeEvent(this); |
||||
} |
||||
((ChangeListener) listeners[i + 1]).stateChanged(e); |
||||
} |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,235 @@
|
||||
package com.fr.design.mainframe.mobile.ui; |
||||
|
||||
import com.fr.design.beans.BasicBeanPane; |
||||
import com.fr.design.constants.LayoutConstants; |
||||
import com.fr.design.designer.IntervalConstants; |
||||
import com.fr.design.dialog.AttrScrollPane; |
||||
import com.fr.design.dialog.BasicScrollPane; |
||||
import com.fr.design.gui.icombobox.UIComboBox; |
||||
import com.fr.design.gui.ilable.UILabel; |
||||
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.NewColorSelectBox; |
||||
import com.fr.design.utils.gui.GUICoreUtils; |
||||
import com.fr.form.ui.CardSwitchButton; |
||||
import com.fr.form.ui.container.cardlayout.WCardTagLayout; |
||||
import com.fr.general.FRFont; |
||||
import com.fr.general.cardtag.mobile.MobileTemplateStyle; |
||||
import com.fr.general.cardtag.mobile.TabFontConfig; |
||||
import com.fr.stable.StringUtils; |
||||
|
||||
import javax.swing.BorderFactory; |
||||
import javax.swing.JPanel; |
||||
import javax.swing.border.TitledBorder; |
||||
import javax.swing.event.ChangeEvent; |
||||
import javax.swing.event.ChangeListener; |
||||
import java.awt.BorderLayout; |
||||
import java.awt.Color; |
||||
import java.awt.Component; |
||||
import java.awt.Dimension; |
||||
import java.awt.FlowLayout; |
||||
import java.awt.Font; |
||||
import java.awt.event.ItemEvent; |
||||
import java.awt.event.ItemListener; |
||||
|
||||
public abstract class MobileTemplateStyleDefinePane extends BasicBeanPane<MobileTemplateStyle> { |
||||
private static final String[] TAB_STYLES = new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Widget_Style_Standard"), |
||||
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_Custom")}; |
||||
private UIComboBox custom; |
||||
protected NewColorSelectBox initialColorBox; |
||||
protected MobileTabFontConfPane fontConfPane; |
||||
private JPanel centerPane; |
||||
protected MobileTemplatePreviewPane previewPane; |
||||
private WCardTagLayout tagLayout; |
||||
|
||||
|
||||
public MobileTemplatePreviewPane getPreviewPane() { |
||||
return previewPane; |
||||
} |
||||
|
||||
public MobileTemplateStyleDefinePane(WCardTagLayout tagLayout) { |
||||
this.tagLayout = tagLayout; |
||||
init(); |
||||
} |
||||
|
||||
|
||||
public WCardTagLayout getTagLayout() { |
||||
return tagLayout; |
||||
} |
||||
|
||||
protected void init() { |
||||
this.setLayout(FRGUIPaneFactory.createBorderLayout()); |
||||
previewPane = createPreviewPane(); |
||||
previewPane.setPreferredSize(new Dimension(500, 60)); |
||||
JPanel northPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||
TitledBorder titledBorder = GUICoreUtils.createTitledBorder(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Preview"), null); |
||||
titledBorder.setTitleFont(FRFont.getInstance("PingFangSC-Regular", Font.PLAIN, 9, Color.BLUE)); |
||||
northPane.setBorder(titledBorder); |
||||
northPane.setPreferredSize(new Dimension(500, 83)); |
||||
northPane.add(previewPane, BorderLayout.CENTER); |
||||
this.add(northPane, BorderLayout.NORTH); |
||||
createConfigPane(); |
||||
|
||||
} |
||||
|
||||
protected void createConfigPane() { |
||||
JPanel configPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||
TitledBorder titledBorder = GUICoreUtils.createTitledBorder(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Set"), null); |
||||
titledBorder.setTitleFont(FRFont.getInstance("PingFangSC-Regular", Font.PLAIN, 9, Color.BLUE)); |
||||
configPane.setBorder(titledBorder); |
||||
centerPane = createCenterPane(); |
||||
custom = new UIComboBox(TAB_STYLES); |
||||
custom.addItemListener(new ItemListener() { |
||||
@Override |
||||
public void itemStateChanged(ItemEvent e) { |
||||
boolean isCustom = custom.getSelectedIndex() == 1; |
||||
centerPane.setVisible(isCustom); |
||||
updatePreviewPane(); |
||||
} |
||||
}); |
||||
centerPane.setVisible(false); |
||||
custom.setPreferredSize(new Dimension(157, 20)); |
||||
final JPanel scrollPanel = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||
BasicScrollPane basicScrollPane = new AttrScrollPane() { |
||||
@Override |
||||
protected JPanel createContentPane() { |
||||
return scrollPanel; |
||||
} |
||||
}; |
||||
configPane.add(basicScrollPane, BorderLayout.CENTER); |
||||
this.add(configPane, BorderLayout.CENTER); |
||||
|
||||
JPanel outPanel = FRGUIPaneFactory.createBoxFlowInnerContainer_S_Pane(); |
||||
outPanel.setBorder(BorderFactory.createEmptyBorder(10, 20, 5, 20)); |
||||
UILabel tabStyleLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Mobile_Tab_Style")); |
||||
tabStyleLabel.setPreferredSize(new Dimension(55, 20)); |
||||
JPanel jPanel = TableLayoutHelper.createGapTableLayoutPane(new Component[][]{new Component[]{tabStyleLabel, custom}}, TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_L1, LayoutConstants.VGAP_MEDIUM); |
||||
jPanel.setPreferredSize(new Dimension(200, 20)); |
||||
outPanel.add(jPanel); |
||||
scrollPanel.add(outPanel, BorderLayout.NORTH); |
||||
|
||||
UITitleSplitLine backgroundSplit = new UITitleSplitLine(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Background"), 520); |
||||
backgroundSplit.setPreferredSize(new Dimension(520, 20)); |
||||
centerPane.add(backgroundSplit); |
||||
|
||||
centerPane.add(createBackgroundConfPane()); |
||||
|
||||
UITitleSplitLine fontSplit = new UITitleSplitLine(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Mobile_Tab_Char"), 520); |
||||
fontSplit.setPreferredSize(new Dimension(520, 20)); |
||||
centerPane.add(fontSplit); |
||||
|
||||
centerPane.add(createFontConfPane()); |
||||
|
||||
createExtraConfPane(centerPane); |
||||
|
||||
scrollPanel.add(centerPane, BorderLayout.CENTER); |
||||
initDefaultConfig(); |
||||
} |
||||
|
||||
protected JPanel createCenterPane() { |
||||
JPanel panel = FRGUIPaneFactory.createVerticalFlowLayout_Pane(true, FlowLayout.LEADING, 0, 10); |
||||
return panel; |
||||
} |
||||
|
||||
protected JPanel createBackgroundConfPane() { |
||||
initialColorBox = new NewColorSelectBox(137); |
||||
initialColorBox.addSelectChangeListener(new ChangeListener() { |
||||
@Override |
||||
public void stateChanged(ChangeEvent e) { |
||||
updatePreviewPane(); |
||||
} |
||||
}); |
||||
UILabel fillLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Fill")); |
||||
fillLabel.setPreferredSize(new Dimension(55, 20)); |
||||
|
||||
JPanel jPanel = TableLayoutHelper.createGapTableLayoutPane(new Component[][]{new Component[]{fillLabel, initialColorBox}}, TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_L1, LayoutConstants.VGAP_MEDIUM); |
||||
jPanel.setPreferredSize(new Dimension(240, 20)); |
||||
initialColorBox.setPreferredSize(new Dimension(157, 20)); |
||||
jPanel.setBorder(BorderFactory.createEmptyBorder(0, 20, 5, 20)); |
||||
return jPanel; |
||||
} |
||||
|
||||
protected JPanel createFontConfPane() { |
||||
fontConfPane = new MobileTabFontConfPane(); |
||||
fontConfPane.addFontChangeListener(new ChangeListener() { |
||||
@Override |
||||
public void stateChanged(ChangeEvent e) { |
||||
updatePreviewPane(); |
||||
} |
||||
}); |
||||
UILabel initCharLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Mobile_Tab_Init_Char")); |
||||
initCharLabel.setPreferredSize(new Dimension(55, 20)); |
||||
JPanel jPanel3 = GUICoreUtils.createBoxFlowInnerContainerPane(5, 0); |
||||
jPanel3.add(initCharLabel); |
||||
jPanel3.add(fontConfPane); |
||||
jPanel3.setBorder(BorderFactory.createEmptyBorder(0, 20, 0, 20)); |
||||
return jPanel3; |
||||
} |
||||
|
||||
|
||||
protected void createExtraConfPane(JPanel centerPane) { |
||||
|
||||
} |
||||
|
||||
protected abstract void initDefaultConfig(); |
||||
|
||||
protected abstract MobileTemplatePreviewPane createPreviewPane(); |
||||
|
||||
@Override |
||||
public void populateBean(MobileTemplateStyle ob) { |
||||
centerPane.setVisible(ob.isCustom()); |
||||
populateSubStyle(ob); |
||||
custom.setSelectedItem(!ob.isCustom() ? com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Default") : |
||||
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_Custom")); |
||||
initialColorBox.setSelectObject(ob.getInitialColor()); |
||||
fontConfPane.populate(ob.getTabFontConfig().getFont()); |
||||
updatePreviewPane(); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public MobileTemplateStyle updateBean() { |
||||
//保存之前需要先将cardSwitchBtn的icon设置清空
|
||||
for (int i = 0; i < getTagLayout().getWidgetCount(); i++) { |
||||
CardSwitchButton cardSwitchButton = (CardSwitchButton) getTagLayout().getWidget(i); |
||||
cardSwitchButton.setInitIconName(StringUtils.EMPTY); |
||||
cardSwitchButton.setSelectIconName(StringUtils.EMPTY); |
||||
} |
||||
return updateConfig(); |
||||
} |
||||
|
||||
public MobileTemplateStyle updateConfig(){ |
||||
if (custom.getSelectedIndex() == 0) { |
||||
return getDefaultTemplateStyle(); |
||||
} |
||||
MobileTemplateStyle ob = updateSubStyle(); |
||||
ob.setCustom(custom.getSelectedIndex() == 1); |
||||
ob.setInitialColor(initialColorBox.getSelectObject()); |
||||
TabFontConfig config = new TabFontConfig(); |
||||
config.setSelectColor(ob.getTabFontConfig().getSelectColor()); |
||||
config.setFont(fontConfPane.update()); |
||||
ob.setTabFontConfig(config); |
||||
return ob; |
||||
} |
||||
|
||||
protected abstract MobileTemplateStyle getDefaultTemplateStyle(); |
||||
|
||||
public void updatePreviewPane() { |
||||
previewPane.populateConfig(updateConfig()); |
||||
previewPane.setBackground(previewPane.getInitialColor()); |
||||
previewPane.repaint(); |
||||
} |
||||
|
||||
public abstract void populateSubStyle(MobileTemplateStyle ob); |
||||
|
||||
public abstract MobileTemplateStyle updateSubStyle(); |
||||
|
||||
|
||||
@Override |
||||
protected String title4PopupWindow() { |
||||
return null; |
||||
} |
||||
} |
@ -0,0 +1,166 @@
|
||||
package com.fr.design.mainframe.mobile.ui; |
||||
|
||||
import com.fr.base.GraphHelper; |
||||
import com.fr.design.constants.LayoutConstants; |
||||
import com.fr.design.designer.IntervalConstants; |
||||
import com.fr.design.gui.ilable.UILabel; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.design.layout.TableLayoutHelper; |
||||
import com.fr.design.mainframe.widget.UITitleSplitLine; |
||||
import com.fr.design.mainframe.widget.preview.MobileTemplatePreviewPane; |
||||
import com.fr.design.style.color.NewColorSelectBox; |
||||
import com.fr.form.ui.container.cardlayout.WCardTagLayout; |
||||
import com.fr.general.FRFont; |
||||
import com.fr.general.cardtag.mobile.MobileTemplateStyle; |
||||
import com.fr.general.cardtag.mobile.SliderStyle; |
||||
import javax.swing.BorderFactory; |
||||
import javax.swing.JPanel; |
||||
import javax.swing.event.ChangeEvent; |
||||
import javax.swing.event.ChangeListener; |
||||
import java.awt.Color; |
||||
import java.awt.Component; |
||||
import java.awt.Dimension; |
||||
import java.awt.FlowLayout; |
||||
import java.awt.FontMetrics; |
||||
import java.awt.Graphics; |
||||
import java.awt.Graphics2D; |
||||
import java.awt.RenderingHints; |
||||
|
||||
public class SliderStyleDefinePane extends MobileTemplateStyleDefinePane { |
||||
private NewColorSelectBox initDotColor; |
||||
private NewColorSelectBox selectDotColor; |
||||
|
||||
|
||||
public SliderStyleDefinePane(WCardTagLayout tagLayout) { |
||||
super(tagLayout); |
||||
} |
||||
|
||||
@Override |
||||
public void populateSubStyle(MobileTemplateStyle ob) { |
||||
SliderStyle sliderStyle = (SliderStyle) ob; |
||||
initDotColor.setSelectObject(sliderStyle.getInitDotColor()); |
||||
selectDotColor.setSelectObject(sliderStyle.getSelectDotColor()); |
||||
} |
||||
|
||||
@Override |
||||
protected MobileTemplateStyle getDefaultTemplateStyle() { |
||||
return new SliderStyle(); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public MobileTemplateStyle updateSubStyle() { |
||||
SliderStyle sliderStyle = new SliderStyle(); |
||||
sliderStyle.setInitDotColor(initDotColor.getSelectObject()); |
||||
sliderStyle.setSelectDotColor(selectDotColor.getSelectObject()); |
||||
return sliderStyle; |
||||
} |
||||
|
||||
|
||||
protected void createExtraConfPane(JPanel centerPane) { |
||||
JPanel panel = FRGUIPaneFactory.createVerticalFlowLayout_Pane(true, FlowLayout.LEADING, 0, 10); |
||||
panel.setBorder(BorderFactory.createEmptyBorder(0, 20, 5, 20)); |
||||
UITitleSplitLine dotIndicator = new UITitleSplitLine(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Mobile_Slider_Dot_Indicator"), 520); |
||||
dotIndicator.setPreferredSize(new Dimension(520, 20)); |
||||
centerPane.add(dotIndicator); |
||||
initDotColor = new NewColorSelectBox(137); |
||||
initDotColor.addSelectChangeListener(new ChangeListener() { |
||||
@Override |
||||
public void stateChanged(ChangeEvent e) { |
||||
updatePreviewPane(); |
||||
} |
||||
}); |
||||
selectDotColor = new NewColorSelectBox(137); |
||||
selectDotColor.addSelectChangeListener(new ChangeListener() { |
||||
@Override |
||||
public void stateChanged(ChangeEvent e) { |
||||
updatePreviewPane(); |
||||
} |
||||
}); |
||||
UILabel initColor = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Mobile_Init_Fill")); |
||||
|
||||
UILabel selectColor = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Mobile_Select_Fill")); |
||||
initColor.setPreferredSize(new Dimension(55, 20)); |
||||
selectColor.setPreferredSize(new Dimension(55, 20)); |
||||
JPanel initDotColorPane = TableLayoutHelper.createGapTableLayoutPane(new Component[][]{new Component[]{initColor, initDotColor}}, TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_L1, LayoutConstants.VGAP_MEDIUM); |
||||
JPanel selectDotColorPane = TableLayoutHelper.createGapTableLayoutPane(new Component[][]{new Component[]{selectColor, selectDotColor}}, TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_L1, LayoutConstants.VGAP_MEDIUM); |
||||
initDotColorPane.setPreferredSize(new Dimension(240, 20)); |
||||
selectDotColorPane.setPreferredSize(new Dimension(240, 20)); |
||||
panel.add(initDotColorPane); |
||||
panel.add(selectDotColorPane); |
||||
centerPane.add(panel); |
||||
} |
||||
|
||||
@Override |
||||
protected void initDefaultConfig() { |
||||
this.initialColorBox.setSelectObject(SliderStyle.DEFAULT_INITIAL_COLOR); |
||||
this.fontConfPane.populate(SliderStyle.DEFAULT_TAB_FONT.getFont()); |
||||
initDotColor.setSelectObject(SliderStyle.DEFAULT_INITIAL_DOT_COLOR); |
||||
selectDotColor.setSelectObject(SliderStyle.DEFAULT_SELECT_DOT_COLOR); |
||||
} |
||||
|
||||
@Override |
||||
protected MobileTemplatePreviewPane createPreviewPane() { |
||||
return new SliderStylePreviewPane(); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
protected String title4PopupWindow() { |
||||
return null; |
||||
} |
||||
|
||||
|
||||
public class SliderStylePreviewPane extends MobileTemplatePreviewPane { |
||||
private static final int CIRCLE_SIZE = 6; |
||||
private static final int GAP = 4; |
||||
private static final int OFFSET_X = 10; |
||||
private Color initDotColor; |
||||
private Color selectDotColor; |
||||
|
||||
public SliderStylePreviewPane() { |
||||
|
||||
} |
||||
|
||||
public void repaint() { |
||||
super.repaint(); |
||||
} |
||||
|
||||
@Override |
||||
public void paint(Graphics g) { |
||||
super.paint(g); |
||||
Dimension dimension = this.getSize(); |
||||
int panelHeight = dimension.height; |
||||
Graphics2D g2d = (Graphics2D) g.create(); |
||||
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); |
||||
FRFont frFont = this.getTabFontConfig().getFont(); |
||||
g2d.setFont(frFont); |
||||
g2d.setColor(frFont.getForeground()); |
||||
FontMetrics fm = GraphHelper.getFontMetrics(frFont); |
||||
int fontHeight = fm.getHeight(); |
||||
int ascent = fm.getAscent(); |
||||
g2d.drawString(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Mobile_Slider_Title"), OFFSET_X, (panelHeight - fontHeight - GAP - CIRCLE_SIZE) / 2 + ascent); |
||||
WCardTagLayout cardTagLayout = SliderStyleDefinePane.this.getTagLayout(); |
||||
g2d.translate(OFFSET_X, (panelHeight + fontHeight + GAP - CIRCLE_SIZE) / 2); |
||||
for (int i = 0; i < cardTagLayout.getWidgetCount(); i++) { |
||||
if (i == 0) { |
||||
g2d.setColor(selectDotColor); |
||||
g2d.fillOval(0, 0, CIRCLE_SIZE, CIRCLE_SIZE); |
||||
g2d.translate(CIRCLE_SIZE + GAP, 0); |
||||
continue; |
||||
} |
||||
g2d.setColor(initDotColor); |
||||
g2d.fillOval(0, 0, CIRCLE_SIZE, CIRCLE_SIZE); |
||||
g2d.translate(CIRCLE_SIZE + GAP, 0); |
||||
} |
||||
|
||||
} |
||||
|
||||
public void populateConfig(MobileTemplateStyle templateStyle) { |
||||
super.populateConfig(templateStyle); |
||||
this.initDotColor = ((SliderStyle) templateStyle).getInitDotColor(); |
||||
this.selectDotColor = ((SliderStyle) templateStyle).getSelectDotColor(); |
||||
} |
||||
} |
||||
|
||||
} |
@ -0,0 +1,114 @@
|
||||
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.ilable.UILabel; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.design.layout.TableLayoutHelper; |
||||
import com.fr.design.mainframe.widget.MobileTabFontConfPane; |
||||
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 javax.swing.BorderFactory; |
||||
import javax.swing.JPanel; |
||||
import javax.swing.event.ChangeEvent; |
||||
import javax.swing.event.ChangeListener; |
||||
import java.awt.Component; |
||||
import java.awt.Dimension; |
||||
import java.awt.FlowLayout; |
||||
|
||||
public abstract class StyleDefinePaneWithSelectConf extends MobileTemplateStyleDefinePane { |
||||
|
||||
protected NewColorSelectBox selectColorBox; |
||||
protected UIColorButton selectFontColor; |
||||
|
||||
public StyleDefinePaneWithSelectConf(WCardTagLayout tagLayout) { |
||||
super(tagLayout); |
||||
} |
||||
|
||||
protected JPanel createBackgroundConfPane() { |
||||
JPanel panel = FRGUIPaneFactory.createVerticalFlowLayout_Pane(true, FlowLayout.LEADING, 0, 10); |
||||
panel.setBorder(BorderFactory.createEmptyBorder(0, 20, 5, 20)); |
||||
initialColorBox = new NewColorSelectBox(137); |
||||
initialColorBox.addSelectChangeListener(new ChangeListener() { |
||||
@Override |
||||
public void stateChanged(ChangeEvent e) { |
||||
updatePreviewPane(); |
||||
} |
||||
}); |
||||
|
||||
selectColorBox = new NewColorSelectBox(137); |
||||
selectColorBox.addSelectChangeListener(new ChangeListener() { |
||||
@Override |
||||
public void stateChanged(ChangeEvent e) { |
||||
updatePreviewPane(); |
||||
} |
||||
}); |
||||
UILabel initFillLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Mobile_Init_Fill")); |
||||
UILabel selectFillLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Mobile_Select_Fill")); |
||||
initFillLabel.setPreferredSize(new Dimension(55, 20)); |
||||
selectFillLabel.setPreferredSize(new Dimension(55, 20)); |
||||
JPanel jPanel2 = TableLayoutHelper.createGapTableLayoutPane(new Component[][]{new Component[]{initFillLabel, initialColorBox}}, TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_L1, LayoutConstants.VGAP_MEDIUM); |
||||
JPanel jPanel3 = TableLayoutHelper.createGapTableLayoutPane(new Component[][]{new Component[]{selectFillLabel, selectColorBox}}, TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_L1, LayoutConstants.VGAP_MEDIUM); |
||||
jPanel2.setPreferredSize(new Dimension(240, 20)); |
||||
jPanel3.setPreferredSize(new Dimension(240, 20)); |
||||
panel.add(jPanel2); |
||||
panel.add(jPanel3); |
||||
return panel; |
||||
} |
||||
|
||||
protected JPanel createFontConfPane() { |
||||
JPanel panel = FRGUIPaneFactory.createVerticalFlowLayout_Pane(true, FlowLayout.LEADING, 0, 10); |
||||
panel.setBorder(BorderFactory.createEmptyBorder(0, 20, 5, 20)); |
||||
fontConfPane = new MobileTabFontConfPane(); |
||||
fontConfPane.addFontChangeListener(new ChangeListener() { |
||||
@Override |
||||
public void stateChanged(ChangeEvent e) { |
||||
updatePreviewPane(); |
||||
} |
||||
}); |
||||
selectFontColor = new UIColorButton(); |
||||
selectFontColor.addColorChangeListener(new ChangeListener() { |
||||
@Override |
||||
public void stateChanged(ChangeEvent e) { |
||||
|
||||
updatePreviewPane(); |
||||
} |
||||
}); |
||||
UILabel initCharLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Mobile_Tab_Init_Char")); |
||||
initCharLabel.setPreferredSize(new Dimension(55, 20)); |
||||
JPanel jPanel3 = TableLayoutHelper.createGapTableLayoutPane(new Component[][]{new Component[]{initCharLabel, fontConfPane}}, TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_L1, LayoutConstants.VGAP_MEDIUM); |
||||
jPanel3.setPreferredSize(new Dimension(500, 20)); |
||||
|
||||
UILabel selectCharLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Mobile_Tab_Select_Char")); |
||||
selectCharLabel.setPreferredSize(new Dimension(55, 20)); |
||||
selectFontColor.setPreferredSize(new Dimension(20, 20)); |
||||
JPanel jPanel4 = TableLayoutHelper.createGapTableLayoutPane(new Component[][]{new Component[]{selectCharLabel, selectFontColor}}, TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_L1, LayoutConstants.VGAP_MEDIUM); |
||||
JPanel jPanel5 = FRGUIPaneFactory.createLeftFlowZeroGapBorderPane(); |
||||
jPanel5.setPreferredSize(new Dimension(500, 20)); |
||||
jPanel5.add(jPanel4); |
||||
panel.add(jPanel3); |
||||
panel.add(jPanel5); |
||||
return panel; |
||||
} |
||||
|
||||
@Override |
||||
public MobileTemplateStyle updateSubStyle() { |
||||
MobileTemplateStyle mobileTemplateStyle = updateStyleWithSelectConf(); |
||||
mobileTemplateStyle.setSelectColor(selectColorBox.getSelectObject()); |
||||
TabFontConfig config = new TabFontConfig(); |
||||
config.setFont(mobileTemplateStyle.getTabFontConfig().getFont()); |
||||
config.setSelectColor(selectFontColor.getColor()); |
||||
mobileTemplateStyle.setTabFontConfig(config); |
||||
return mobileTemplateStyle; |
||||
} |
||||
|
||||
protected abstract MobileTemplateStyle updateStyleWithSelectConf(); |
||||
|
||||
public void populateSubStyle(MobileTemplateStyle ob) { |
||||
selectColorBox.setSelectObject(ob.getSelectColor()); |
||||
selectFontColor.setColor(ob.getTabFontConfig().getSelectColor()); |
||||
} |
||||
} |
@ -0,0 +1,182 @@
|
||||
package com.fr.design.mainframe.mobile.ui; |
||||
|
||||
import com.fr.base.IconManager; |
||||
import com.fr.design.dialog.BasicDialog; |
||||
import com.fr.design.dialog.DialogActionAdapter; |
||||
import com.fr.design.gui.ibutton.UIButton; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.design.mainframe.DesignerContext; |
||||
import com.fr.design.utils.DrawRoutines; |
||||
import com.fr.design.web.CustomIconPane; |
||||
import com.fr.form.ui.WidgetInfoConfig; |
||||
import com.fr.general.ComparatorUtils; |
||||
import com.fr.general.FRFont; |
||||
import javax.swing.BorderFactory; |
||||
import javax.swing.JComponent; |
||||
import javax.swing.JPanel; |
||||
import javax.swing.JToggleButton; |
||||
import javax.swing.event.ChangeEvent; |
||||
import javax.swing.event.ChangeListener; |
||||
import javax.swing.plaf.basic.BasicButtonUI; |
||||
import java.awt.BorderLayout; |
||||
import java.awt.Color; |
||||
import java.awt.Cursor; |
||||
import java.awt.Dimension; |
||||
import java.awt.FlowLayout; |
||||
import java.awt.Font; |
||||
import java.awt.Graphics; |
||||
import java.awt.Graphics2D; |
||||
import java.awt.Image; |
||||
import java.awt.event.ActionEvent; |
||||
import java.awt.event.ActionListener; |
||||
import java.util.ArrayList; |
||||
|
||||
public class TabIconConfigPane extends JPanel { |
||||
private UIButton editIconButton; |
||||
private String curIconName; |
||||
private IconButton selectIconButton; |
||||
private ArrayList<IconButton> iconButtons = new ArrayList<IconButton>(); |
||||
|
||||
public TabIconConfigPane(int count) { |
||||
initComp(count); |
||||
} |
||||
|
||||
public void initComp(int count) { |
||||
this.setLayout(FRGUIPaneFactory.createBorderLayout()); |
||||
JPanel panel = FRGUIPaneFactory.createLeftFlowZeroGapBorderPane(); |
||||
panel.setBorder(BorderFactory.createEmptyBorder(5, 0, 5, 0)); |
||||
editIconButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Edit")); |
||||
editIconButton.setFont(FRFont.getInstance("Helvetica", Font.PLAIN, 12, Color.decode("#3A383A"))); |
||||
editIconButton.setPreferredSize(new Dimension(62, 20)); |
||||
panel.add(editIconButton); |
||||
editIconButton.addActionListener(new ActionListener() { |
||||
public void actionPerformed(ActionEvent e) { |
||||
final CustomIconPane cip = new CustomIconPane(){ |
||||
protected String createDescriptionText(){ |
||||
return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Mobile_Custom_Icon_Message"); |
||||
} |
||||
}; |
||||
BasicDialog editDialog = cip.showWindow(DesignerContext.getDesignerFrame()); |
||||
editDialog.addDialogActionListener(new DialogActionAdapter() { |
||||
@Override |
||||
public void doOk() { |
||||
curIconName = cip.update(); |
||||
setShowIconImage(); |
||||
TabIconConfigPane.this.repaint(); |
||||
} |
||||
}); |
||||
editDialog.setVisible(true); |
||||
} |
||||
}); |
||||
editIconButton.setEnabled(false); |
||||
this.add(panel, BorderLayout.CENTER); |
||||
|
||||
JPanel northPane = new JPanel(); |
||||
northPane.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 0)); |
||||
for (int i = 0; i < count; i++) { |
||||
IconButton iconButton = new IconButton(""); |
||||
northPane.add(iconButton); |
||||
iconButtons.add(iconButton); |
||||
} |
||||
this.add(northPane, BorderLayout.NORTH); |
||||
} |
||||
|
||||
public void setShowIconImage() { |
||||
selectIconButton.setIconName(curIconName); |
||||
} |
||||
|
||||
public void populate(ArrayList<String> iconArr) { |
||||
for (int i = 0; i < iconButtons.size(); i++) { |
||||
iconButtons.get(i).setIconName(iconArr.get(i)); |
||||
} |
||||
} |
||||
|
||||
public ArrayList<String> update() { |
||||
ArrayList<String> iconNames = new ArrayList<String>(); |
||||
for (int i = 0; i < iconButtons.size(); i++) { |
||||
iconNames.add(iconButtons.get(i).getIconName()); |
||||
} |
||||
return iconNames; |
||||
} |
||||
|
||||
|
||||
private class IconButton extends JToggleButton implements ActionListener { |
||||
private String iconName; |
||||
private Image iconImage = null; |
||||
private static final int ICON_BUTTON_SIZE = 20; |
||||
private static final int ICON_X = 2; |
||||
private static final int ICON_Y = 2; |
||||
|
||||
public IconButton(String name) { |
||||
this.iconName = name; |
||||
this.addActionListener(this); |
||||
this.setBackground(Color.WHITE); |
||||
this.setCursor(new Cursor(Cursor.HAND_CURSOR)); |
||||
this.iconImage = WidgetInfoConfig.getInstance().getIconManager().getIconImage(name); |
||||
} |
||||
|
||||
@Override |
||||
public void updateUI() { |
||||
setUI(new BasicButtonUI() { |
||||
public void paint(Graphics g, JComponent c) { |
||||
super.paint(g, c); |
||||
} |
||||
}); |
||||
} |
||||
|
||||
protected void paintBorder(Graphics g) { |
||||
super.paintBorder(g); |
||||
if (ComparatorUtils.equals(this, selectIconButton)) { |
||||
DrawRoutines.drawRoundedBorder( |
||||
g, Color.decode("#419BF9"), 0, 0, 20, 20); |
||||
} else { |
||||
DrawRoutines.drawRoundedBorder( |
||||
g, Color.decode("#D9DADD"), 0, 0, 20, 20); |
||||
} |
||||
|
||||
} |
||||
|
||||
public String getIconName() { |
||||
return iconName; |
||||
} |
||||
|
||||
public void setIconName(String iconName) { |
||||
this.iconName = iconName; |
||||
this.iconImage = WidgetInfoConfig.getInstance().getIconManager().getIconImage(iconName); |
||||
} |
||||
|
||||
@Override |
||||
public void paintComponent(Graphics g) { |
||||
super.paintComponent(g); |
||||
Graphics2D g2d = (Graphics2D) g; |
||||
// carl:这里缩放显示 16 × 16
|
||||
if (iconImage != null) { |
||||
g2d.drawImage(iconImage, ICON_X, ICON_Y, IconManager.DEFAULT_ICONWIDTH, IconManager.DEFAULT_ICONHEIGHT, null); |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public Dimension getPreferredSize() { |
||||
return new Dimension(ICON_BUTTON_SIZE, ICON_BUTTON_SIZE); |
||||
} |
||||
|
||||
public void actionPerformed(ActionEvent evt) { |
||||
selectIconButton = this; |
||||
editIconButton.setEnabled(true); |
||||
TabIconConfigPane.this.repaint();// repaint
|
||||
} |
||||
|
||||
@Override |
||||
public void addChangeListener(ChangeListener changeListener) { |
||||
this.changeListener = changeListener; |
||||
} |
||||
|
||||
private void fireChagneListener() { |
||||
if (this.changeListener != null) { |
||||
ChangeEvent evt = new ChangeEvent(this); |
||||
this.changeListener.stateChanged(evt); |
||||
} |
||||
} |
||||
|
||||
} |
||||
} |
@ -0,0 +1,55 @@
|
||||
package com.fr.design.mainframe.mobile.ui; |
||||
|
||||
import com.fr.design.beans.BasicBeanPane; |
||||
import com.fr.form.ui.container.cardlayout.WCardTagLayout; |
||||
import com.fr.general.cardtag.mobile.DefaultMobileTemplateStyle; |
||||
import com.fr.general.cardtag.mobile.DownMenuStyle; |
||||
import com.fr.general.cardtag.mobile.MobileTemplateStyle; |
||||
import com.fr.general.cardtag.mobile.SliderStyle; |
||||
import com.fr.general.cardtag.mobile.UpMenuStyle; |
||||
import com.fr.invoke.Reflect; |
||||
import com.fr.log.FineLoggerFactory; |
||||
import java.util.HashMap; |
||||
import java.util.Map; |
||||
|
||||
public class TemplateStyleDefinePaneFactory { |
||||
private static Map<String, StyleDefinePaneUI> defineMap = new HashMap<String, StyleDefinePaneUI>(); |
||||
|
||||
static { |
||||
defineMap.put(DefaultMobileTemplateStyle.STYLE_NAME, new StyleDefinePaneUI(DefaultMobileStyleDefinePane.class)); |
||||
defineMap.put(UpMenuStyle.STYLE_NAME, new StyleDefinePaneUI(UpMenuStyleDefinePane.class)); |
||||
defineMap.put(DownMenuStyle.STYLE_NAME, new StyleDefinePaneUI(DownMenuStyleDefinePane.class)); |
||||
defineMap.put(SliderStyle.STYLE_NAME, new StyleDefinePaneUI(SliderStyleDefinePane.class)); |
||||
} |
||||
|
||||
public static BasicBeanPane<MobileTemplateStyle> createDefinePane(String style, WCardTagLayout tagLayout) { |
||||
StyleDefinePaneUI styleDefinePaneUI = defineMap.get(style); |
||||
if(styleDefinePaneUI == null){ |
||||
styleDefinePaneUI = defineMap.get(DefaultMobileTemplateStyle.STYLE_NAME); |
||||
} |
||||
Class<? extends BasicBeanPane<MobileTemplateStyle>> clazz = styleDefinePaneUI.getaClass(); |
||||
BasicBeanPane<MobileTemplateStyle> quickPane = null; |
||||
try { |
||||
quickPane = Reflect.on(clazz).create(tagLayout).get(); |
||||
} catch (Exception e) { |
||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||
} |
||||
return quickPane; |
||||
} |
||||
|
||||
private static class StyleDefinePaneUI { |
||||
private Class<? extends BasicBeanPane<MobileTemplateStyle>> aClass; |
||||
|
||||
public StyleDefinePaneUI(Class<? extends BasicBeanPane<MobileTemplateStyle>> aClass) { |
||||
this.aClass = aClass; |
||||
} |
||||
|
||||
public Class<? extends BasicBeanPane<MobileTemplateStyle>> getaClass() { |
||||
return aClass; |
||||
} |
||||
|
||||
public void setaClass(Class<? extends BasicBeanPane<MobileTemplateStyle>> aClass) { |
||||
this.aClass = aClass; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,221 @@
|
||||
package com.fr.design.mainframe.mobile.ui; |
||||
|
||||
import com.fr.base.GraphHelper; |
||||
import com.fr.design.constants.LayoutConstants; |
||||
import com.fr.design.designer.IntervalConstants; |
||||
import com.fr.design.gui.ibutton.UIRadioButton; |
||||
import com.fr.design.gui.ilable.UILabel; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.design.layout.TableLayoutHelper; |
||||
import com.fr.design.mainframe.widget.UITitleSplitLine; |
||||
import com.fr.design.mainframe.widget.preview.MobileTemplatePreviewPane; |
||||
import com.fr.form.ui.CardSwitchButton; |
||||
import com.fr.form.ui.container.cardlayout.WCardTagLayout; |
||||
import com.fr.general.FRFont; |
||||
import com.fr.general.cardtag.mobile.LineDescription; |
||||
import com.fr.general.cardtag.mobile.MobileTemplateStyle; |
||||
import com.fr.general.cardtag.mobile.UpMenuStyle; |
||||
import javax.swing.BorderFactory; |
||||
import javax.swing.ButtonGroup; |
||||
import javax.swing.JPanel; |
||||
import javax.swing.event.ChangeEvent; |
||||
import javax.swing.event.ChangeListener; |
||||
import java.awt.BorderLayout; |
||||
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.RenderingHints; |
||||
import java.awt.Stroke; |
||||
|
||||
public class UpMenuStyleDefinePane extends StyleDefinePaneWithSelectConf { |
||||
private UIRadioButton gapFix; |
||||
private UIRadioButton titleWidthFix; |
||||
private LinePane bottomBorderPane; |
||||
private LinePane underLinePane; |
||||
|
||||
public UpMenuStyleDefinePane(WCardTagLayout tagLayout) { |
||||
super(tagLayout); |
||||
} |
||||
|
||||
protected JPanel createCenterPane() { |
||||
JPanel panel = super.createCenterPane(); |
||||
UILabel displayGap = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Mobile_Display_Gap")); |
||||
displayGap.setPreferredSize(new Dimension(55, 20)); |
||||
gapFix = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Mobile_Gap_Fix")); |
||||
titleWidthFix = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Mobile_Title_Width_Fix")); |
||||
ButtonGroup buttonGroup = new ButtonGroup(); |
||||
titleWidthFix.setSelected(true); |
||||
buttonGroup.add(gapFix); |
||||
gapFix.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); |
||||
titleWidthFix.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); |
||||
buttonGroup.add(titleWidthFix); |
||||
gapFix.addChangeListener(new ChangeListener() { |
||||
@Override |
||||
public void stateChanged(ChangeEvent e) { |
||||
updatePreviewPane(); |
||||
} |
||||
}); |
||||
titleWidthFix.addChangeListener(new ChangeListener() { |
||||
@Override |
||||
public void stateChanged(ChangeEvent e) { |
||||
updatePreviewPane(); |
||||
} |
||||
}); |
||||
|
||||
|
||||
JPanel flowLeft = FRGUIPaneFactory.createNormalFlowInnerContainer_M_Pane(); |
||||
flowLeft.add(gapFix); |
||||
flowLeft.add(titleWidthFix); |
||||
JPanel centerPane = TableLayoutHelper.createGapTableLayoutPane(new Component[][]{new Component[]{displayGap, flowLeft}}, TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_L1, LayoutConstants.VGAP_MEDIUM); |
||||
centerPane.setBorder(BorderFactory.createEmptyBorder(0, 20, 15, 20)); |
||||
centerPane.setPreferredSize(new Dimension(500, 20)); |
||||
JPanel outerPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||
outerPane.setBorder(BorderFactory.createEmptyBorder(0, 0, 15, 0)); |
||||
outerPane.add(centerPane, BorderLayout.CENTER); |
||||
panel.add(outerPane); |
||||
return panel; |
||||
} |
||||
|
||||
protected void createExtraConfPane(JPanel centerPane) { |
||||
bottomBorderPane = new LinePane(); |
||||
underLinePane = new LinePane(); |
||||
bottomBorderPane.addLineChangeListener(new ChangeListener() { |
||||
@Override |
||||
public void stateChanged(ChangeEvent e) { |
||||
updatePreviewPane(); |
||||
} |
||||
}); |
||||
underLinePane.addLineChangeListener(new ChangeListener() { |
||||
@Override |
||||
public void stateChanged(ChangeEvent e) { |
||||
updatePreviewPane(); |
||||
} |
||||
}); |
||||
UITitleSplitLine titleSplitLine = new UITitleSplitLine(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Mobile_Bottom_Border"), 520); |
||||
titleSplitLine.setPreferredSize(new Dimension(520, 20)); |
||||
centerPane.add(titleSplitLine); |
||||
centerPane.add(bottomBorderPane); |
||||
UITitleSplitLine titleUnderLine = new UITitleSplitLine(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Mobile_Under_Line"), 520); |
||||
titleUnderLine.setPreferredSize(new Dimension(520, 20)); |
||||
centerPane.add(titleUnderLine); |
||||
centerPane.add(underLinePane); |
||||
} |
||||
|
||||
@Override |
||||
protected void initDefaultConfig() { |
||||
this.initialColorBox.setSelectObject(UpMenuStyle.DEFAULT_INITIAL_COLOR); |
||||
this.fontConfPane.populate(UpMenuStyle.DEFAULT_TAB_FONT.getFont()); |
||||
this.selectColorBox.setSelectObject(UpMenuStyle.DEFAULT_SELECT_COLOR); |
||||
this.selectFontColor.setColor(UpMenuStyle.DEFAULT_SELECT_FONT_COLOR); |
||||
this.bottomBorderPane.populate(UpMenuStyle.DEFAULT_BOTTOM_BORDER); |
||||
this.underLinePane.populate(UpMenuStyle.DEFAULT_UNDER_LINE); |
||||
} |
||||
|
||||
@Override |
||||
protected MobileTemplatePreviewPane createPreviewPane() { |
||||
return new UpMenuStylePreviewPane(); |
||||
} |
||||
|
||||
@Override |
||||
public void populateSubStyle(MobileTemplateStyle ob) { |
||||
super.populateSubStyle(ob); |
||||
UpMenuStyle style = (UpMenuStyle) ob; |
||||
gapFix.setSelected(style.isGapFix()); |
||||
titleWidthFix.setSelected(style.isTitleWidthFix()); |
||||
bottomBorderPane.populate(style.getBottomBorder()); |
||||
underLinePane.populate(style.getUnderline()); |
||||
} |
||||
|
||||
@Override |
||||
protected MobileTemplateStyle getDefaultTemplateStyle() { |
||||
return new UpMenuStyle(); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public MobileTemplateStyle updateStyleWithSelectConf() { |
||||
UpMenuStyle style = new UpMenuStyle(); |
||||
style.setGapFix(gapFix.isSelected()); |
||||
style.setTitleWidthFix(titleWidthFix.isSelected()); |
||||
style.setBottomBorder(bottomBorderPane.update()); |
||||
style.setUnderline(underLinePane.update()); |
||||
return style; |
||||
} |
||||
|
||||
@Override |
||||
protected String title4PopupWindow() { |
||||
return null; |
||||
} |
||||
|
||||
|
||||
public class UpMenuStylePreviewPane extends MobileTemplatePreviewPane { |
||||
private LineDescription bottomBorder; |
||||
private LineDescription underLine; |
||||
private boolean isGapFix; |
||||
|
||||
public UpMenuStylePreviewPane() { |
||||
this.setBackground(Color.WHITE); |
||||
} |
||||
|
||||
public void repaint() { |
||||
super.repaint(); |
||||
} |
||||
|
||||
@Override |
||||
public void paint(Graphics g) { |
||||
super.paint(g); |
||||
Color selectFontColor = this.getTabFontConfig().getSelectColor(); |
||||
Dimension dimension = this.getSize(); |
||||
int panelWidth = dimension.width; |
||||
int panelHeight = dimension.height; |
||||
Graphics2D g2d = (Graphics2D) g.create(); |
||||
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); |
||||
FRFont frFont = this.getTabFontConfig().getFont(); |
||||
FontMetrics fm = GraphHelper.getFontMetrics(frFont); |
||||
WCardTagLayout cardTagLayout = UpMenuStyleDefinePane.this.getTagLayout(); |
||||
int eachWidth = panelWidth / cardTagLayout.getWidgetCount(); |
||||
g2d.setFont(frFont); |
||||
int fontHeight = fm.getHeight(); |
||||
int ascentHeight = fm.getAscent(); |
||||
if (bottomBorder.getLineStyle() != 0) { |
||||
g2d.setColor(bottomBorder.getColor()); |
||||
g2d.setStroke(GraphHelper.getStroke(bottomBorder.getLineStyle())); |
||||
g2d.drawLine(0, panelHeight - 1, panelWidth, panelHeight - 1); |
||||
} |
||||
for (int i = 0; i < cardTagLayout.getWidgetCount(); i++) { |
||||
g2d.setColor(i == 0 ? selectFontColor : frFont.getForeground()); |
||||
CardSwitchButton cardSwitchButton = cardTagLayout.getSwitchButton(i); |
||||
String displayName = calculateDisplayName(cardSwitchButton.getText(), fm, eachWidth); |
||||
int width = fm.stringWidth(displayName); |
||||
if(i == 0){ |
||||
Color oldColor = g2d.getColor(); |
||||
g2d.setColor(this.getSelectColor()); |
||||
g2d.fillRect(0, 0 ,eachWidth, panelHeight - 2); |
||||
g2d.setColor(oldColor); |
||||
} |
||||
g2d.drawString(displayName, (eachWidth - width) / 2, (panelHeight - fontHeight) / 2 + ascentHeight); |
||||
Stroke oldStroke = g2d.getStroke(); |
||||
if (i == 0) { |
||||
g2d.setColor(this.underLine.getColor()); |
||||
g2d.setStroke(GraphHelper.getStroke(underLine.getLineStyle())); |
||||
int underLineX = this.isGapFix ? (eachWidth - width) / 2 : 0; |
||||
int underLineWidth = this.isGapFix ? width : eachWidth; |
||||
g2d.drawLine(underLineX, panelHeight - 2, underLineX + underLineWidth, panelHeight - 2); |
||||
} |
||||
g2d.setStroke(oldStroke); |
||||
g2d.translate(eachWidth, 0); |
||||
} |
||||
} |
||||
|
||||
public void populateConfig(MobileTemplateStyle templateStyle) { |
||||
super.populateConfig(templateStyle); |
||||
this.bottomBorder = ((UpMenuStyle) templateStyle).getBottomBorder(); |
||||
this.underLine = ((UpMenuStyle) templateStyle).getUnderline(); |
||||
this.isGapFix = ((UpMenuStyle) templateStyle).isGapFix(); |
||||
} |
||||
} |
||||
|
||||
} |
@ -0,0 +1,144 @@
|
||||
package com.fr.design.mainframe.widget; |
||||
|
||||
import com.fr.base.BaseUtils; |
||||
import com.fr.base.Utils; |
||||
import com.fr.design.gui.ibutton.UIColorButton; |
||||
import com.fr.design.gui.ibutton.UIToggleButton; |
||||
import com.fr.design.gui.icombobox.UIComboBox; |
||||
import com.fr.general.FRFont; |
||||
|
||||
import javax.swing.Icon; |
||||
import javax.swing.JPanel; |
||||
import javax.swing.event.ChangeEvent; |
||||
import javax.swing.event.ChangeListener; |
||||
import javax.swing.event.EventListenerList; |
||||
import java.awt.Dimension; |
||||
import java.awt.FlowLayout; |
||||
import java.awt.Font; |
||||
import java.awt.event.ItemEvent; |
||||
import java.awt.event.ItemListener; |
||||
import java.util.Vector; |
||||
|
||||
public class MobileTabFontConfPane extends JPanel { |
||||
private static final Icon[] ITALIC_ICONS = {BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/italic.png"), BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/italic_white.png")}; |
||||
private static final Icon[] BOLD_ICONS = {BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/bold.png"), BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/bold_white.png")}; |
||||
|
||||
private EventListenerList fontChangeListener = new EventListenerList(); |
||||
private UIComboBox fontFamily; |
||||
private UIComboBox fontSize; |
||||
private UIToggleButton bold; |
||||
private UIColorButton color; |
||||
private UIToggleButton italic; |
||||
|
||||
|
||||
public MobileTabFontConfPane() { |
||||
super(); |
||||
init(); |
||||
} |
||||
|
||||
private void init() { |
||||
this.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 0)); |
||||
fontFamily = new UIComboBox(Utils.getAvailableFontFamilyNames4Report()); |
||||
Vector<Integer> integerList = new Vector<Integer>(); |
||||
for (int i = 1; i < 100; i++) { |
||||
integerList.add(i); |
||||
} |
||||
fontFamily.setPreferredSize(new Dimension(152, 20)); |
||||
fontSize = new UIComboBox(integerList); |
||||
color = new UIColorButton(); |
||||
bold = new UIToggleButton(BOLD_ICONS, true); |
||||
italic = new UIToggleButton(ITALIC_ICONS, true); |
||||
fontFamily.addItemListener(new ItemListener() { |
||||
@Override |
||||
public void itemStateChanged(ItemEvent e) { |
||||
fireFontStateChanged(); |
||||
} |
||||
}); |
||||
fontSize.addItemListener(new ItemListener() { |
||||
@Override |
||||
public void itemStateChanged(ItemEvent e) { |
||||
fireFontStateChanged(); |
||||
} |
||||
}); |
||||
bold.addChangeListener(new ChangeListener() { |
||||
@Override |
||||
public void stateChanged(ChangeEvent e) { |
||||
fireFontStateChanged(); |
||||
} |
||||
}); |
||||
italic.addChangeListener(new ChangeListener() { |
||||
@Override |
||||
public void stateChanged(ChangeEvent e) { |
||||
fireFontStateChanged(); |
||||
} |
||||
}); |
||||
color.addColorChangeListener(new ChangeListener() { |
||||
@Override |
||||
public void stateChanged(ChangeEvent e) { |
||||
fireFontStateChanged(); |
||||
} |
||||
}); |
||||
this.add(fontFamily); |
||||
this.add(fontSize); |
||||
this.add(color); |
||||
this.add(bold); |
||||
this.add(italic); |
||||
|
||||
} |
||||
|
||||
public FRFont update() { |
||||
String family = (String) fontFamily.getSelectedItem(); |
||||
int size = (int) fontSize.getSelectedItem(); |
||||
int style = Font.PLAIN; |
||||
style += this.bold.isSelected() ? Font.BOLD : Font.PLAIN; |
||||
style += this.italic.isSelected() ? Font.ITALIC : Font.PLAIN; |
||||
FRFont frFont = FRFont.getInstance(family, style, size, color.getColor()); |
||||
return frFont; |
||||
} |
||||
|
||||
public void populate(FRFont frFont) { |
||||
fontFamily.setSelectedItem(frFont.getFamily()); |
||||
fontSize.setSelectedItem(frFont.getSize()); |
||||
color.setColor(frFont.getForeground()); |
||||
bold.setSelected(frFont.isBold()); |
||||
italic.setSelected(frFont.isItalic()); |
||||
|
||||
} |
||||
|
||||
|
||||
/** |
||||
* 添加监听 |
||||
* |
||||
* @param changeListener 监听列表 |
||||
*/ |
||||
public void addFontChangeListener(ChangeListener changeListener) { |
||||
fontChangeListener.add(ChangeListener.class, changeListener); |
||||
} |
||||
|
||||
/** |
||||
* 移除监听 |
||||
* Removes an old ColorChangeListener. |
||||
* |
||||
* @param changeListener 监听列表 |
||||
*/ |
||||
public void removeFontChangeListener(ChangeListener changeListener) { |
||||
fontChangeListener.remove(ChangeListener.class, changeListener); |
||||
} |
||||
|
||||
/** |
||||
* 颜色状态改变 |
||||
*/ |
||||
public void fireFontStateChanged() { |
||||
Object[] listeners = fontChangeListener.getListenerList(); |
||||
ChangeEvent e = null; |
||||
|
||||
for (int i = listeners.length - 2; i >= 0; i -= 2) { |
||||
if (listeners[i] == ChangeListener.class) { |
||||
if (e == null) { |
||||
e = new ChangeEvent(this); |
||||
} |
||||
((ChangeListener) listeners[i + 1]).stateChanged(e); |
||||
} |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,50 @@
|
||||
package com.fr.design.mainframe.widget; |
||||
|
||||
import com.fr.design.gui.ilable.UILabel; |
||||
import com.fr.general.FRFont; |
||||
import javax.swing.JPanel; |
||||
import java.awt.Color; |
||||
import java.awt.Dimension; |
||||
import java.awt.Graphics; |
||||
|
||||
public class UITitleSplitLine extends JPanel { |
||||
private static final Color LINE_COLOR = Color.decode("#E0E0E1"); |
||||
private static final Color TITLE_COLOR = Color.decode("#333334"); |
||||
private static final FRFont TITLE_FONT = FRFont.getInstance("PingFangSC-Regular", 0, 12.0F); |
||||
private static final int OFFSETX = 10; |
||||
private static final int OFFSET = 3; |
||||
private Color color; |
||||
private UILabel label; |
||||
private int width; |
||||
|
||||
|
||||
|
||||
public UITitleSplitLine(String title, int width) { |
||||
this(title, LINE_COLOR, width); |
||||
} |
||||
|
||||
public UITitleSplitLine(String title, Color color, int width) { |
||||
super(); |
||||
this.color = color; |
||||
this.width = width; |
||||
this.label = new UILabel(title); |
||||
} |
||||
|
||||
public void paint(Graphics g) { |
||||
super.paint(g); |
||||
Dimension size = label.getPreferredSize(); |
||||
int labelH = size.height; |
||||
g.setColor(color); |
||||
g.drawLine(0, labelH / 2, OFFSETX, labelH / 2); |
||||
g.drawLine(OFFSETX + size.width + OFFSET * 2, labelH / 2, width, labelH / 2); |
||||
g.translate(OFFSETX + OFFSET, 0); |
||||
label.setFont(TITLE_FONT); |
||||
label.setForeground(TITLE_COLOR); |
||||
label.setSize(size.width, size.height); |
||||
label.paint(g); |
||||
g.translate(-OFFSETX - OFFSET, 0); |
||||
} |
||||
|
||||
|
||||
|
||||
} |
@ -0,0 +1,10 @@
|
||||
package com.fr.design.mainframe.widget.accessibles; |
||||
|
||||
import com.fr.design.dialog.BasicPane; |
||||
|
||||
public abstract class AbstractTemplateStylePane<T> extends BasicPane { |
||||
|
||||
public abstract void populate(T ob); |
||||
|
||||
public abstract T update(); |
||||
} |
@ -0,0 +1,112 @@
|
||||
package com.fr.design.mainframe.widget.accessibles; |
||||
|
||||
import com.fr.design.beans.BasicBeanPane; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.design.mainframe.mobile.ui.TemplateStyleDefinePaneFactory; |
||||
import com.fr.form.ui.container.cardlayout.WCardTagLayout; |
||||
import com.fr.general.cardtag.mobile.MobileTemplateStyle; |
||||
import com.fr.general.cardtag.mobile.MobileTemplateStyleType; |
||||
import javax.swing.DefaultListCellRenderer; |
||||
import javax.swing.DefaultListModel; |
||||
import javax.swing.JList; |
||||
import javax.swing.JPanel; |
||||
import javax.swing.ListCellRenderer; |
||||
import java.awt.BorderLayout; |
||||
import java.awt.CardLayout; |
||||
import java.awt.Component; |
||||
import java.awt.Dimension; |
||||
import java.awt.event.MouseAdapter; |
||||
import java.awt.event.MouseEvent; |
||||
import java.util.ArrayList; |
||||
import java.util.HashMap; |
||||
import java.util.List; |
||||
import java.util.Map; |
||||
|
||||
public class MobileTemplateStylePane extends AbstractTemplateStylePane<MobileTemplateStyle> { |
||||
private static final List<MobileTemplateStyleType> STYLE_LIST = new ArrayList<MobileTemplateStyleType>(); |
||||
static { |
||||
STYLE_LIST.add(MobileTemplateStyleType.DEFAULT_STYLE); |
||||
STYLE_LIST.add(MobileTemplateStyleType.UP_MENU_STYLE); |
||||
STYLE_LIST.add(MobileTemplateStyleType.DOWN_MENU_STYLE); |
||||
STYLE_LIST.add(MobileTemplateStyleType.SLIDER_STYLE); |
||||
} |
||||
|
||||
private DefaultListModel listModel; |
||||
private JList styleList; |
||||
private Map<String, BasicBeanPane<MobileTemplateStyle>> map = new HashMap<>(); |
||||
private JPanel right; |
||||
private CardLayout card; |
||||
public MobileTemplateStylePane(WCardTagLayout tagLayout){ |
||||
init(tagLayout); |
||||
} |
||||
|
||||
public void init(WCardTagLayout tagLayout){ |
||||
this.setLayout(FRGUIPaneFactory.createBorderLayout()); |
||||
listModel = new DefaultListModel(); |
||||
card = new CardLayout(); |
||||
right = FRGUIPaneFactory.createCardLayout_S_Pane(); |
||||
right.setLayout(card); |
||||
for(MobileTemplateStyleType style : STYLE_LIST){ |
||||
listModel.addElement(style.getDisplayName()); |
||||
BasicBeanPane<MobileTemplateStyle> styleBasicBeanPane = TemplateStyleDefinePaneFactory.createDefinePane(style.getStyle(), tagLayout); |
||||
map.put(style.getDisplayName(), styleBasicBeanPane); |
||||
right.add(style.getDisplayName(), styleBasicBeanPane); |
||||
} |
||||
styleList = new JList(listModel); |
||||
styleList.setCellRenderer(render); |
||||
|
||||
JPanel westPane = FRGUIPaneFactory.createBorderLayout_L_Pane(); |
||||
westPane.add(styleList, BorderLayout.CENTER); |
||||
westPane.setPreferredSize(new Dimension(100, 500)); |
||||
|
||||
|
||||
JPanel centerPane = FRGUIPaneFactory.createBorderLayout_L_Pane(); |
||||
JPanel attrConfPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||
centerPane.setPreferredSize(new Dimension(500, 500)); |
||||
attrConfPane.add(right, BorderLayout.CENTER); |
||||
centerPane.add(attrConfPane, BorderLayout.CENTER); |
||||
styleList.addMouseListener(new MouseAdapter() { |
||||
public void mouseClicked(MouseEvent e) { |
||||
String selectedValue = (String)styleList.getSelectedValue(); |
||||
card.show(right, selectedValue); |
||||
} |
||||
}); |
||||
this.add(westPane, BorderLayout.WEST); |
||||
this.add(centerPane, BorderLayout.CENTER); |
||||
} |
||||
public static ListCellRenderer render = new DefaultListCellRenderer() { |
||||
@Override |
||||
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { |
||||
super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); |
||||
|
||||
if (value instanceof MobileTemplateStyle) { |
||||
MobileTemplateStyle l = (MobileTemplateStyle) value; |
||||
this.setText(l.toString()); |
||||
} |
||||
return this; |
||||
} |
||||
}; |
||||
|
||||
@Override |
||||
protected String title4PopupWindow() { |
||||
return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Tab_Style_Template"); |
||||
} |
||||
|
||||
public void populate(MobileTemplateStyle templateStyle) { |
||||
for(int i = 0; i< listModel.getSize(); i++){ |
||||
String style = templateStyle.getStyle(); |
||||
MobileTemplateStyleType templateStyleType = MobileTemplateStyleType.parse(style); |
||||
if((listModel.getElementAt(i)).equals(templateStyleType.getDisplayName())){ |
||||
styleList.setSelectedIndex(i); |
||||
map.get(templateStyle.toString()).populateBean(templateStyle); |
||||
card.show(right, templateStyle.toString()); |
||||
return; |
||||
} |
||||
} |
||||
styleList.setSelectedIndex(0); |
||||
} |
||||
|
||||
public MobileTemplateStyle update() { |
||||
return map.get(styleList.getSelectedValue()).updateBean(); |
||||
} |
||||
} |
@ -0,0 +1,68 @@
|
||||
package com.fr.design.mainframe.widget.preview; |
||||
|
||||
import com.fr.general.cardtag.mobile.MobileTemplateStyle; |
||||
import com.fr.general.cardtag.mobile.TabFontConfig; |
||||
|
||||
import javax.swing.JPanel; |
||||
import java.awt.Color; |
||||
import java.awt.FontMetrics; |
||||
|
||||
public abstract class MobileTemplatePreviewPane extends JPanel { |
||||
private Color initialColor; |
||||
private Color selectColor; |
||||
private TabFontConfig tabFontConfig = new TabFontConfig(); |
||||
|
||||
public Color getInitialColor() { |
||||
return initialColor; |
||||
} |
||||
|
||||
public void setInitialColor(Color initialColor) { |
||||
this.initialColor = initialColor; |
||||
} |
||||
|
||||
public Color getSelectColor() { |
||||
return selectColor; |
||||
} |
||||
|
||||
public void setSelectColor(Color selectColor) { |
||||
this.selectColor = selectColor; |
||||
} |
||||
|
||||
public TabFontConfig getTabFontConfig() { |
||||
return tabFontConfig; |
||||
} |
||||
|
||||
public void setTabFontConfig(TabFontConfig tabFontConfig) { |
||||
this.tabFontConfig = tabFontConfig; |
||||
} |
||||
|
||||
public MobileTemplatePreviewPane() { |
||||
|
||||
} |
||||
|
||||
public void populateConfig(MobileTemplateStyle templateStyle) { |
||||
this.setInitialColor(templateStyle.getInitialColor()); |
||||
this.setBackground(templateStyle.getInitialColor()); |
||||
this.setSelectColor(templateStyle.getSelectColor()); |
||||
this.setTabFontConfig(templateStyle.getTabFontConfig()); |
||||
} |
||||
|
||||
protected String calculateDisplayName(String widgetName, FontMetrics fm, int eachWidth) { |
||||
StringBuffer buffer = new StringBuffer(); |
||||
String result; |
||||
for (int i = 0; i < widgetName.length(); i++) { |
||||
result = buffer.toString(); |
||||
buffer.append(widgetName.charAt(i)); |
||||
if (fm.stringWidth(buffer.toString()) > eachWidth) { |
||||
return result; |
||||
} |
||||
} |
||||
return buffer.toString(); |
||||
|
||||
} |
||||
|
||||
public void repaint() { |
||||
super.repaint(); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,62 @@
|
||||
package com.fr.design.report; |
||||
|
||||
import com.fr.base.iofile.attr.WatermarkAttr; |
||||
import com.fr.design.dialog.AbstractTemplateServerSettingPane; |
||||
import com.fr.report.core.ReportUtils; |
||||
|
||||
import javax.swing.BorderFactory; |
||||
import javax.swing.JPanel; |
||||
|
||||
/** |
||||
* Created by plough on 2018/11/7. |
||||
*/ |
||||
public class WatermarkSettingPane extends AbstractTemplateServerSettingPane { |
||||
private WatermarkPane watermarkPane; |
||||
|
||||
public WatermarkSettingPane() { |
||||
super(); |
||||
initComponents(); |
||||
} |
||||
|
||||
private void initComponents() { |
||||
buttonPane.setBorder(BorderFactory.createEmptyBorder(10, 8, 0, 0)); |
||||
} |
||||
|
||||
@Override |
||||
protected JPanel getContentPane() { |
||||
if (watermarkPane == null) { |
||||
watermarkPane = new WatermarkPane(); |
||||
} |
||||
return watermarkPane; |
||||
} |
||||
|
||||
@Override |
||||
protected void populateServerSettings() { |
||||
WatermarkAttr watermarkAttr = ReportUtils.getWatermarkAttrFromServerConfig(); |
||||
watermarkPane.populate(watermarkAttr); |
||||
} |
||||
|
||||
@Override |
||||
protected String title4PopupWindow() { |
||||
return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_WaterMark"); |
||||
} |
||||
|
||||
public void populate(WatermarkAttr watermark) { |
||||
if (!watermark.isValid()) { |
||||
chooseComboBox.setSelectedIndex(SERVER_SET); |
||||
populateServerSettings(); |
||||
return; |
||||
} |
||||
chooseComboBox.setSelectedIndex(SINGLE_SET); |
||||
watermarkPane.populate(watermark); |
||||
} |
||||
|
||||
|
||||
public WatermarkAttr update() { |
||||
WatermarkAttr watermark = watermarkPane.update(); |
||||
if (isUsingServerSettings()) { |
||||
watermark.setValid(false); |
||||
} |
||||
return watermark; |
||||
} |
||||
} |
@ -0,0 +1,76 @@
|
||||
package com.fr.design.report.fit; |
||||
|
||||
import com.fr.design.designer.properties.items.Item; |
||||
import com.fr.report.fit.ReportFitAttr; |
||||
import com.fr.stable.StringUtils; |
||||
|
||||
/** |
||||
* Created by Administrator on 2016/4/13/0013. |
||||
*/ |
||||
public enum FitType { |
||||
DEFAULT(0) { |
||||
@Override |
||||
public String description() { |
||||
return com.fr.design.i18n.Toolkit.i18nText("Fine-Designer_Fit-Default"); |
||||
} |
||||
|
||||
}, |
||||
// 横向自适应, 纵向根据横向的比例来适配
|
||||
HORIZONTAL_FIT(1) { |
||||
@Override |
||||
public String description() { |
||||
return com.fr.design.i18n.Toolkit.i18nText("Fine-Designer_Fit-Horizontal"); |
||||
} |
||||
}, |
||||
// 双向自适应, 横纵向都是根据页面宽高来计算
|
||||
DOUBLE_FIT(2) { |
||||
@Override |
||||
public String description() { |
||||
return com.fr.design.i18n.Toolkit.i18nText("Fine-Designer_Fit-Horizontal_Vertical"); |
||||
} |
||||
}, |
||||
|
||||
NOT_FIT(3) { |
||||
@Override |
||||
public String description() { |
||||
return com.fr.design.i18n.Toolkit.i18nText("Fine-Designer_Fit-No"); |
||||
} |
||||
}; |
||||
|
||||
|
||||
private int state; |
||||
|
||||
|
||||
FitType(int state) { |
||||
this.state = state; |
||||
} |
||||
|
||||
public static FitType parse(ReportFitAttr attr) { |
||||
|
||||
if (attr == null) { |
||||
return DEFAULT; |
||||
} |
||||
|
||||
for (FitType attrState : values()) { |
||||
if (attrState.state == attr.fitStateInPC()) { |
||||
return attrState; |
||||
} |
||||
} |
||||
|
||||
return DEFAULT; |
||||
} |
||||
|
||||
public int getState() { |
||||
return this.state; |
||||
} |
||||
|
||||
|
||||
public String description() { |
||||
return StringUtils.EMPTY; |
||||
} |
||||
|
||||
public Item propertyItem() { |
||||
return new Item(this.description(), this.getState()); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,240 @@
|
||||
package com.fr.design.report.fit.menupane; |
||||
|
||||
import com.fr.config.Configuration; |
||||
import com.fr.design.beans.BasicBeanPane; |
||||
import com.fr.design.gui.ibutton.UIButton; |
||||
import com.fr.design.gui.ibutton.UIRadioButton; |
||||
import com.fr.design.gui.icheckbox.UICheckBox; |
||||
import com.fr.design.gui.ilable.UILabel; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.design.layout.TableLayout; |
||||
import com.fr.design.layout.TableLayoutHelper; |
||||
import com.fr.design.report.fit.FitType; |
||||
import com.fr.report.fit.ReportFitAttr; |
||||
import com.fr.report.fit.ReportFitConfig; |
||||
import com.fr.transaction.Configurations; |
||||
import com.fr.transaction.Worker; |
||||
|
||||
import javax.swing.BorderFactory; |
||||
import javax.swing.ButtonGroup; |
||||
import javax.swing.JPanel; |
||||
import java.awt.BorderLayout; |
||||
import java.awt.Component; |
||||
import java.awt.Cursor; |
||||
import java.awt.event.ActionEvent; |
||||
import java.awt.event.ActionListener; |
||||
import java.awt.event.MouseAdapter; |
||||
import java.awt.event.MouseEvent; |
||||
|
||||
/** |
||||
* Created by Administrator on 2016/5/5/0005. |
||||
*/ |
||||
public class BrowserFitAttrPane extends BasicBeanPane<ReportFitAttr> { |
||||
|
||||
protected FontRadioGroup fontRadioGroup; |
||||
protected FitRadioGroup fitRadionGroup; |
||||
protected UICheckBox globalCheck; |
||||
protected FitPreviewPane fitPreviewPane; |
||||
protected ReportFitAttr localFitAttr; |
||||
protected UIRadioButton defaultRadio; |
||||
protected UIRadioButton horizonRadio; |
||||
protected UIRadioButton doubleRadio; |
||||
protected UIRadioButton notFitRadio; |
||||
protected UIRadioButton fontFitRadio; |
||||
protected UIRadioButton fontNotFitRadio; |
||||
private UIButton editGlobalOps; |
||||
private JPanel borderPane; |
||||
private JPanel globalOpsPane; |
||||
private JPanel fitOpsPane; |
||||
|
||||
public BrowserFitAttrPane() { |
||||
initComponents(ReportFitConfig.getInstance().getFrmFitAttr()); |
||||
} |
||||
|
||||
protected void initComponents(ReportFitAttr globalFitAttr) { |
||||
this.setLayout(FRGUIPaneFactory.createBorderLayout()); |
||||
globalOpsPane = initGlobalOpsPane(globalFitAttr); |
||||
this.add(globalOpsPane, BorderLayout.NORTH); |
||||
fitOpsPane = initFitOpsPane(); |
||||
|
||||
} |
||||
|
||||
protected void initBorderPane(String title) { |
||||
borderPane = FRGUIPaneFactory.createTitledBorderPaneCenter(title); |
||||
borderPane.add(fitOpsPane, BorderLayout.CENTER); |
||||
fitPreviewPane = new FitPreviewPane(); |
||||
borderPane.add(fitPreviewPane, BorderLayout.SOUTH); |
||||
this.add(borderPane, BorderLayout.CENTER); |
||||
} |
||||
|
||||
private JPanel initFitOpsPane() { |
||||
double p = TableLayout.PREFERRED; |
||||
double[] rowSize = {p, p}; |
||||
double[] columnSize = {p, p, p, p, p}; |
||||
|
||||
ActionListener actionListener = getPreviewActionListener(); |
||||
|
||||
fontRadioGroup = new FontRadioGroup(); |
||||
fontFitRadio = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Designer_Fit")); |
||||
fontFitRadio.setSelected(true); |
||||
fontNotFitRadio = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Designer_Fit-No")); |
||||
addRadioToGroup(fontRadioGroup, fontFitRadio, fontNotFitRadio); |
||||
fontRadioGroup.addActionListener(actionListener); |
||||
|
||||
fitRadionGroup = new FitRadioGroup(); |
||||
defaultRadio = new UIRadioButton(FitType.DEFAULT.description()); |
||||
horizonRadio = new UIRadioButton(FitType.HORIZONTAL_FIT.description()); |
||||
doubleRadio = new UIRadioButton(FitType.DOUBLE_FIT.description()); |
||||
notFitRadio = new UIRadioButton(FitType.NOT_FIT.description()); |
||||
addRadioToGroup(fitRadionGroup, defaultRadio, horizonRadio, doubleRadio, notFitRadio); |
||||
fitRadionGroup.addActionListener(actionListener); |
||||
|
||||
|
||||
JPanel fitOpsPane = TableLayoutHelper.createTableLayoutPane(initFitComponents(), rowSize, columnSize); |
||||
fitOpsPane.setBorder(BorderFactory.createEmptyBorder(10, 13, 10, 10)); |
||||
return fitOpsPane; |
||||
} |
||||
|
||||
protected Component[][] initFitComponents() { |
||||
Component[][] components = new Component[][]{ |
||||
new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Designer_Fit-Font")), fontFitRadio, null, fontNotFitRadio}, |
||||
new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Designer_Fit-Element")), defaultRadio, horizonRadio, doubleRadio, notFitRadio} |
||||
}; |
||||
return components; |
||||
} |
||||
|
||||
private void addRadioToGroup(ButtonGroup buttonGroup, UIRadioButton... radios) { |
||||
for (UIRadioButton radio : radios) { |
||||
buttonGroup.add(radio); |
||||
} |
||||
} |
||||
|
||||
private JPanel initGlobalOpsPane(final ReportFitAttr globalFitAttr) { |
||||
final JPanel globalOpsPane = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane(); |
||||
globalCheck = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Designer_Fit-UseGlobal")); |
||||
globalOpsPane.add(globalCheck); |
||||
globalCheck.addActionListener(new ActionListener() { |
||||
@Override |
||||
public void actionPerformed(ActionEvent e) { |
||||
boolean isLocalConfig = !globalCheck.isSelected(); |
||||
//勾选全局时,采用全局保存的自适应属性更新界面
|
||||
if (!isLocalConfig) { |
||||
ReportFitAttr attr = globalFitAttr; |
||||
fontRadioGroup.selectFontFit(((ReportFitAttr) attr).isFitFont()); |
||||
fitRadionGroup.selectIndexButton(attr.fitStateInPC()); |
||||
fitPreviewPane.refreshPreview(getCurrentFitOptions(), fitRadionGroup.isEnabled()); |
||||
remove(BrowserFitAttrPane.this.borderPane); |
||||
initBorderPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Designer_Fit-Global")); |
||||
} else { |
||||
ReportFitAttr attr = localFitAttr; |
||||
fontRadioGroup.selectFontFit(((ReportFitAttr) attr).isFitFont()); |
||||
fitRadionGroup.selectIndexButton(attr.fitStateInPC()); |
||||
fitPreviewPane.refreshPreview(getCurrentFitOptions(), fitRadionGroup.isEnabled()); |
||||
remove(BrowserFitAttrPane.this.borderPane); |
||||
initBorderPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Designer_Fit-Local")); |
||||
} |
||||
fontRadioGroup.setEnabled(isLocalConfig); |
||||
fitRadionGroup.setEnabled(isLocalConfig); |
||||
editGlobalOps.setVisible(!isLocalConfig); |
||||
String fitOptions = getCurrentFitOptions(); |
||||
fitPreviewPane.refreshPreview(fitOptions, fitRadionGroup.isEnabled()); |
||||
} |
||||
}); |
||||
|
||||
editGlobalOps = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Designer_Fit-EditGlobal")); |
||||
editGlobalOps.setVisible(false); |
||||
editGlobalOps.addMouseListener(new MouseAdapter() { |
||||
public void mouseClicked(MouseEvent evt) { |
||||
fontRadioGroup.setEnabled(true); |
||||
fitRadionGroup.setEnabled(true); |
||||
String fitOptions = getCurrentFitOptions(); |
||||
|
||||
fitPreviewPane.refreshPreview(fitOptions, fitRadionGroup.isEnabled()); |
||||
} |
||||
|
||||
public void mouseEntered(MouseEvent e) { |
||||
setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); |
||||
} |
||||
|
||||
public void mouseExited(MouseEvent e) { |
||||
setCursor(Cursor.getDefaultCursor()); |
||||
} |
||||
}); |
||||
globalOpsPane.add(editGlobalOps); |
||||
return globalOpsPane; |
||||
} |
||||
|
||||
@Override |
||||
protected String title4PopupWindow() { |
||||
return com.fr.design.i18n.Toolkit.i18nText("Fine-Designer_Fit-AttrSet"); |
||||
} |
||||
|
||||
@Override |
||||
public void populateBean(ReportFitAttr attr) { |
||||
if (attr == null) { |
||||
//如果为空, 就用全局的
|
||||
attr = ReportFitConfig.getInstance().getFrmFitAttr(); |
||||
populateGlobalComponents(); |
||||
} else { |
||||
initBorderPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Designer_Fit-Local")); |
||||
} |
||||
this.localFitAttr = attr; |
||||
fontRadioGroup.selectFontFit((attr).isFitFont()); |
||||
fitRadionGroup.selectIndexButton(attr.fitStateInPC()); |
||||
fitPreviewPane.refreshPreview(getCurrentFitOptions(), fitRadionGroup.isEnabled()); |
||||
} |
||||
|
||||
protected void populateGlobalComponents() { |
||||
globalCheck.setSelected(true); |
||||
fontRadioGroup.setEnabled(false); |
||||
fitRadionGroup.setEnabled(false); |
||||
editGlobalOps.setVisible(true); |
||||
initBorderPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Designer_Fit-Global")); |
||||
} |
||||
|
||||
//有八种组合, 不过有意义的就是6种, 以此为key去缓存里找对应的预览图片
|
||||
public String getCurrentFitOptions() { |
||||
return fitRadionGroup.getSelectRadioIndex() + "" + fontRadioGroup.getSelectRadioIndex(); |
||||
} |
||||
|
||||
private ActionListener getPreviewActionListener() { |
||||
return new ActionListener() { |
||||
@Override |
||||
public void actionPerformed(ActionEvent e) { |
||||
String fitOptions = getCurrentFitOptions(); |
||||
fitPreviewPane.refreshPreview(fitOptions, fontRadioGroup.isEnabled()); |
||||
} |
||||
}; |
||||
} |
||||
|
||||
@Override |
||||
public ReportFitAttr updateBean() { |
||||
ReportFitAttr attr = new ReportFitAttr(); |
||||
attr.setFitFont(fontRadioGroup.isFontFit()); |
||||
attr.setFitStateInPC(fitRadionGroup.getSelectRadioIndex()); |
||||
|
||||
// 直接用全局的
|
||||
if (globalCheck.isSelected()) { |
||||
updateGlobalConfig(attr); |
||||
return null; |
||||
} |
||||
this.localFitAttr = attr; |
||||
return attr; |
||||
} |
||||
|
||||
private void updateGlobalConfig(final ReportFitAttr attr) { |
||||
|
||||
Configurations.update(new Worker() { |
||||
@Override |
||||
public void run() { |
||||
ReportFitConfig manager = ReportFitConfig.getInstance(); |
||||
manager.setFrmFitAttr(attr); |
||||
} |
||||
|
||||
@Override |
||||
public Class<? extends Configuration>[] targets() { |
||||
return new Class[]{ReportFitConfig.class}; |
||||
} |
||||
}); |
||||
} |
||||
} |
@ -0,0 +1,74 @@
|
||||
package com.fr.design.report.fit.menupane; |
||||
|
||||
import com.fr.design.dialog.BasicPane; |
||||
import com.fr.design.gui.ilable.UILabel; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.general.IOUtils; |
||||
|
||||
import javax.swing.ImageIcon; |
||||
import java.util.HashMap; |
||||
import java.util.Map; |
||||
|
||||
/** |
||||
* Created by Administrator on 2016/5/5/0005. |
||||
*/ |
||||
public class FitPreviewPane extends BasicPane { |
||||
private static final String DEFAULT_FONT_TAG = "00"; |
||||
private static final String DEFAULT_TAG = "01"; |
||||
private static final String HORIZON_FONT_TAG = "10"; |
||||
private static final String HORIZON_TAG = "11"; |
||||
private static final String DOUBLE_FONT_TAG = "20"; |
||||
private static final String DOUBLE_TAG = "21"; |
||||
private static final String NOT_FONT_TAG = "30"; |
||||
private static final String NOT_TAG = "31"; |
||||
|
||||
private UILabel imageLabel; |
||||
private Map<String, ImageIcon> cachedPreviewImage = new HashMap<String, ImageIcon>(); |
||||
private Map<String, ImageIcon> globalCachedPreviewImage = new HashMap<String, ImageIcon>(); |
||||
|
||||
public FitPreviewPane() { |
||||
//初始化缓存图片, 有些无意义的组合.
|
||||
initCacheImage(); |
||||
//初始化组件
|
||||
initComponents(); |
||||
} |
||||
|
||||
//默认和不自适应时,字体自适应不起效,只有6张图
|
||||
private void initCacheImage() { |
||||
globalCachedPreviewImage.put(DEFAULT_FONT_TAG, new ImageIcon(IOUtils.readImage("/com/fr/design/images/reportfit/preview/gray/" + DEFAULT_FONT_TAG + ".png"))); |
||||
globalCachedPreviewImage.put(DEFAULT_TAG, new ImageIcon(IOUtils.readImage("/com/fr/design/images/reportfit/preview/gray/" + DEFAULT_FONT_TAG + ".png"))); |
||||
globalCachedPreviewImage.put(HORIZON_FONT_TAG, new ImageIcon(IOUtils.readImage("/com/fr/design/images/reportfit/preview/gray/" + HORIZON_FONT_TAG + ".png"))); |
||||
globalCachedPreviewImage.put(HORIZON_TAG, new ImageIcon(IOUtils.readImage("/com/fr/design/images/reportfit/preview/gray/" + HORIZON_TAG + ".png"))); |
||||
globalCachedPreviewImage.put(DOUBLE_FONT_TAG, new ImageIcon(IOUtils.readImage("/com/fr/design/images/reportfit/preview/gray/" + DOUBLE_FONT_TAG + ".png"))); |
||||
globalCachedPreviewImage.put(DOUBLE_TAG, new ImageIcon(IOUtils.readImage("/com/fr/design/images/reportfit/preview/gray/" + DOUBLE_TAG + ".png"))); |
||||
globalCachedPreviewImage.put(NOT_FONT_TAG, new ImageIcon(IOUtils.readImage("/com/fr/design/images/reportfit/preview/gray/" + NOT_FONT_TAG + ".png"))); |
||||
globalCachedPreviewImage.put(NOT_TAG, new ImageIcon(IOUtils.readImage("/com/fr/design/images/reportfit/preview/gray/" + NOT_FONT_TAG + ".png"))); |
||||
cachedPreviewImage.put(DEFAULT_FONT_TAG, new ImageIcon(IOUtils.readImage("/com/fr/design/images/reportfit/preview/" + DEFAULT_FONT_TAG + ".png"))); |
||||
cachedPreviewImage.put(DEFAULT_TAG, new ImageIcon(IOUtils.readImage("/com/fr/design/images/reportfit/preview/" + DEFAULT_FONT_TAG + ".png"))); |
||||
cachedPreviewImage.put(HORIZON_FONT_TAG, new ImageIcon(IOUtils.readImage("/com/fr/design/images/reportfit/preview/" + HORIZON_FONT_TAG + ".png"))); |
||||
cachedPreviewImage.put(HORIZON_TAG, new ImageIcon(IOUtils.readImage("/com/fr/design/images/reportfit/preview/" + HORIZON_TAG + ".png"))); |
||||
cachedPreviewImage.put(DOUBLE_FONT_TAG, new ImageIcon(IOUtils.readImage("/com/fr/design/images/reportfit/preview/" + DOUBLE_FONT_TAG + ".png"))); |
||||
cachedPreviewImage.put(DOUBLE_TAG, new ImageIcon(IOUtils.readImage("/com/fr/design/images/reportfit/preview/" + DOUBLE_TAG + ".png"))); |
||||
cachedPreviewImage.put(NOT_FONT_TAG, new ImageIcon(IOUtils.readImage("/com/fr/design/images/reportfit/preview/" + NOT_FONT_TAG + ".png"))); |
||||
cachedPreviewImage.put(NOT_TAG, new ImageIcon(IOUtils.readImage("/com/fr/design/images/reportfit/preview/" + NOT_FONT_TAG + ".png"))); |
||||
} |
||||
|
||||
private void initComponents() { |
||||
this.setLayout(FRGUIPaneFactory.createBorderLayout()); |
||||
imageLabel = new UILabel(); |
||||
imageLabel.setIcon(cachedPreviewImage.get(DEFAULT_TAG)); |
||||
this.add(imageLabel); |
||||
} |
||||
|
||||
public void refreshPreview(String index, boolean isEditedable) { |
||||
ImageIcon newImageIcon = isEditedable ? cachedPreviewImage.get(index) : globalCachedPreviewImage.get(index); |
||||
imageLabel.setIcon(newImageIcon); |
||||
} |
||||
|
||||
@Override |
||||
protected String title4PopupWindow() { |
||||
return com.fr.design.i18n.Toolkit.i18nText("Fine-Designer_Fit-Preview"); |
||||
} |
||||
|
||||
|
||||
} |
@ -0,0 +1,80 @@
|
||||
package com.fr.design.report.fit.menupane; |
||||
|
||||
import com.fr.design.gui.ibutton.UIRadioButton; |
||||
|
||||
import javax.swing.AbstractButton; |
||||
import javax.swing.ButtonGroup; |
||||
import java.awt.event.ActionListener; |
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
|
||||
/** |
||||
* 自适应四个按钮选项的group |
||||
* <p> |
||||
* Created by Administrator on 2016/5/5/0005. |
||||
*/ |
||||
public class FitRadioGroup extends ButtonGroup { |
||||
|
||||
private List<UIRadioButton> radioButtons = new ArrayList<UIRadioButton>(); |
||||
|
||||
@Override |
||||
public void add(AbstractButton button) { |
||||
super.add(button); |
||||
|
||||
UIRadioButton radioButton = (UIRadioButton) button; |
||||
radioButtons.add(radioButton); |
||||
} |
||||
|
||||
/** |
||||
* 设置按钮状态 |
||||
*/ |
||||
public boolean isEnabled() { |
||||
return radioButtons.get(0).isEnabled(); |
||||
} |
||||
|
||||
/** |
||||
* 设置按钮状态 |
||||
*/ |
||||
public void setEnabled(boolean enabled) { |
||||
for (UIRadioButton radioButton : radioButtons) { |
||||
radioButton.setEnabled(enabled); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 获取当前选中的按钮index |
||||
* |
||||
* @return 按钮index |
||||
*/ |
||||
public int getSelectRadioIndex() { |
||||
for (int i = 0, len = radioButtons.size(); i < len; i++) { |
||||
if (radioButtons.get(i).isSelected()) { |
||||
return i; |
||||
} |
||||
} |
||||
|
||||
return 0; |
||||
} |
||||
|
||||
/** |
||||
* 选中指定index的按钮 |
||||
*/ |
||||
public void selectIndexButton(int index) { |
||||
if (index < 0 || index > radioButtons.size() - 1) { |
||||
return; |
||||
} |
||||
|
||||
UIRadioButton button = radioButtons.get(index); |
||||
button.setSelected(true); |
||||
} |
||||
|
||||
/** |
||||
* 给所有的按钮加上监听 |
||||
*/ |
||||
public void addActionListener(ActionListener actionListener) { |
||||
for (UIRadioButton radioButton : radioButtons) { |
||||
radioButton.addActionListener(actionListener); |
||||
} |
||||
} |
||||
|
||||
} |
@ -0,0 +1,17 @@
|
||||
package com.fr.design.report.fit.menupane; |
||||
|
||||
/** |
||||
* 字体的两个选项组成的group |
||||
* <p> |
||||
* Created by Administrator on 2016/5/5/0005. |
||||
*/ |
||||
public class FontRadioGroup extends FitRadioGroup { |
||||
|
||||
public void selectFontFit(boolean isFontFit) { |
||||
selectIndexButton(isFontFit ? 0 : 1); |
||||
} |
||||
|
||||
public boolean isFontFit() { |
||||
return getSelectRadioIndex() == 0; |
||||
} |
||||
} |
@ -0,0 +1,107 @@
|
||||
package com.fr.design.report.fit.menupane; |
||||
|
||||
import com.fr.base.BaseUtils; |
||||
import com.fr.design.actions.JTemplateAction; |
||||
import com.fr.design.beans.BasicBeanPane; |
||||
import com.fr.design.dialog.DialogActionAdapter; |
||||
import com.fr.design.dialog.UIDialog; |
||||
import com.fr.design.mainframe.DesignerContext; |
||||
import com.fr.design.mainframe.JTemplate; |
||||
import com.fr.design.menu.MenuKeySet; |
||||
import com.fr.report.fit.FitProvider; |
||||
import com.fr.report.fit.ReportFitAttr; |
||||
|
||||
import javax.swing.KeyStroke; |
||||
import java.awt.Dimension; |
||||
import java.awt.event.ActionEvent; |
||||
|
||||
/** |
||||
* Created by Administrator on 2015/7/6 0006. |
||||
*/ |
||||
public class ReportFitAttrAction extends JTemplateAction { |
||||
private static final Dimension MEDIUM = new Dimension(430, 400); |
||||
private static final MenuKeySet REPORT_FIT_ATTR = new MenuKeySet() { |
||||
@Override |
||||
public char getMnemonic() { |
||||
return 'T'; |
||||
} |
||||
|
||||
@Override |
||||
public String getMenuName() { |
||||
return com.fr.design.i18n.Toolkit.i18nText("Fine-Designer_Fit-Template"); |
||||
} |
||||
|
||||
@Override |
||||
public KeyStroke getKeyStroke() { |
||||
return null; |
||||
} |
||||
}; |
||||
private static final MenuKeySet REPORT_FIT_ATTR_ELEMENTCASE = new MenuKeySet() { |
||||
@Override |
||||
public char getMnemonic() { |
||||
return 'T'; |
||||
} |
||||
|
||||
@Override |
||||
public String getMenuName() { |
||||
return com.fr.design.i18n.Toolkit.i18nText("Fine-Designer_Fit-Elementcase"); |
||||
} |
||||
|
||||
@Override |
||||
public KeyStroke getKeyStroke() { |
||||
return null; |
||||
} |
||||
}; |
||||
|
||||
public ReportFitAttrAction(JTemplate jTemplate) { |
||||
super(jTemplate); |
||||
initMenuStyle(); |
||||
} |
||||
|
||||
private void initMenuStyle() { |
||||
JTemplate jTemplate = getEditingComponent(); |
||||
if (jTemplate.isJWorkBook()) { |
||||
this.setMenuKeySet(REPORT_FIT_ATTR); |
||||
} else { |
||||
this.setMenuKeySet(REPORT_FIT_ATTR_ELEMENTCASE); |
||||
} |
||||
this.setName(getMenuKeySet().getMenuKeySetName() + "..."); |
||||
this.setMnemonic(getMenuKeySet().getMnemonic()); |
||||
this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/reportfit/fit.png")); |
||||
} |
||||
|
||||
/** |
||||
* Action触发事件 |
||||
* |
||||
* @param e 事件 |
||||
*/ |
||||
public void actionPerformed(ActionEvent e) { |
||||
final JTemplate jwb = getEditingComponent(); |
||||
if (jwb == null) { |
||||
return; |
||||
} |
||||
final FitProvider wbTpl = (FitProvider) jwb.getTarget(); |
||||
ReportFitAttr fitAttr = wbTpl.getReportFitAttr(); |
||||
if (jwb.isJWorkBook()) { |
||||
final TemplateFitAttrPane attrPane = new TemplateFitAttrPane(); |
||||
showReportFitDialog(fitAttr, jwb, wbTpl, attrPane); |
||||
} else { |
||||
final ReportFitAttrPane attrPane = new ReportFitAttrPane(); |
||||
showReportFitDialog(fitAttr, jwb, wbTpl, attrPane); |
||||
} |
||||
} |
||||
|
||||
private void showReportFitDialog(ReportFitAttr fitAttr, final JTemplate jwb, final FitProvider wbTpl, final BasicBeanPane<ReportFitAttr> attrPane) { |
||||
attrPane.populateBean(fitAttr); |
||||
UIDialog dialog = attrPane.showUnsizedWindow(DesignerContext.getDesignerFrame(), new DialogActionAdapter() { |
||||
@Override |
||||
public void doOk() { |
||||
wbTpl.setReportFitAttr(attrPane.updateBean()); |
||||
jwb.fireTargetModified(); |
||||
} |
||||
}); |
||||
dialog.setSize(MEDIUM); |
||||
dialog.setVisible(true); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,56 @@
|
||||
package com.fr.design.report.fit.menupane; |
||||
|
||||
import com.fr.design.beans.BasicBeanPane; |
||||
import com.fr.report.fit.ReportFitAttr; |
||||
|
||||
import javax.swing.BorderFactory; |
||||
import javax.swing.BoxLayout; |
||||
|
||||
/** |
||||
* Created by Administrator on 2015/7/6 0006. |
||||
*/ |
||||
public class ReportFitAttrPane extends BasicBeanPane<ReportFitAttr> { |
||||
|
||||
private BrowserFitAttrPane attrPane; |
||||
|
||||
|
||||
public ReportFitAttrPane() { |
||||
initComponents(); |
||||
} |
||||
|
||||
private void initComponents() { |
||||
this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); |
||||
this.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); |
||||
attrPane = new BrowserFitAttrPane(); |
||||
this.add(attrPane); |
||||
|
||||
} |
||||
|
||||
/** |
||||
* 展示界面 |
||||
* |
||||
* @param fitAttr 自适应属性 |
||||
*/ |
||||
public void populateBean(ReportFitAttr fitAttr) { |
||||
attrPane.populateBean(fitAttr); |
||||
} |
||||
|
||||
/** |
||||
* 提交数据 |
||||
* |
||||
* @return 界面上的更新数据 |
||||
*/ |
||||
public ReportFitAttr updateBean() { |
||||
return attrPane.updateBean(); |
||||
} |
||||
|
||||
/** |
||||
* 标题 |
||||
* |
||||
* @return 标题 |
||||
*/ |
||||
protected String title4PopupWindow() { |
||||
return com.fr.design.i18n.Toolkit.i18nText("Fine-Designer_Fit-Attr"); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,85 @@
|
||||
package com.fr.design.report.fit.menupane; |
||||
|
||||
import com.fr.config.Configuration; |
||||
import com.fr.design.gui.ilable.UILabel; |
||||
import com.fr.report.fit.ReportFitAttr; |
||||
import com.fr.report.fit.ReportFitConfig; |
||||
import com.fr.transaction.Configurations; |
||||
import com.fr.transaction.Worker; |
||||
|
||||
import java.awt.Component; |
||||
|
||||
/** |
||||
* Created by 夏翔 on 2016/6/24. |
||||
*/ |
||||
public class TemplateBrowserFitAttrPane extends BrowserFitAttrPane { |
||||
|
||||
public TemplateBrowserFitAttrPane() { |
||||
initComponents(ReportFitConfig.getInstance().getCptFitAttr()); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
protected Component[][] initFitComponents() { |
||||
Component[][] components = new Component[][]{ |
||||
new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Designer_Fit-Font")), fontFitRadio, null, fontNotFitRadio}, |
||||
new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Designer_Fit-Element")), horizonRadio, doubleRadio, notFitRadio} |
||||
}; |
||||
return components; |
||||
} |
||||
|
||||
@Override |
||||
public void populateBean(ReportFitAttr attr) { |
||||
//模板界面,自适应选项去掉了默认,这边的判断为了兼容之前的设置
|
||||
if (attr != null && attr.fitStateInPC() == 0) { |
||||
attr.setFitStateInPC(3); |
||||
} |
||||
ReportFitAttr fitAttr = ReportFitConfig.getInstance().getCptFitAttr(); |
||||
if (attr == null) { |
||||
//如果为空, 就用全局的
|
||||
attr = fitAttr; |
||||
populateGlobalComponents(); |
||||
} else if (fitAttr.fitStateInPC() == 0) { |
||||
attr = new ReportFitAttr(); |
||||
attr.setFitStateInPC(3); |
||||
initBorderPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Designer_Fit-Local")); |
||||
} else { |
||||
initBorderPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Designer_Fit-Local")); |
||||
} |
||||
this.localFitAttr = attr; |
||||
fontRadioGroup.selectFontFit((attr).isFitFont()); |
||||
fitRadionGroup.selectIndexButton(attr.fitStateInPC()); |
||||
fitPreviewPane.refreshPreview(getCurrentFitOptions(), fitRadionGroup.isEnabled()); |
||||
} |
||||
|
||||
@Override |
||||
public ReportFitAttr updateBean() { |
||||
ReportFitAttr attr = new ReportFitAttr(); |
||||
attr.setFitFont(fontRadioGroup.isFontFit()); |
||||
attr.setFitStateInPC(fitRadionGroup.getSelectRadioIndex()); |
||||
|
||||
// 直接用全局的
|
||||
if (globalCheck.isSelected()) { |
||||
updateGlobalConfig(attr); |
||||
return null; |
||||
} |
||||
this.localFitAttr = attr; |
||||
return attr; |
||||
} |
||||
|
||||
private void updateGlobalConfig(final ReportFitAttr attr) { |
||||
|
||||
Configurations.update(new Worker() { |
||||
@Override |
||||
public void run() { |
||||
ReportFitConfig manager = ReportFitConfig.getInstance(); |
||||
manager.setCptFitAttr(attr); |
||||
} |
||||
|
||||
@Override |
||||
public Class<? extends Configuration>[] targets() { |
||||
return new Class[]{ReportFitConfig.class}; |
||||
} |
||||
}); |
||||
} |
||||
} |
@ -0,0 +1,55 @@
|
||||
package com.fr.design.report.fit.menupane; |
||||
|
||||
import com.fr.design.beans.BasicBeanPane; |
||||
import com.fr.report.fit.ReportFitAttr; |
||||
|
||||
import javax.swing.BorderFactory; |
||||
import javax.swing.BoxLayout; |
||||
|
||||
/** |
||||
* Created by 夏翔 on 2016/6/24. |
||||
*/ |
||||
public class TemplateFitAttrPane extends BasicBeanPane<ReportFitAttr> { |
||||
private TemplateBrowserFitAttrPane attrPane; |
||||
|
||||
|
||||
public TemplateFitAttrPane() { |
||||
initComponents(); |
||||
} |
||||
|
||||
private void initComponents() { |
||||
this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); |
||||
this.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); |
||||
attrPane = new TemplateBrowserFitAttrPane(); |
||||
this.add(attrPane); |
||||
|
||||
} |
||||
|
||||
/** |
||||
* 展示界面 |
||||
* |
||||
* @param fitAttr 自适应属性 |
||||
*/ |
||||
public void populateBean(ReportFitAttr fitAttr) { |
||||
attrPane.populateBean(fitAttr); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* 提交数据 |
||||
* |
||||
* @return 界面上的更新数据 |
||||
*/ |
||||
public ReportFitAttr updateBean() { |
||||
return attrPane.updateBean(); |
||||
} |
||||
|
||||
/** |
||||
* 标题 |
||||
* |
||||
* @return 标题 |
||||
*/ |
||||
protected String title4PopupWindow() { |
||||
return com.fr.design.i18n.Toolkit.i18nText("Fine-Designer_Fit-Attr"); |
||||
} |
||||
} |
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue