diff --git a/designer/src/com/fr/design/actions/report/ReportMobileAttrAction.java b/designer/src/com/fr/design/actions/report/ReportMobileAttrAction.java index 84d1facdf4..be9421312b 100644 --- a/designer/src/com/fr/design/actions/report/ReportMobileAttrAction.java +++ b/designer/src/com/fr/design/actions/report/ReportMobileAttrAction.java @@ -11,7 +11,10 @@ import com.fr.design.report.mobile.ReportMobileAttrPane; import com.fr.general.IOUtils; import com.fr.general.Inter; import com.fr.main.TemplateWorkBook; +import com.fr.plugin.ExtraClassManager; import com.fr.report.mobile.ElementCaseMobileAttr; +import com.fr.stable.ReportFunctionProcessor; +import com.fr.stable.fun.FunctionProcessor; import javax.swing.*; import java.awt.event.ActionEvent; @@ -50,8 +53,15 @@ public class ReportMobileAttrAction extends JWorkBookAction{ BasicDialog dialog = mobileAttrPane.showWindow(DesignerContext.getDesignerFrame(), new DialogActionAdapter() { @Override public void doOk() { - wbTpl.setReportMobileAttr(mobileAttrPane.updateBean()); + ElementCaseMobileAttr elementCaseMobileAttr = mobileAttrPane.updateBean(); + wbTpl.setReportMobileAttr(elementCaseMobileAttr); jwb.fireTargetModified(); + if (elementCaseMobileAttr.isMobileCanvasSize()) { + FunctionProcessor processor = ExtraClassManager.getInstance().getFunctionProcessor(); + if (processor != null) { + processor.recordFunction(ReportFunctionProcessor.MOBILE_TEMPLATE_CPT); + } + } } }); dialog.setVisible(true); diff --git a/designer/src/com/fr/design/mainframe/JWorkBook.java b/designer/src/com/fr/design/mainframe/JWorkBook.java index 8fc64277e8..a93e602210 100644 --- a/designer/src/com/fr/design/mainframe/JWorkBook.java +++ b/designer/src/com/fr/design/mainframe/JWorkBook.java @@ -967,6 +967,11 @@ public class JWorkBook extends JTemplate { return ps; } + @Override + public Parameter[] getJTemplateParameters() { + return this.parameterPane.getAllParameters(); + } + /** * 请求单元格区域的焦点 */ diff --git a/designer/src/com/fr/design/mainframe/form/FormElementCaseDesigner.java b/designer/src/com/fr/design/mainframe/form/FormElementCaseDesigner.java index aa80c59b01..1cdab0e7e6 100644 --- a/designer/src/com/fr/design/mainframe/form/FormElementCaseDesigner.java +++ b/designer/src/com/fr/design/mainframe/form/FormElementCaseDesigner.java @@ -30,6 +30,7 @@ import com.fr.design.menu.ShortCut; import com.fr.design.menu.ToolBarDef; import com.fr.design.present.ConditionAttributesGroupPane; import com.fr.form.FormElementCaseProvider; +import com.fr.form.main.Form; import com.fr.general.Inter; import com.fr.grid.selection.CellSelection; import com.fr.grid.selection.Selection; @@ -50,11 +51,11 @@ public class FormElementCaseDesigner{ - public FormElementCasePaneDelegate(FormElementCase sheet) { + public FormElementCasePaneDelegate(FormElementCase sheet, Form form) { super(sheet); + this.getGrid().setShowPaginateLine(form.getFormMobileAttr().isMobileOnly()); this.addSelectionChangeListener(new SelectionListener() { @Override public void selectionChanged(SelectionEvent e) { diff --git a/designer/src/com/fr/design/report/PageSetupPane.java b/designer/src/com/fr/design/report/PageSetupPane.java index 07076b1776..883690a088 100644 --- a/designer/src/com/fr/design/report/PageSetupPane.java +++ b/designer/src/com/fr/design/report/PageSetupPane.java @@ -73,14 +73,6 @@ public class PageSetupPane extends BasicPane { private OtherPane otherPane; private UILabel zeroMarginWarn; - public final static PaperSize MOBILE_SMAIL_SIZE = new PaperSize(new MM(142.8f), new MM(254)); - public final static PaperSize MOBILE_LARGE_SIZE = new PaperSize(new MM(190.5f), new MM(338.7f)); - - public static final Object[][] MOBILE_NAME_SIZE_ARRAY = { - {Inter.getLocText("FR-Designer_PaperSize-Mobile-Large"),MOBILE_LARGE_SIZE}, - {Inter.getLocText("FR-Designer_PaperSize-Mobile-Small"),MOBILE_SMAIL_SIZE} - }; - public PageSetupPane() { this.initComponents(); } @@ -135,12 +127,10 @@ public class PageSetupPane extends BasicPane { private UIRadioButton landscapeRadioButton; private UIRadioButton predefinedRadioButton; - private UIRadioButton mobileRadioButton; private UIRadioButton customRadioButton; private UIComboBox predefinedComboBox; - private UIComboBox mobileComboBox; - + private UIBasicSpinner paperWidthSpinner; private UIBasicSpinner paperHeightSpinner; private UIComboBox switchInch; @@ -210,20 +200,14 @@ public class PageSetupPane extends BasicPane { predefinedRadioButton = new UIRadioButton(Inter.getLocText("PageSetup-Predefined") + ":"); predefinedRadioButton.setMnemonic('P'); predefinedRadioButton.addActionListener(previewListener); - - mobileRadioButton = new UIRadioButton(Inter.getLocText("FR-Designer_MobilePhone") + " :"); - mobileRadioButton.setMnemonic('M'); - mobileRadioButton.addActionListener(previewListener); - - + customRadioButton = new UIRadioButton(Inter.getLocText("Custom") + ":"); customRadioButton.setMnemonic('C'); customRadioButton.addActionListener(previewListener); predefinedComboBox = new UIComboBox(); - mobileComboBox = new UIComboBox(); - + paperWidthSpinner = new UIBasicSpinner(new SpinnerNumberModel(0.0, 0.0, Double.MAX_VALUE, 1.0)); ((JSpinner.DefaultEditor) paperWidthSpinner.getEditor()).getTextField().setColumns(7); paperHeightSpinner = new UIBasicSpinner(new SpinnerNumberModel(0.0, 0.0, Double.MAX_VALUE, 1.0)); @@ -239,9 +223,7 @@ public class PageSetupPane extends BasicPane { predefinedComboBox.setRenderer(paperSizeCellRenderere); predefinedComboBox.addItemListener(paperSizeItemListener); - - mobileComboBox.setRenderer(paperSizeMobileCellRenderere); - mobileComboBox.addItemListener(paperSizeItemMobileListener); + ((JSpinner.DefaultEditor) paperWidthSpinner.getEditor()).getTextField().getDocument().addDocumentListener(customTextListener); ((JSpinner.DefaultEditor) paperHeightSpinner.getEditor()).getTextField().getDocument().addDocumentListener(customTextListener); @@ -253,12 +235,6 @@ public class PageSetupPane extends BasicPane { Object[] tmpPaperSizeNameArray = ReportConstants.PaperSizeNameSizeArray[i]; predefinedComboBox.addItem(tmpPaperSizeNameArray[1]); } - - for(int i=0; i{ - + private ReportMobileTemplateSettingsPane reportMobileTemplateSettingsPane; // 模版设置面板 private AppFitBrowserPane appFitBrowserPane; - //工具栏容器 private MobileToolBarPane mobileToolBarPane; @@ -28,6 +27,10 @@ public class ReportMobileAttrPane extends BasicBeanPane{ JPanel jPanel = new JPanel(); jPanel.setLayout(new BoxLayout(jPanel, BoxLayout.Y_AXIS)); jPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); + + reportMobileTemplateSettingsPane = new ReportMobileTemplateSettingsPane(); + jPanel.add(reportMobileTemplateSettingsPane); + appFitBrowserPane = new AppFitBrowserPane(); appFitBrowserPane.setAppFitPreviewPane(appFitPreviewPane); jPanel.add(appFitBrowserPane); @@ -46,13 +49,14 @@ public class ReportMobileAttrPane extends BasicBeanPane{ } appFitBrowserPane.populateBean(ob); mobileToolBarPane.populateBean(ob); - + reportMobileTemplateSettingsPane.populateBean(ob); } @Override public ElementCaseMobileAttr updateBean() { ElementCaseMobileAttr caseMobileAttr = appFitBrowserPane.updateBean(); mobileToolBarPane.updateBean(caseMobileAttr); + reportMobileTemplateSettingsPane.updateBean(caseMobileAttr); return caseMobileAttr; } diff --git a/designer/src/com/fr/design/report/mobile/ReportMobileTemplateSettingsPane.java b/designer/src/com/fr/design/report/mobile/ReportMobileTemplateSettingsPane.java new file mode 100644 index 0000000000..e449091a5b --- /dev/null +++ b/designer/src/com/fr/design/report/mobile/ReportMobileTemplateSettingsPane.java @@ -0,0 +1,102 @@ +package com.fr.design.report.mobile; + +import com.fr.design.beans.BasicBeanPane; +import com.fr.design.designer.IntervalConstants; +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.general.Inter; +import com.fr.report.mobile.ElementCaseMobileAttr; + +import javax.swing.*; +import java.awt.*; + +/** + * Created by plough on 2018/1/8. + */ +public class ReportMobileTemplateSettingsPane extends BasicBeanPane { + + private UICheckBox mobileCanvasSizeCheck; // 设置为手机模版画布大小 + + public ReportMobileTemplateSettingsPane() { + this.initComponents(); + } + + private void initComponents() { + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + JPanel borderPane = FRGUIPaneFactory.createTitledBorderPane(this.title4PopupWindow()); + + JPanel contentPane = new JPanel(FRGUIPaneFactory.createBorderLayout()); + contentPane.setBorder(BorderFactory.createEmptyBorder(0, IntervalConstants.INTERVAL_L2, 0, 0)); + + contentPane.add(getMobileCanvasSizeCheckPane(), BorderLayout.CENTER); + + borderPane.add(contentPane); + this.add(borderPane); + } + + private JPanel getMobileCanvasSizeCheckPane() { + JPanel panel = new JPanel(FRGUIPaneFactory.createBorderLayout()); + mobileCanvasSizeCheck = new UICheckBox(Inter.getLocText("FR-Designer_Set_Mobile_Canvas_Size")); + panel.add(mobileCanvasSizeCheck, BorderLayout.NORTH); + panel.add(getCanvasDescPane(), BorderLayout.CENTER); + panel.setBorder(BorderFactory.createEmptyBorder(IntervalConstants.INTERVAL_L1, 0, IntervalConstants.INTERVAL_L6, 0)); + return panel; + } + + private JPanel getCanvasDescPane() { + + UILabel desc1 = createDescLabel(Inter.getLocText("FR-Designer_Mobile_Screen_Match_Desc")); + UILabel desc2 = createDescLabel(Inter.getLocText("FR-Designer_Mobile_Screen_Zoom_In_Desc")); + UILabel desc3 = createDescLabel(Inter.getLocText("FR-Designer_Mobile_Screen_Zoom_Out_Desc")); + + double f = TableLayout.FILL; + double p = TableLayout.PREFERRED; + double[] rowSize = {p, p, p, p}; + double[] columnSize = {p, f}; + int[][] rowCount = {{1, 1}, {1, 1}, {1, 1}}; + Component[][] components = new Component[][]{ + new Component[]{desc1, null}, + new Component[]{desc2, null}, + new Component[]{desc3, null} + }; + JPanel panel = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, IntervalConstants.INTERVAL_W0, IntervalConstants.INTERVAL_L1); + panel.setBorder(BorderFactory.createEmptyBorder(IntervalConstants.INTERVAL_L7, IntervalConstants.INTERVAL_W4, IntervalConstants.INTERVAL_L1, 0)); + return panel; + } + + private UILabel createDescLabel(String desc) { + UILabel label = new UILabel(desc); + label.setForeground(Color.gray); + return label; + } + + @Override + public void populateBean(ElementCaseMobileAttr ob) { + if (ob == null) { + ob = new ElementCaseMobileAttr(); + } + mobileCanvasSizeCheck.setSelected(ob.isMobileCanvasSize()); + } + + @Override + public ElementCaseMobileAttr updateBean() { + ElementCaseMobileAttr mobileAttr = new ElementCaseMobileAttr(); + mobileAttr.setMobileCanvasSize(mobileCanvasSizeCheck.isSelected()); + return mobileAttr; + } + + @Override + public void updateBean(ElementCaseMobileAttr mobileAttr) { + if(mobileAttr != null) { + mobileAttr.setMobileCanvasSize(mobileCanvasSizeCheck.isSelected()); + } + } + + @Override + protected String title4PopupWindow() { + return Inter.getLocText("FR-Designer_Template_Settings"); + } +} \ No newline at end of file diff --git a/designer/src/com/fr/grid/GridUI.java b/designer/src/com/fr/grid/GridUI.java index 390e2779ac..d904b7c138 100644 --- a/designer/src/com/fr/grid/GridUI.java +++ b/designer/src/com/fr/grid/GridUI.java @@ -581,11 +581,6 @@ public class GridUI extends ComponentUI { } private void paintPaginateLines(Graphics g, Grid grid) { - JTemplate jTemplate = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate(); - if(!jTemplate.isJWorkBook()){ - //报表块无分页之说 - return; - } Graphics2D g2d = (Graphics2D) g; // james 画分页线 diff --git a/designer_base/src/com/fr/design/actions/help/AboutPane.java b/designer_base/src/com/fr/design/actions/help/AboutPane.java index b55161a167..3b15cf3cc3 100644 --- a/designer_base/src/com/fr/design/actions/help/AboutPane.java +++ b/designer_base/src/com/fr/design/actions/help/AboutPane.java @@ -68,28 +68,36 @@ public class AboutPane extends JPanel { Inter.getLocText("FR-Designer-Basic_Activation_Key_Copy_OK") })); - if (shouldShowPhoneAndQQ()) { - if (ComparatorUtils.equals(ProductConstants.APP_NAME, FINEREPORT)) { - boxCenterAlignmentPane = new BoxCenterAligmentPane(Inter.getLocText("FR-Designer_Service_Phone") + ProductConstants.COMPARE_TELEPHONE); - contentPane.add(boxCenterAlignmentPane); - } - boxCenterAlignmentPane = new BoxCenterAligmentPane("QQ:" + SiteCenter.getInstance().acquireUrlByKind("help.qq")); - contentPane.add(boxCenterAlignmentPane); - } + addPhoneAndQQPane(contentPane); + + // 官网 + JPanel urlActionPane = getURLActionPane(Inter.getLocText("FR-Designer_Official_Website"), SiteCenter.getInstance().acquireUrlByKind("website." + FRContext.getLocale(), ProductConstants.WEBSITE_URL)); - BoxCenterAligmentPane actionLabel = getURLActionLabel(SiteCenter.getInstance().acquireUrlByKind("website." + FRContext.getLocale(), ProductConstants.WEBSITE_URL)); - BoxCenterAligmentPane emailLabel = getEmailActionLabel(SiteCenter.getInstance().acquireUrlByKind("support.email", ProductConstants.SUPPORT_EMAIL)); + // 支持邮箱 + String defaultEmail = SiteCenter.getInstance().acquireUrlByKind("support.email", ProductConstants.SUPPORT_EMAIL); + JPanel emailPane = getEmailActionPane(Inter.getLocText("FR-Designer_Support_Email"),SiteCenter.getInstance().acquireUrlByKind("support.email." + FRContext.getLocale(), defaultEmail)); - contentPane.add(actionLabel); - contentPane.add(emailLabel); + contentPane.add(urlActionPane); + contentPane.add(emailPane); if (shouldShowThanks()) { addThankPane(contentPane); } } - // 是否显示服务电话和 qq - private boolean shouldShowPhoneAndQQ() { - return !FRContext.getLocale().equals(Locale.US); + private void addPhoneAndQQPane(JPanel contentPane) { + BoxCenterAligmentPane boxCenterAlignmentPane; + // 英文版不显示服务电话和QQ + if (FRContext.getLocale().equals(Locale.US)) { + return; + } + boxCenterAlignmentPane = new BoxCenterAligmentPane(Inter.getLocText("FR-Designer_Service_Phone") + SiteCenter.getInstance().acquireUrlByKind("service.phone." + FRContext.getLocale(), ProductConstants.COMPARE_TELEPHONE)); + contentPane.add(boxCenterAlignmentPane); + // 繁体版不显示QQ + if (FRContext.getLocale().equals(Locale.TAIWAN)) { + return; + } + boxCenterAlignmentPane = new BoxCenterAligmentPane("QQ: " + SiteCenter.getInstance().acquireUrlByKind("help.qq")); + contentPane.add(boxCenterAlignmentPane); } // 是否显示鸣谢面板 @@ -133,7 +141,7 @@ public class AboutPane extends JPanel { StringUtils.BLANK, ProductConstants.RELEASE_VERSION, BUILD_PREFIX); } - private BoxCenterAligmentPane getEmailActionLabel(final String mailTo) { + private JPanel getEmailActionPane(final String desc, final String mailTo){ ActionLabel emailLabel = new ActionLabel(mailTo); emailLabel.addActionListener(new ActionListener() { @@ -147,10 +155,13 @@ public class AboutPane extends JPanel { } }); - return new BoxCenterAligmentPane(emailLabel); + JPanel panel = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); + panel.add(new UILabel(desc)); + panel.add(emailLabel); + return panel; } - private BoxCenterAligmentPane getURLActionLabel(final String url) { + private JPanel getURLActionPane(final String desc, final String url){ ActionLabel actionLabel = new ActionLabel(url); actionLabel.addActionListener(new ActionListener() { @Override @@ -163,7 +174,11 @@ public class AboutPane extends JPanel { } }); - return new BoxCenterAligmentPane(actionLabel); + JPanel panel = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); + panel.add(new UILabel(desc)); + panel.add(actionLabel); + + return panel; } class UserLabel extends BoldFontTextLabel { diff --git a/designer_base/src/com/fr/design/designer/IntervalConstants.java b/designer_base/src/com/fr/design/designer/IntervalConstants.java index 1f210c70f5..a2a2ee669e 100644 --- a/designer_base/src/com/fr/design/designer/IntervalConstants.java +++ b/designer_base/src/com/fr/design/designer/IntervalConstants.java @@ -27,4 +27,6 @@ public class IntervalConstants { public static final int INTERVAL_W3 = 49; + public static final int INTERVAL_W4 = 22; + } diff --git a/designer_base/src/com/fr/design/dialog/mobile/MobileRadioCheckPane.java b/designer_base/src/com/fr/design/dialog/mobile/MobileRadioCheckPane.java index ee38557612..af4bcea990 100644 --- a/designer_base/src/com/fr/design/dialog/mobile/MobileRadioCheckPane.java +++ b/designer_base/src/com/fr/design/dialog/mobile/MobileRadioCheckPane.java @@ -1,6 +1,8 @@ package com.fr.design.dialog.mobile; import com.fr.design.beans.BasicBeanPane; +import com.fr.design.event.ChangeListener; +import com.fr.design.event.UIObserverListener; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.ilable.UILabel; import com.fr.design.layout.TableLayout; @@ -10,6 +12,7 @@ import com.fr.stable.StringUtils; import javax.swing.*; import java.awt.*; +import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.List; diff --git a/designer_base/src/com/fr/design/gui/controlpane/UISimpleListControlPane.java b/designer_base/src/com/fr/design/gui/controlpane/UISimpleListControlPane.java new file mode 100644 index 0000000000..b2c90fbc79 --- /dev/null +++ b/designer_base/src/com/fr/design/gui/controlpane/UISimpleListControlPane.java @@ -0,0 +1,467 @@ +package com.fr.design.gui.controlpane; + +import com.fr.base.BaseUtils; +import com.fr.design.actions.UpdateAction; +import com.fr.design.constants.UIConstants; +import com.fr.design.dialog.BasicPane; +import com.fr.design.gui.icontainer.UIScrollPane; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.gui.ilist.ListModelElement; +import com.fr.design.gui.ilist.UIList; +import com.fr.design.gui.itoolbar.UIToolBarUI; +import com.fr.design.gui.itoolbar.UIToolbar; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.menu.ShortCut; +import com.fr.design.menu.ToolBarDef; +import com.fr.general.ComparatorUtils; +import com.fr.general.Inter; +import com.fr.stable.ArrayUtils; +import com.fr.stable.Nameable; +import com.fr.stable.StringUtils; +import sun.swing.DefaultLookup; + +import javax.swing.*; +import javax.swing.border.Border; +import javax.swing.event.ListSelectionEvent; +import javax.swing.event.ListSelectionListener; +import java.awt.*; +import java.awt.event.*; +import java.util.Arrays; +import java.util.Comparator; + +/** + * 简单列表面板 + * Created by plough on 2018/2/1. + */ +public class UISimpleListControlPane extends BasicPane { + public static final String LIST_NAME = "UISimpleControl_List"; + + protected UIList nameList; + protected String selectedName; + private ShortCut4JControlPane[] shorts; + private ToolBarDef toolbarDef; + private UIToolbar toolBar; + + public UISimpleListControlPane() { + initComponentPane(); + } + + public ShortCut4JControlPane[] getShorts() { + return shorts; + } + + protected void initComponentPane() { + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + this.add(getContentPane(), BorderLayout.CENTER); + this.checkButtonEnabled(); + } + + protected JPanel getContentPane() { + JPanel contentPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + + JPanel listPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + initListPane(listPane); + contentPane.add(listPane, BorderLayout.CENTER); + + shorts = this.createShortcuts(); + if (ArrayUtils.isEmpty(shorts)) { + return contentPane; + } + + toolbarDef = new ToolBarDef(); + for (ShortCut4JControlPane sj : shorts) { + toolbarDef.addShortCut(sj.getShortCut()); + } + toolBar = ToolBarDef.createJToolBar(); + toolBar.setUI(new UIToolBarUI(){ + @Override + public void paint(Graphics g, JComponent c) { + Graphics2D g2 = (Graphics2D) g; + g2.setColor(Color.WHITE); + g2.fillRect(0, 0, c.getWidth(), c.getHeight()); + } + }); + toolbarDef.updateToolBar(toolBar); + // 封装一层,加边框 + JPanel toolBarPane = new JPanel(new BorderLayout()); + toolBarPane.add(toolBar, BorderLayout.CENTER); + toolBarPane.setBorder(BorderFactory.createMatteBorder(1, 1, 0, 1, UIConstants.RULER_LINE_COLOR)); + + listPane.add(toolBarPane, BorderLayout.NORTH); + + return contentPane; + } + + protected ShortCut4JControlPane[] createShortcuts() { + return new ShortCut4JControlPane[]{ + moveUpItemShortCut(), + moveDownItemShortCut(), + sortItemShortCut(), + }; + } + + protected void initListPane(JPanel listPane) { + nameList = createJNameList(); + nameList.setName(LIST_NAME); + nameList.setSelectionBackground(UIConstants.ATTRIBUTE_PRESS); + listPane.add(new UIScrollPane(nameList), BorderLayout.CENTER); + + + nameList.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); + nameList.addMouseListener(listMouseListener); + nameList.addListSelectionListener(new ListSelectionListener() { + public void valueChanged(ListSelectionEvent evt) { + // richie:避免多次update和populate大大降低效率 + if (!evt.getValueIsAdjusting()) { + UISimpleListControlPane.this.checkButtonEnabled(); + } + } + }); + } + + public UIList createJNameList() { + UIList nameList = new UIList(new DefaultListModel()) { + @Override + public int locationToIndex(Point location) { + int index = super.locationToIndex(location); + if (index != -1 && !getCellBounds(index, index).contains(location)) { + return -1; + } + else { + return index; + } + } + }; + nameList.setCellRenderer(new NameableListCellRenderer(this)); + return nameList; + } + + protected ShortCut4JControlPane moveUpItemShortCut() { + return new NormalEnableShortCut(new MoveUpItemAction()); + } + + protected ShortCut4JControlPane moveDownItemShortCut() { + return new NormalEnableShortCut(new MoveDownItemAction()); + } + + protected ShortCut4JControlPane sortItemShortCut() { + return new NormalEnableShortCut(new SortItemAction()); + } + + public Nameable[] update() { + java.util.List res = new java.util.ArrayList(); + DefaultListModel listModel = (DefaultListModel) this.nameList.getModel(); + for (int i = 0, len = listModel.getSize(); i < len; i++) { + res.add(((ListModelElement) listModel.getElementAt(i)).wrapper); + } + + return res.toArray(new Nameable[res.size()]); + } + + public void populate(Nameable[] nameableArray) { + DefaultListModel listModel = (DefaultListModel) this.nameList.getModel(); + listModel.removeAllElements(); + if (ArrayUtils.isEmpty(nameableArray)) { + return; + } + + listModel.setSize(nameableArray.length); + for (int i = 0; i < nameableArray.length; i++) { + listModel.set(i, new ListModelElement(nameableArray[i])); + } + if (listModel.size() > 0 || this.nameList.getSelectedIndex() != 0) { + this.nameList.setSelectedIndex(0); + } + this.checkButtonEnabled(); + } + + /** + * 根据name,选中UINameEdList中的item + */ + public void setSelectedName(String name) { + DefaultListModel listModel = (DefaultListModel) this.nameList.getModel(); + for (int i = 0, len = listModel.getSize(); i < len; i++) { + Nameable item = ((ListModelElement) listModel.getElementAt(i)).wrapper; + if (ComparatorUtils.equals(name, item.getName())) { + this.nameList.setSelectedIndex(i); + break; + } + } + } + + /** + * 获取选中的名字 + */ + public String getSelectedName() { + ListModelElement el = (ListModelElement) this.nameList.getSelectedValue(); + + return el == null ? null : el.wrapper.getName(); + } + + protected DefaultListModel getModel() { + return (DefaultListModel) this.nameList.getModel(); + } + + @Override + protected String title4PopupWindow() { + return null; + } + + /* + * 上移Item + */ + private class MoveUpItemAction extends UpdateAction { + public MoveUpItemAction() { + this.setName(Inter.getLocText("Utils-Move_Up")); + this.setMnemonic('U'); + this.setSmallIcon(BaseUtils + .readIcon("/com/fr/design/images/control/up.png")); + } + + @Override + public void actionPerformed(ActionEvent evt) { + int selectedIndex = nameList.getSelectedIndex(); + if (selectedIndex == -1) { + return; + } + + // 上移 + if (selectedIndex > 0) { + DefaultListModel listModel = (DefaultListModel) nameList.getModel(); + + Object prevObj = listModel.get(selectedIndex - 1); + Object currentObj = listModel.get(selectedIndex); + listModel.set(selectedIndex - 1, currentObj); + listModel.set(selectedIndex, prevObj); + + nameList.setSelectedIndex(selectedIndex - 1); + nameList.ensureIndexIsVisible(selectedIndex - 1); + } + } + } + + /* + * 下移Item + */ + private class MoveDownItemAction extends UpdateAction { + public MoveDownItemAction() { + this.setName(Inter.getLocText("Utils-Move_Down")); + this.setMnemonic('D'); + this.setSmallIcon(BaseUtils + .readIcon("/com/fr/design/images/control/down.png")); + } + + @Override + public void actionPerformed(ActionEvent evt) { + int selectedIndex = nameList.getSelectedIndex(); + if (selectedIndex == -1) { + return; + } + + if (selectedIndex < nameList.getModel().getSize() - 1) { + DefaultListModel listModel = (DefaultListModel) nameList.getModel(); + + Object nextObj = listModel.get(selectedIndex + 1); + Object currentObj = listModel.get(selectedIndex); + listModel.set(selectedIndex + 1, currentObj); + listModel.set(selectedIndex, nextObj); + + nameList.setSelectedIndex(selectedIndex + 1); + nameList.ensureIndexIsVisible(selectedIndex + 1); + } + } + } + + private class SortItemAction extends UpdateAction { + private boolean isAtoZ = false; + + public SortItemAction() { + this.setName(Inter.getLocText("FR-Action_Sort")); + this.setMnemonic('S'); + this.setSmallIcon(BaseUtils + .readIcon("/com/fr/design/images/control/sortAsc.png")); + } + + @Override + public void actionPerformed(ActionEvent evt) { + // p:选中的值. + Object selectedValue = nameList.getSelectedValue(); + + DefaultListModel listModel = (DefaultListModel) nameList.getModel(); + if (listModel.getSize() <= 0) { + return; + } + Nameable[] nameableArray = new Nameable[listModel.getSize()]; + + for (int i = 0; i < listModel.getSize(); i++) { + nameableArray[i] = ((ListModelElement) listModel.getElementAt(i)).wrapper; + } + + // p:排序. + if (isAtoZ) { // 升序 + Comparator nameableComparator = new Comparator() { + @Override + public int compare(Nameable o1, Nameable o2) { + return ComparatorUtils.compare(o2.getName(), o1.getName()); + } + }; + isAtoZ = !isAtoZ; + Arrays.sort(nameableArray, nameableComparator); + } else { // 降序 + Comparator nameableComparator = new Comparator() { + @Override + public int compare(Nameable o1, Nameable o2) { + return ComparatorUtils.compare(o1.getName(), o2 + .getName()); + } + }; + isAtoZ = !isAtoZ; + Arrays.sort(nameableArray, nameableComparator); + } + + for (int i = 0; i < nameableArray.length; i++) { + listModel.set(i, new ListModelElement(nameableArray[i])); + } + + // p:需要选中以前的那个值. + if (selectedValue != null) { + nameList.setSelectedValue(selectedValue, true); + } + + checkButtonEnabled(); + // p:需要repaint. + nameList.repaint(); + } + } + + /* + * UIList的鼠标事件 + */ + private MouseListener listMouseListener = new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + JList list = (JList) e.getSource(); + if (list.locationToIndex(e.getPoint()) == -1 && !e.isShiftDown() + && !isMenuShortcutKeyDown(e)) { + list.clearSelection(); + } + } + + private boolean isMenuShortcutKeyDown(InputEvent event) { + return (event.getModifiers() & Toolkit.getDefaultToolkit() + .getMenuShortcutKeyMask()) != 0; + } + }; + + /** + * 检查按钮可用状态 Check button enabled. + */ + public void checkButtonEnabled() { + for (ShortCut4JControlPane sj : getShorts()) { + sj.checkEnable(); + } + } + + /** + * 设置选中项 + * + * @param index 选中项的序列号 + */ + public void setSelectedIndex(int index) { + nameList.setSelectedIndex(index); + } + + + public class NormalEnableShortCut extends ShortCut4JControlPane { + public NormalEnableShortCut(ShortCut shortCut) { + this.shortCut = shortCut; + } + + /** + * 检查是否可用 + */ + @Override + public void checkEnable() { + this.shortCut.setEnabled(getModel() + .getSize() > 0 + && UISimpleListControlPane.this.nameList.getSelectedIndex() != -1); + } + } + + + private class NameableListCellRenderer extends + JPanel implements ListCellRenderer { + + private UILabel label; + private UISimpleListControlPane listControlPane; + private Color initialLabelForeground; + + public NameableListCellRenderer(UISimpleListControlPane listControlPane) { + super(); + this.listControlPane = listControlPane; + initComponents(); + setOpaque(true); + setBorder(getNoFocusBorder()); + setName("List.cellRenderer"); + } + + private void initComponents() { + label = new UILabel(); + label.setBorder(BorderFactory.createEmptyBorder(3, 10, 3, 0)); + initialLabelForeground = label.getForeground(); + this.setLayout(new BorderLayout()); + this.add(label, BorderLayout.CENTER); + } + + private Border getNoFocusBorder() { + return BorderFactory.createMatteBorder(0, 0, 1, 0, UIConstants.LIST_ITEM_SPLIT_LINE); + } + + private void setText(String t) { + label.setText(t); + } + + @Override + public Component getListCellRendererComponent(JList list, Object value, + int index, boolean isSelected, boolean cellHasFocus) { + setComponentOrientation(list.getComponentOrientation()); + + Color bg = null; + Color fg = null; + + JList.DropLocation dropLocation = list.getDropLocation(); + if (dropLocation != null + && !dropLocation.isInsert() + && dropLocation.getIndex() == index) { + + bg = DefaultLookup.getColor(this, ui, "List.dropCellBackground"); + fg = DefaultLookup.getColor(this, ui, "List.dropCellForeground"); + + isSelected = true; + } + + if (isSelected) { + setBackground(bg == null ? list.getSelectionBackground() : bg); + setForeground(fg == null ? list.getSelectionForeground() : fg); + label.setForeground(Color.WHITE); + } + else { + setBackground(list.getBackground()); + setForeground(list.getForeground()); + label.setForeground(initialLabelForeground); + } + + setText((value == null) ? StringUtils.EMPTY : value.toString()); + + setEnabled(list.isEnabled()); + setFont(list.getFont()); + + if (value instanceof ListModelElement) { + Nameable wrappee = ((ListModelElement) value).wrapper; + this.setText(wrappee.getName()); + } + + return this; + } + } +} diff --git a/designer_base/src/com/fr/design/gui/frpane/AbstractAttrNoScrollPane.java b/designer_base/src/com/fr/design/gui/frpane/AbstractAttrNoScrollPane.java index 755d9cfaea..361a93b958 100644 --- a/designer_base/src/com/fr/design/gui/frpane/AbstractAttrNoScrollPane.java +++ b/designer_base/src/com/fr/design/gui/frpane/AbstractAttrNoScrollPane.java @@ -5,6 +5,7 @@ import com.fr.design.event.GlobalNameListener; import com.fr.design.event.GlobalNameObserver; import com.fr.design.event.UIObserver; import com.fr.design.event.UIObserverListener; +import com.fr.stable.StringUtils; import javax.swing.*; import java.awt.*; @@ -132,13 +133,19 @@ public abstract class AbstractAttrNoScrollPane extends BasicPane { /** * 返回图标的路径 */ - public abstract String getIconPath(); + public String getIconPath() { + // 默认为空,子类有需要再重写 + return StringUtils.EMPTY; + } /** * 界面标题 * @return 标题 */ - public abstract String title4PopupWindow(); + public String title4PopupWindow() { + // 默认为空,子类有需要再重写 + return StringUtils.EMPTY; + } /** * 设置选中的ID, 用于双击展示界面. diff --git a/designer_base/src/com/fr/design/icon/IconPathConstants.java b/designer_base/src/com/fr/design/icon/IconPathConstants.java index ec5fcded3f..8939feef01 100644 --- a/designer_base/src/com/fr/design/icon/IconPathConstants.java +++ b/designer_base/src/com/fr/design/icon/IconPathConstants.java @@ -1 +1,36 @@ -package com.fr.design.icon; /** * Created by IntelliJ IDEA. * Author : Richer * Version: 6.5.6 * Date: 12-12-18 * Time: 上午9:42 * 用于保存所有图标路径的类 */ public class IconPathConstants { private IconPathConstants() { } public static final String ADD_POPMENU_ICON_PATH = "/com/fr/design/images/control/addPopup.png"; public static final String DS_ICON_PATH = "/com/fr/design/images/data/datasource.png"; public static final String CLASS_TD_ICON_PATH = "/com/fr/design/images/data/source/classTableData.png"; public static final String EMB_TD_ICON_PATH = "/com/fr/design/images/data/dataTable.png"; public static final String DS_RELATION_TD_ICON_PATH = "/com/fr/design/images/data/multi.png"; public static final String FILE_TD_ICON_PATH = "/com/fr/design/images/data/file.png"; public static final String DS_TREE_TD_ICON_PATH = "/com/fr/design/images/data/tree.png"; public static final String DS_QUERY_ICON_PATH = "/com/fr/design/images/data/database.png"; public static final String PREVIEW_ICON_PATH = "/com/fr/design/images/m_file/preview.png"; public static final String TD_EDIT_ICON_PATH = "/com/fr/design/images/control/edit.png"; public static final String TD_EL_SHARE_HELP_ICON_PATH = "/com/fr/design/images/control/help_open.png"; public static final String TD_EL_SHARE_CLOSE_ICON_PATH = "/com/fr/design/images/control/help_close.png"; public static final String TD_REMOVE_ICON_PATH = "/com/fr/design/images/control/tab/remove.png"; public static final String TD_CONNECTION_ICON_PATH = "/com/fr/design/images/m_web/connection.png"; public static final String SP_SHOW_ICON_PATH = "/com/fr/design/images/data/store_procedure.png"; public static final String STD_SHOW_ICON_PATH = "/com/fr/design/images/data/dock/serverdatabase.png"; public static final String XMLA_ICON_PATH = "/com/fr/design/images/data/cube.png"; public static final String FORBID_ICON_PATH = "/com/fr/web/images/form/forbid.png"; } \ No newline at end of file +package com.fr.design.icon; + +/** + * Created by IntelliJ IDEA. + * Author : Richer + * Version: 6.5.6 + * Date: 12-12-18 + * Time: 上午9:42 + * 用于保存所有图标路径的类 + */ +public class IconPathConstants { + private IconPathConstants() { + + } + + public static final String ADD_POPMENU_ICON_PATH = "/com/fr/design/images/control/addPopup.png"; + + public static final String DS_ICON_PATH = "/com/fr/design/images/data/datasource.png"; + public static final String CLASS_TD_ICON_PATH = "/com/fr/design/images/data/source/classTableData.png"; + public static final String EMB_TD_ICON_PATH = "/com/fr/design/images/data/dataTable.png"; + public static final String DS_RELATION_TD_ICON_PATH = "/com/fr/design/images/data/multi.png"; + public static final String FILE_TD_ICON_PATH = "/com/fr/design/images/data/file.png"; + public static final String DS_TREE_TD_ICON_PATH = "/com/fr/design/images/data/tree.png"; + public static final String DS_QUERY_ICON_PATH = "/com/fr/design/images/data/database.png"; + public static final String PREVIEW_ICON_PATH = "/com/fr/design/images/m_file/preview.png"; + public static final String TD_EDIT_ICON_PATH = "/com/fr/design/images/control/edit.png"; + public static final String TD_EL_SHARE_HELP_ICON_PATH = "/com/fr/design/images/control/help_open.png"; + public static final String TD_EL_SHARE_CLOSE_ICON_PATH = "/com/fr/design/images/control/help_close.png"; + public static final String TD_REMOVE_ICON_PATH = "/com/fr/design/images/control/tab/remove.png"; + public static final String TD_CONNECTION_ICON_PATH = "/com/fr/design/images/m_web/connection.png"; + public static final String SP_SHOW_ICON_PATH = "/com/fr/design/images/data/store_procedure.png"; + public static final String STD_SHOW_ICON_PATH = "/com/fr/design/images/data/dock/serverdatabase.png"; + public static final String XMLA_ICON_PATH = "/com/fr/design/images/data/cube.png"; + public static final String FORBID_ICON_PATH = "/com/fr/web/images/form/forbid.png"; + public static final String EDIT_ICON_PATH = "/com/fr/design/images/control/newEdit.png"; +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/images/control/newEdit.png b/designer_base/src/com/fr/design/images/control/newEdit.png new file mode 100644 index 0000000000..49843ce8ec Binary files /dev/null and b/designer_base/src/com/fr/design/images/control/newEdit.png differ diff --git a/designer_base/src/com/fr/design/mainframe/JTemplate.java b/designer_base/src/com/fr/design/mainframe/JTemplate.java index e0389eb881..15c2624532 100644 --- a/designer_base/src/com/fr/design/mainframe/JTemplate.java +++ b/designer_base/src/com/fr/design/mainframe/JTemplate.java @@ -908,7 +908,7 @@ public abstract class JTemplate> ex */ public void activeJTemplate(int index, JTemplate jt) { DesignerContext.getDesignerFrame().activateJTemplate(this); - }; + } /** * 激活已存在的模板 @@ -992,10 +992,24 @@ public abstract class JTemplate> ex return UIConstants.RUN_BIG_ICON; } + /** + * 获取所有参数 + * + * @return + */ public Parameter[] getParameters() { return new Parameter[0]; } + /** + * 获取模板参数 + * + * @return + */ + public Parameter[] getJTemplateParameters() { + return new Parameter[0]; + } + /** * 请求表单焦点 */ diff --git a/designer_base/src/com/fr/design/mainframe/widget/BasicPropertyPane.java b/designer_base/src/com/fr/design/mainframe/widget/BasicPropertyPane.java index 12b83b3e7d..101b869e34 100644 --- a/designer_base/src/com/fr/design/mainframe/widget/BasicPropertyPane.java +++ b/designer_base/src/com/fr/design/mainframe/widget/BasicPropertyPane.java @@ -13,6 +13,10 @@ import javax.swing.BorderFactory; import javax.swing.JPanel; import java.awt.BorderLayout; import java.awt.Component; +import java.awt.event.FocusEvent; +import java.awt.event.FocusListener; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; /** * Created by plough on 2017/8/7. @@ -27,7 +31,32 @@ public class BasicPropertyPane extends BasicPane { protected void initContentPane() { this.setLayout(FRGUIPaneFactory.createBorderLayout()); this.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); - widgetName = new UITextField(); + widgetName = new UITextField() { + protected void initListener() { + if (shouldResponseChangeListener()) { + addFocusListener(new FocusListener() { + @Override + public void focusGained(FocusEvent e) { + + } + + @Override + public void focusLost(FocusEvent e) { + attributeChange(); + } + }); + addKeyListener(new KeyAdapter() { + @Override + public void keyPressed(KeyEvent e) { + if (e.getKeyCode() == KeyEvent.VK_ENTER) { + attributeChange(); + } + } + }); + } + } + }; + widgetName.setGlobalName(Inter.getLocText("FR-Designer_Basic")); double f = TableLayout.FILL; double p = TableLayout.PREFERRED; diff --git a/designer_chart/src/com/fr/plugin/chart/map/designer/type/VanChartMapSourceChoosePane.java b/designer_chart/src/com/fr/plugin/chart/map/designer/type/VanChartMapSourceChoosePane.java index a98c8d7f7c..d55c9307e3 100644 --- a/designer_chart/src/com/fr/plugin/chart/map/designer/type/VanChartMapSourceChoosePane.java +++ b/designer_chart/src/com/fr/plugin/chart/map/designer/type/VanChartMapSourceChoosePane.java @@ -588,15 +588,10 @@ public class VanChartMapSourceChoosePane extends JPanel implements UIObserver { private String[] getParams() { JTemplate jTemplate = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate(); - if (jTemplate == null){ + if (jTemplate == null) { return new String[0]; } - String[] params = new String[0]; - if(jTemplate.getTarget() instanceof ParameterHolder){ - params = getParamsName(((ParameterHolder)jTemplate.getTarget()).getParameters()); - } - - return params; + return getParamsName((jTemplate.getJTemplateParameters())); } private String[] getParamsName(Parameter[] parameters) { diff --git a/designer_form/src/com/fr/design/designer/creator/XChartEditor.java b/designer_form/src/com/fr/design/designer/creator/XChartEditor.java index f6950cd76c..b4e2652100 100644 --- a/designer_form/src/com/fr/design/designer/creator/XChartEditor.java +++ b/designer_form/src/com/fr/design/designer/creator/XChartEditor.java @@ -6,10 +6,14 @@ import java.beans.IntrospectionException; import javax.swing.*; +import com.fr.base.GraphHelper; import com.fr.base.chart.BaseChartCollection; import com.fr.design.designer.beans.AdapterBus; import com.fr.design.designer.beans.ComponentAdapter; import com.fr.design.designer.beans.models.SelectionModel; +import com.fr.design.designer.properties.mobile.ChartEditorPropertyUI; +import com.fr.design.designer.properties.mobile.ElementCasePropertyUI; +import com.fr.design.fun.WidgetPropertyUIProvider; import com.fr.design.gui.chart.BaseChartPropertyPane; import com.fr.design.gui.chart.MiddleChartComponent; import com.fr.design.mainframe.*; @@ -20,6 +24,8 @@ import com.fr.form.ui.BaseChartEditor; import com.fr.form.ui.Widget; import com.fr.design.form.util.XCreatorConstants; import com.fr.general.Inter; +import com.fr.stable.Constants; +import com.fr.stable.GraphDrawHelper; import com.fr.stable.core.PropertyChangeAdapter; /** @@ -31,6 +37,7 @@ import com.fr.stable.core.PropertyChangeAdapter; */ public class XChartEditor extends XBorderStyleWidgetCreator { private static final long serialVersionUID = -7009439442104836657L; + private static final int BORDER_WIDTH = 2; //具体来说是DesignerEditor private DesignerEditor designerEditor; // private DesignerEditor designerEditor; @@ -38,7 +45,11 @@ public class XChartEditor extends XBorderStyleWidgetCreator { private boolean isRefreshing = false; private boolean isEditing = false; + + private boolean isHovering = false; private JPanel coverPanel; + private static final Color OUTER_BORDER_COLOR = new Color(65, 155, 249, 30); + private static final Color INNER_BORDER_COLOR = new Color(65, 155, 249); public XChartEditor(BaseChartEditor editor) { this(editor, new Dimension(250, 150)); @@ -117,6 +128,22 @@ public class XChartEditor extends XBorderStyleWidgetCreator { return false; } + + /** + * 编辑状态的时候需要重新绘制下边框 + * + */ + @Override + public void paintBorder(Graphics g, Rectangle bounds){ + if(isEditing){ + g.setColor(OUTER_BORDER_COLOR); + GraphHelper.draw(g, new Rectangle(bounds.x - BORDER_WIDTH, bounds.y - BORDER_WIDTH, bounds.width + BORDER_WIDTH + 1, bounds.height + BORDER_WIDTH + 1), Constants.LINE_LARGE); + }else if(!isHovering){ + super.paintBorder(g, bounds); + } + } + + /** * 返回设计器的Editor */ @@ -185,6 +212,10 @@ public class XChartEditor extends XBorderStyleWidgetCreator { public void paint(Graphics g) { designerEditor.paintEditor(g, this.getSize()); super.paint(g); + if(isEditing){ + g.setColor(INNER_BORDER_COLOR); + GraphHelper.draw(g, new Rectangle(0, 0, getWidth(), getHeight()), Constants.LINE_MEDIUM); + } } /** @@ -259,6 +290,7 @@ public class XChartEditor extends XBorderStyleWidgetCreator { * @param display 是否 */ public void displayCoverPane(boolean display){ + isHovering = display; coverPanel.setVisible(display); coverPanel.setPreferredSize(editor.getPreferredSize()); coverPanel.setBounds(editor.getBounds()); @@ -285,4 +317,8 @@ public class XChartEditor extends XBorderStyleWidgetCreator { initStyle(); } + @Override + public WidgetPropertyUIProvider[] getWidgetPropertyUIProviders() { + return new WidgetPropertyUIProvider[]{ new ChartEditorPropertyUI(this)}; + } } \ No newline at end of file diff --git a/designer_form/src/com/fr/design/designer/creator/XElementCase.java b/designer_form/src/com/fr/design/designer/creator/XElementCase.java index 514cd12d18..cece2042ba 100644 --- a/designer_form/src/com/fr/design/designer/creator/XElementCase.java +++ b/designer_form/src/com/fr/design/designer/creator/XElementCase.java @@ -1,6 +1,7 @@ package com.fr.design.designer.creator; import com.fr.base.BaseUtils; +import com.fr.base.GraphHelper; import com.fr.design.ExtraDesignClassManager; import com.fr.design.designer.properties.mobile.ElementCasePropertyUI; import com.fr.design.form.util.XCreatorConstants; @@ -20,6 +21,7 @@ import com.fr.form.ui.ElementCaseEditor; import com.fr.form.ui.ElementCaseEditorProvider; import com.fr.general.Inter; import com.fr.stable.ArrayUtils; +import com.fr.stable.Constants; import com.fr.stable.CoreGraphHelper; import com.fr.stable.core.PropertyChangeAdapter; import com.fr.stable.fun.FitProvider; @@ -38,6 +40,7 @@ public class XElementCase extends XBorderStyleWidgetCreator implements FormEleme private CoverReportPane coverPanel; private FormDesigner designer; private static BufferedImage DEFAULT_BACKGROUND; + private boolean isHovering = false; static{ try{ @@ -216,11 +219,20 @@ public class XElementCase extends XBorderStyleWidgetCreator implements FormEleme * @param display 是否 */ public void displayCoverPane(boolean display){ + isHovering = display; coverPanel.setVisible(display); coverPanel.setBounds(1, 1, (int) editor.getBounds().getWidth(), (int) editor.getBounds().getHeight()); editor.repaint(); } + @Override + public void paintBorder(Graphics g, Rectangle bounds){ + if (!isHovering) { + super.paintBorder(g, bounds); + } + } + + /** * 销毁帮助提示框 */ diff --git a/designer_form/src/com/fr/design/designer/creator/XWAbsoluteLayout.java b/designer_form/src/com/fr/design/designer/creator/XWAbsoluteLayout.java index eba8cd6888..c252060b89 100644 --- a/designer_form/src/com/fr/design/designer/creator/XWAbsoluteLayout.java +++ b/designer_form/src/com/fr/design/designer/creator/XWAbsoluteLayout.java @@ -3,6 +3,7 @@ */ package com.fr.design.designer.creator; +import com.fr.base.GraphHelper; import com.fr.design.designer.beans.AdapterBus; import com.fr.design.designer.beans.ComponentAdapter; import com.fr.design.designer.beans.LayoutAdapter; @@ -11,6 +12,7 @@ import com.fr.design.designer.beans.location.Direction; import com.fr.design.designer.beans.models.SelectionModel; import com.fr.design.designer.creator.cardlayout.XWTabFitLayout; import com.fr.design.form.layout.FRAbsoluteLayout; +import com.fr.design.form.util.XCreatorConstants; import com.fr.design.icon.IconPathConstants; import com.fr.design.mainframe.EditingMouseListener; import com.fr.design.mainframe.FormArea; @@ -23,6 +25,7 @@ import com.fr.form.ui.container.WLayout; import com.fr.general.FRScreen; import com.fr.general.IOUtils; import com.fr.general.Inter; +import com.fr.stable.Constants; import java.awt.*; import java.awt.event.ContainerEvent; @@ -42,6 +45,9 @@ public class XWAbsoluteLayout extends XLayoutContainer { private static final int EDIT_BTN_HEIGHT = 24; private int minWidth = WLayout.MIN_WIDTH; private int minHeight = WLayout.MIN_HEIGHT; + private static final Color OUTER_BORDER_COLOR = new Color(65, 155, 249, 30); + private static final Color INNER_BORDER_COLOR = new Color(65, 155, 249); + private static final int BORDER_WIDTH = 1; //由于屏幕分辨率不同,界面上的容器大小可能不是默认的100%,此时拖入组件时,保存的大小按照100%时的计算 protected double containerPercent = 1.0; @@ -432,15 +438,15 @@ public class XWAbsoluteLayout extends XLayoutContainer { Graphics2D g2d = (Graphics2D) g; Composite oldComposite = g2d.getComposite(); //画白色的编辑层 - g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 60 / 100.0F)); - g2d.setColor(Color.WHITE); + g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 50 / 100.0F)); + g2d.setColor(XCreatorConstants.COVER_COLOR); g2d.fillRect(x, y, w, h); //画编辑按钮所在框 g2d.setComposite(oldComposite); g2d.setColor(new Color(176, 196, 222)); g2d.fillRect((x + w / 2 - EDIT_BTN_WIDTH / 2), (y + h / 2 - EDIT_BTN_HEIGHT / 2), EDIT_BTN_WIDTH, EDIT_BTN_HEIGHT); //画编辑按钮图标 - BufferedImage image = IOUtils.readImage(IconPathConstants.TD_EDIT_ICON_PATH); + BufferedImage image = IOUtils.readImage(IconPathConstants.EDIT_ICON_PATH); g2d.drawImage( image, (x + w / 2 - 23), @@ -453,9 +459,23 @@ public class XWAbsoluteLayout extends XLayoutContainer { g2d.setColor(Color.BLACK); //画编辑文字 g2d.drawString(Inter.getLocText("FR-Designer_Edit"), x + w / 2 - 2, y + h / 2 + 5); + g.setColor(XCreatorConstants.FORM_BORDER_COLOR); + GraphHelper.draw(g, new Rectangle(BORDER_WIDTH, BORDER_WIDTH, getWidth() - BORDER_WIDTH * 2, getHeight() - BORDER_WIDTH * 2), Constants.LINE_MEDIUM); } + } + @Override + public void paintBorder(Graphics g, Rectangle bounds){ + if(editable){ + g.setColor(OUTER_BORDER_COLOR); + GraphHelper.draw(g, new Rectangle(bounds.x - 3, bounds.y - 3, bounds.width + 5, bounds.height + 5), Constants.LINE_LARGE); + g.setColor(INNER_BORDER_COLOR); + GraphHelper.draw(g, new Rectangle(bounds.x, bounds.y, bounds.width, bounds.height), Constants.LINE_MEDIUM); + }else if(!isMouseEnter){ + super.paintBorder(g, bounds); + } + } /** * 响应点击事件 * diff --git a/designer_form/src/com/fr/design/designer/creator/XWParameterLayout.java b/designer_form/src/com/fr/design/designer/creator/XWParameterLayout.java index a397996a30..7eaf444b15 100644 --- a/designer_form/src/com/fr/design/designer/creator/XWParameterLayout.java +++ b/designer_form/src/com/fr/design/designer/creator/XWParameterLayout.java @@ -6,7 +6,9 @@ package com.fr.design.designer.creator; import com.fr.design.ExtraDesignClassManager; import com.fr.design.designer.beans.LayoutAdapter; import com.fr.design.designer.beans.adapters.layout.FRParameterLayoutAdapter; +import com.fr.design.designer.properties.mobile.ParaMobilePropertyUI; import com.fr.design.form.util.XCreatorConstants; +import com.fr.design.fun.WidgetPropertyUIProvider; import com.fr.design.mainframe.widget.editors.BackgroundEditor; import com.fr.design.mainframe.widget.editors.BooleanEditor; import com.fr.design.mainframe.widget.editors.WidgetDisplayPosition; @@ -214,6 +216,11 @@ public class XWParameterLayout extends XWAbsoluteLayout { public void updateBoundsWidget() { } + @Override + public WidgetPropertyUIProvider[] getWidgetPropertyUIProviders() { + return new WidgetPropertyUIProvider[]{ new ParaMobilePropertyUI(this)}; + } + @Override protected String getIconName() { return "layout_absolute.png"; diff --git a/designer_form/src/com/fr/design/designer/creator/XWTitleLayout.java b/designer_form/src/com/fr/design/designer/creator/XWTitleLayout.java index 6860fc3453..7e1e145735 100644 --- a/designer_form/src/com/fr/design/designer/creator/XWTitleLayout.java +++ b/designer_form/src/com/fr/design/designer/creator/XWTitleLayout.java @@ -111,6 +111,19 @@ public class XWTitleLayout extends DedicateLayoutContainer { return null; } + /** + * 编辑状态的时候需要重新绘制下边框 + * + */ + @Override + public void paintBorder(Graphics g, Rectangle bounds) { + XCreator childCreator = getEditingChildCreator(); + if (childCreator != null) { + childCreator.paintBorder(g, bounds); + } + + } + /** * 将WLayout转换为XLayoutContainer */ diff --git a/designer_form/src/com/fr/design/designer/creator/cardlayout/XWCardMainBorderLayout.java b/designer_form/src/com/fr/design/designer/creator/cardlayout/XWCardMainBorderLayout.java index dd9a85c78f..ee82d5cf06 100644 --- a/designer_form/src/com/fr/design/designer/creator/cardlayout/XWCardMainBorderLayout.java +++ b/designer_form/src/com/fr/design/designer/creator/cardlayout/XWCardMainBorderLayout.java @@ -3,6 +3,7 @@ */ package com.fr.design.designer.creator.cardlayout; +import com.fr.base.GraphHelper; import com.fr.design.designer.beans.AdapterBus; import com.fr.design.designer.beans.ComponentAdapter; import com.fr.design.designer.beans.LayoutAdapter; @@ -13,6 +14,7 @@ import com.fr.design.designer.creator.XCreatorUtils; import com.fr.design.designer.creator.XLayoutContainer; import com.fr.design.designer.creator.XWBorderLayout; import com.fr.design.designer.creator.XWidgetCreator; +import com.fr.design.form.util.XCreatorConstants; import com.fr.design.icon.IconPathConstants; import com.fr.design.mainframe.EditingMouseListener; import com.fr.design.mainframe.FormDesigner; @@ -30,6 +32,8 @@ import com.fr.form.ui.container.cardlayout.WCardTitleLayout; import com.fr.general.ComparatorUtils; import com.fr.general.IOUtils; import com.fr.general.Inter; +import com.fr.stable.Constants; + import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Component; @@ -59,6 +63,7 @@ public class XWCardMainBorderLayout extends XWBorderLayout{ private static final int EDIT_BTN_WIDTH = 60; private static final int EDIT_BTN_HEIGHT = 24; + private static final int BORDER_WIDTH = 1; private final int CARDMAINLAYOUT_CHILD_COUNT = 1; @@ -328,15 +333,15 @@ public class XWCardMainBorderLayout extends XWBorderLayout{ Graphics2D g2d = (Graphics2D) g; Composite oldComposite = g2d.getComposite(); //画白色的编辑层 - g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 60 / 100.0F)); - g2d.setColor(Color.WHITE); + g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 50 / 100.0F)); + g2d.setColor(XCreatorConstants.COVER_COLOR); g2d.fillRect(x, y, w, h); //画编辑按钮所在框 g2d.setComposite(oldComposite); g2d.setColor(new Color(176, 196, 222)); g2d.fillRect((x + w / 2 - EDIT_BTN_WIDTH / 2), (y + h / 2 - EDIT_BTN_HEIGHT / 2), EDIT_BTN_WIDTH, EDIT_BTN_HEIGHT); //画编辑按钮图标 - BufferedImage image = IOUtils.readImage(IconPathConstants.TD_EDIT_ICON_PATH); + BufferedImage image = IOUtils.readImage(IconPathConstants.EDIT_ICON_PATH); g2d.drawImage( image, (x + w / 2 - 23), @@ -349,6 +354,15 @@ public class XWCardMainBorderLayout extends XWBorderLayout{ g2d.setColor(Color.BLACK); //画编辑文字 g2d.drawString(Inter.getLocText("FR-Designer_Edit"), x + w / 2 - 2, y + h / 2 + 5); + g.setColor(XCreatorConstants.FORM_BORDER_COLOR); + GraphHelper.draw(g, new Rectangle(BORDER_WIDTH, BORDER_WIDTH, getWidth() - BORDER_WIDTH * 2, getHeight() - BORDER_WIDTH * 2), Constants.LINE_MEDIUM); + } + } + + @Override + public void paintBorder(Graphics g, Rectangle bounds){ + if (!isMouseEnter) { + super.paintBorder(g, bounds); } } diff --git a/designer_form/src/com/fr/design/designer/creator/cardlayout/XWTabFitLayout.java b/designer_form/src/com/fr/design/designer/creator/cardlayout/XWTabFitLayout.java index 9e1938817c..35cc5a8b22 100644 --- a/designer_form/src/com/fr/design/designer/creator/cardlayout/XWTabFitLayout.java +++ b/designer_form/src/com/fr/design/designer/creator/cardlayout/XWTabFitLayout.java @@ -613,4 +613,26 @@ public class XWTabFitLayout extends XWFitLayout { xCardSwitchButton.setPreferredSize(new Dimension(width, xCardSwitchButton.getHeight())); } + private void checkVisible(){ + WTabFitLayout wTabFitLayout = (WTabFitLayout)this.data; + CardSwitchButton cardSwitchButton = wTabFitLayout.getCurrentCard(); + cardSwitchButton.setVisible(wTabFitLayout.isVisible()); + } + + + /** + * 是否支持设置可见 + * return boolean + */ + @Override + public boolean supportSetVisible(){ + return true; + } + + + @Override + public void resetVisible(boolean visible){ + checkVisible(); + } + } \ No newline at end of file diff --git a/designer_form/src/com/fr/design/designer/properties/mobile/BodyMobilePropertyUI.java b/designer_form/src/com/fr/design/designer/properties/mobile/BodyMobilePropertyUI.java index 81c402e42a..133175878c 100644 --- a/designer_form/src/com/fr/design/designer/properties/mobile/BodyMobilePropertyUI.java +++ b/designer_form/src/com/fr/design/designer/properties/mobile/BodyMobilePropertyUI.java @@ -6,6 +6,7 @@ import com.fr.design.designer.creator.XWFitLayout; import com.fr.design.dialog.BasicPane; import com.fr.design.fun.impl.AbstractWidgetPropertyUIProvider; import com.fr.design.gui.itable.AbstractPropertyTable; +import com.fr.design.widget.ui.designer.mobile.BodyMobileDefinePane; import com.fr.general.Inter; /** @@ -25,12 +26,12 @@ public class BodyMobilePropertyUI extends AbstractWidgetPropertyUIProvider { @Override public AbstractPropertyTable createWidgetAttrTable() { - return new BodyAppRelayoutTable(xCreator); + return null; } @Override public BasicPane createWidgetAttrPane() { - return null; + return new BodyMobileDefinePane(xCreator); } @Override diff --git a/designer_form/src/com/fr/design/designer/properties/mobile/ChartEditorPropertyUI.java b/designer_form/src/com/fr/design/designer/properties/mobile/ChartEditorPropertyUI.java new file mode 100644 index 0000000000..320f51b319 --- /dev/null +++ b/designer_form/src/com/fr/design/designer/properties/mobile/ChartEditorPropertyUI.java @@ -0,0 +1,38 @@ +package com.fr.design.designer.properties.mobile; + +import com.fr.design.designer.creator.XChartEditor; +import com.fr.design.designer.creator.XCreator; +import com.fr.design.designer.creator.XElementCase; +import com.fr.design.dialog.BasicPane; +import com.fr.design.fun.impl.AbstractWidgetPropertyUIProvider; +import com.fr.design.gui.itable.AbstractPropertyTable; +import com.fr.design.widget.ui.designer.mobile.ChartEditorDefinePane; +import com.fr.design.widget.ui.designer.mobile.ElementCaseDefinePane; +import com.fr.general.Inter; + +/** + * Created by plough on 2018/1/18. + */ +public class ChartEditorPropertyUI extends AbstractWidgetPropertyUIProvider { + + private XCreator xCreator; + + public ChartEditorPropertyUI(XChartEditor xChartEditor) { + this.xCreator = xChartEditor; + } + + @Override + public AbstractPropertyTable createWidgetAttrTable() { + return null; + } + + @Override + public BasicPane createWidgetAttrPane() { + return new ChartEditorDefinePane(xCreator); + } + + @Override + public String tableTitle() { + return Inter.getLocText("FR-Designer_Mobile-Attr"); + } +} diff --git a/designer_form/src/com/fr/design/designer/properties/mobile/ParaMobilePropertyUI.java b/designer_form/src/com/fr/design/designer/properties/mobile/ParaMobilePropertyUI.java new file mode 100644 index 0000000000..0ed8bc61c5 --- /dev/null +++ b/designer_form/src/com/fr/design/designer/properties/mobile/ParaMobilePropertyUI.java @@ -0,0 +1,39 @@ +package com.fr.design.designer.properties.mobile; + +import com.fr.design.designer.creator.XCreator; +import com.fr.design.designer.creator.XWAbsoluteBodyLayout; +import com.fr.design.designer.creator.XWFitLayout; +import com.fr.design.designer.creator.XWParameterLayout; +import com.fr.design.dialog.BasicPane; +import com.fr.design.fun.impl.AbstractWidgetPropertyUIProvider; +import com.fr.design.gui.itable.AbstractPropertyTable; +import com.fr.design.widget.ui.designer.mobile.BodyMobileDefinePane; +import com.fr.design.widget.ui.designer.mobile.ParaMobileDefinePane; +import com.fr.general.Inter; + +/** + * Created by Administrator on 2016/5/16/0016. + */ +public class ParaMobilePropertyUI extends AbstractWidgetPropertyUIProvider { + + private XCreator xCreator; + + public ParaMobilePropertyUI(XWParameterLayout xwParameterLayout) { + this.xCreator = xwParameterLayout; + } + + @Override + public AbstractPropertyTable createWidgetAttrTable() { + return null; + } + + @Override + public BasicPane createWidgetAttrPane() { + return new ParaMobileDefinePane(xCreator); + } + + @Override + public String tableTitle() { + return Inter.getLocText("FR-Designer_Mobile-Attr"); + } +} diff --git a/designer_form/src/com/fr/design/form/images/joption_failure.png b/designer_form/src/com/fr/design/form/images/joption_failure.png new file mode 100755 index 0000000000..bea459040d Binary files /dev/null and b/designer_form/src/com/fr/design/form/images/joption_failure.png differ diff --git a/designer_form/src/com/fr/design/form/images/joption_success.png b/designer_form/src/com/fr/design/form/images/joption_success.png new file mode 100755 index 0000000000..4bafb56d9c Binary files /dev/null and b/designer_form/src/com/fr/design/form/images/joption_success.png differ diff --git a/designer_form/src/com/fr/design/form/mobile/FormMobileAttrPane.java b/designer_form/src/com/fr/design/form/mobile/FormMobileAttrPane.java index a4d657e117..a2650d8069 100644 --- a/designer_form/src/com/fr/design/form/mobile/FormMobileAttrPane.java +++ b/designer_form/src/com/fr/design/form/mobile/FormMobileAttrPane.java @@ -15,25 +15,29 @@ import java.awt.*; public class FormMobileAttrPane extends BasicBeanPane{ //工具栏容器 private MobileToolBarPane mobileToolBarPane; + // 模版设置面板 + private FormMobileTemplateSettingsPane formMobileTemplateSettingsPane; - static final int PADDINGHEIGHT = 10; + private static final int PADDING = 10; public FormMobileAttrPane() { this.initComponents(); } - //现在只有两个panel,填不满自适应对话框,只能为工具栏Panel和h5解析方式panel分别包裹上一层Panel再计算高度,不然会自动 - //拉长两个Panel的高度去填满整个对话框。 private void initComponents() { - JPanel jPanel1 = new JPanel(); this.setLayout(FRGUIPaneFactory.createBorderLayout()); - jPanel1.setLayout(FRGUIPaneFactory.createBorderLayout()); - jPanel1.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); + JPanel mobileToolBarPaneWrapper = new JPanel(new BorderLayout()); + mobileToolBarPaneWrapper.setBorder(BorderFactory.createEmptyBorder(PADDING, PADDING, 0, PADDING)); this.mobileToolBarPane = new MobileToolBarPane(); - //设置一个JPanel包裹mobileToolBarPane这个Panel,让jPanel的高度等于mobileToolBarPane高度加10,再放入this中 - jPanel1.setPreferredSize(new Dimension(0, (int)this.mobileToolBarPane.getPreferredSize().getHeight() + PADDINGHEIGHT)); - jPanel1.add("North", this.mobileToolBarPane); - this.add("North", jPanel1); + mobileToolBarPaneWrapper.add(this.mobileToolBarPane, BorderLayout.NORTH); + + JPanel formMobileTemplateSettingsPaneWrapper = new JPanel(new BorderLayout()); + formMobileTemplateSettingsPaneWrapper.setBorder(BorderFactory.createEmptyBorder(PADDING, PADDING, PADDING, PADDING)); + this.formMobileTemplateSettingsPane = new FormMobileTemplateSettingsPane(); + formMobileTemplateSettingsPaneWrapper.add(this.formMobileTemplateSettingsPane, BorderLayout.NORTH); + + this.add(formMobileTemplateSettingsPaneWrapper, BorderLayout.NORTH); + this.add(mobileToolBarPaneWrapper, BorderLayout.CENTER); } @Override @@ -42,12 +46,14 @@ public class FormMobileAttrPane extends BasicBeanPane{ ob = new FormMobileAttr(); } this.mobileToolBarPane.populateBean(ob); + this.formMobileTemplateSettingsPane.populateBean(ob); } @Override public FormMobileAttr updateBean() { FormMobileAttr formMobileAttr = new FormMobileAttr(); this.mobileToolBarPane.updateBean(formMobileAttr); + this.formMobileTemplateSettingsPane.updateBean(formMobileAttr); return formMobileAttr; } diff --git a/designer_form/src/com/fr/design/form/mobile/FormMobileTemplateSettingsPane.java b/designer_form/src/com/fr/design/form/mobile/FormMobileTemplateSettingsPane.java new file mode 100644 index 0000000000..a32faac5b9 --- /dev/null +++ b/designer_form/src/com/fr/design/form/mobile/FormMobileTemplateSettingsPane.java @@ -0,0 +1,161 @@ +package com.fr.design.form.mobile; + +import com.fr.design.beans.BasicBeanPane; +import com.fr.design.designer.IntervalConstants; +import com.fr.design.dialog.mobile.MobileRadioCheckPane; +import com.fr.design.event.UIObserverListener; +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.form.main.mobile.FormMobileAttr; +import com.fr.general.Inter; + +import javax.swing.*; +import javax.swing.border.Border; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +/** + * Created by plough on 2018/1/4. + */ +public class FormMobileTemplateSettingsPane extends BasicBeanPane { + + private UICheckBox mobileOnlyCheck; // 设置为手机端专属模版 + private UICheckBox mobileCanvasSizeCheck; // 设置为手机模版画布大小 + private UICheckBox adaptivePropertyAutoMatchCheck; // 自适应属性自动匹配 + private JPanel mobileSettingsPane; + + public FormMobileTemplateSettingsPane() { + this.initComponents(); + } + + private void initComponents() { + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + JPanel borderPane = FRGUIPaneFactory.createTitledBorderPane(this.title4PopupWindow()); + + JPanel contentPane = new JPanel(FRGUIPaneFactory.createBorderLayout()); + contentPane.setBorder(BorderFactory.createEmptyBorder(IntervalConstants.INTERVAL_L1, IntervalConstants.INTERVAL_L5, IntervalConstants.INTERVAL_L2, 0)); + + mobileSettingsPane = new JPanel(FRGUIPaneFactory.createBorderLayout()); + mobileSettingsPane.setVisible(false); + mobileSettingsPane.add(getMobileCanvasSizeCheckPane(), BorderLayout.NORTH); + mobileSettingsPane.add(getAdaptivePropertyAutoMatchCheckPane(), BorderLayout.CENTER); + + + mobileOnlyCheck = new UICheckBox(Inter.getLocText("FR-Designer_Set_Mobile_Only_Template")); + mobileOnlyCheck.registerChangeListener(new UIObserverListener() { + @Override + public void doChange() { + boolean mobileOnlyCheckSelected = mobileOnlyCheck.isSelected(); + mobileSettingsPane.setVisible(mobileOnlyCheckSelected); + if (mobileOnlyCheckSelected) { + adaptivePropertyAutoMatchCheck.setSelected(true); + } + } + }); + + contentPane.add(mobileOnlyCheck, BorderLayout.NORTH); + contentPane.add(mobileSettingsPane, BorderLayout.CENTER); + + borderPane.add(contentPane); + this.add(borderPane); + } + + private JPanel getMobileCanvasSizeCheckPane() { + JPanel panel = new JPanel(FRGUIPaneFactory.createBorderLayout()); + mobileCanvasSizeCheck = new UICheckBox(Inter.getLocText("FR-Designer_Set_Mobile_Canvas_Size")); + // 默认勾选,不可取消 + mobileCanvasSizeCheck.setSelected(true); + mobileCanvasSizeCheck.setEnabled(false); + panel.add(mobileCanvasSizeCheck, BorderLayout.NORTH); + panel.add(getCanvasDescPane(), BorderLayout.CENTER); + panel.setBorder(BorderFactory.createEmptyBorder(IntervalConstants.INTERVAL_L1, 0, IntervalConstants.INTERVAL_L6, 0)); + return panel; + } + + private JPanel getAdaptivePropertyAutoMatchCheckPane() { + JPanel panel = new JPanel(FRGUIPaneFactory.createBorderLayout()); + adaptivePropertyAutoMatchCheck = new UICheckBox(); + adaptivePropertyAutoMatchCheck.registerChangeListener(new UIObserverListener() { + @Override + public void doChange() { + adaptivePropertyAutoMatchCheck.setText(Inter.getLocText("FR-Designer_Adaptive_Property_Auto_Match")); + } + }); + adaptivePropertyAutoMatchCheck.setSelected(true); + panel.add(adaptivePropertyAutoMatchCheck, BorderLayout.NORTH); + panel.add(getAdaptivePropertyAutoMatchDescPane(), BorderLayout.CENTER); + return panel; + } + + private JPanel getCanvasDescPane() { + + UILabel desc1 = createDescLabel(Inter.getLocText("FR-Designer_Canvas_Size_Lock_Desc")); + UILabel desc2 = createDescLabel(Inter.getLocText("FR-Designer_Mobile_Screen_Match_Desc")); + UILabel desc3 = createDescLabel(Inter.getLocText("FR-Designer_Mobile_Screen_Zoom_In_Desc")); + UILabel desc4 = createDescLabel(Inter.getLocText("FR-Designer_Mobile_Screen_Zoom_Out_Desc")); + + double f = TableLayout.FILL; + double p = TableLayout.PREFERRED; + double[] rowSize = {p, p, p, p}; + double[] columnSize = {p, f}; + int[][] rowCount = {{1, 1}, {1, 1}, {1, 1}, {1, 1}}; + Component[][] components = new Component[][]{ + new Component[]{desc1, null}, + new Component[]{desc2, null}, + new Component[]{desc3, null}, + new Component[]{desc4, null} + }; + JPanel panel = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, IntervalConstants.INTERVAL_W0, IntervalConstants.INTERVAL_L1); + panel.setBorder(BorderFactory.createEmptyBorder(IntervalConstants.INTERVAL_L6, IntervalConstants.INTERVAL_W4, IntervalConstants.INTERVAL_L1, 0)); + return panel; + } + + private JPanel getAdaptivePropertyAutoMatchDescPane() { + + UILabel desc1 = createDescLabel(Inter.getLocText("FR-Designer_Adaptive_Property_Auto_Match_Desc")); + + JPanel panel = new JPanel(FRGUIPaneFactory.createBorderLayout()); + panel.add(desc1, BorderLayout.CENTER); + panel.setBorder(BorderFactory.createEmptyBorder(IntervalConstants.INTERVAL_L6, IntervalConstants.INTERVAL_W4, IntervalConstants.INTERVAL_L1, 0)); + return panel; + } + + private UILabel createDescLabel(String desc) { + UILabel label = new UILabel(desc); + label.setForeground(Color.gray); + return label; + } + + @Override + public void populateBean(FormMobileAttr ob) { + if (ob == null) { + ob = new FormMobileAttr(); + } +// this.mobileOnlyCheckPane.populateBean(ob.isRefresh()); + mobileOnlyCheck.setSelected(ob.isMobileOnly()); + adaptivePropertyAutoMatchCheck.setSelected(ob.isAdaptivePropertyAutoMatch()); + } + + @Override + public FormMobileAttr updateBean() { + return null; + } + + @Override + public void updateBean(FormMobileAttr mobileAttr) { + if(mobileAttr != null) { + mobileAttr.setMobileOnly(mobileOnlyCheck.isSelected()); + mobileAttr.setAdaptivePropertyAutoMatch(adaptivePropertyAutoMatchCheck.isSelected()); + } + } + + @Override + protected String title4PopupWindow() { + return Inter.getLocText("FR-Designer_Template_Settings"); + } + +} \ No newline at end of file diff --git a/designer_form/src/com/fr/design/form/util/XCreatorConstants.java b/designer_form/src/com/fr/design/form/util/XCreatorConstants.java index 91cd2007ed..4cced61430 100644 --- a/designer_form/src/com/fr/design/form/util/XCreatorConstants.java +++ b/designer_form/src/com/fr/design/form/util/XCreatorConstants.java @@ -31,7 +31,7 @@ public class XCreatorConstants { public static final Color RESIZE_BOX_BORDER_COLOR = new Color(143, 171, 196); // 当前选取的组件的边框线着色 public static final Color SELECTION_COLOR = new Color(179, 209, 236); - public static final Color FORM_BORDER_COLOR = new Color(200, 201, 205); + public static final Color FORM_BORDER_COLOR = new Color(141, 194, 249); // 设计器区域外边框的颜色和粗细 public static final Border AREA_BORDER = BorderFactory.createLineBorder(new Color(224, 224, 255), 0); // 布局拖拽时的颜色 @@ -43,6 +43,8 @@ public class XCreatorConstants { public static final Color FIT_LAYOUT_POINT_COLOR = new Color(106, 168, 222); // 格子布局的分割线 public static final Color LAYOUT_SEP_COLOR = new Color(210, 210, 210); + // 组件覆盖层颜色 + public static final Color COVER_COLOR = new Color(216, 242, 253); // 伸缩表单操作条的颜色 public static final Color OP_COLOR = new Color(157,228,245); diff --git a/designer_form/src/com/fr/design/mainframe/CoverPane.java b/designer_form/src/com/fr/design/mainframe/CoverPane.java index 9fed1ab7c3..00e9f8b3b0 100644 --- a/designer_form/src/com/fr/design/mainframe/CoverPane.java +++ b/designer_form/src/com/fr/design/mainframe/CoverPane.java @@ -1,9 +1,13 @@ package com.fr.design.mainframe; +import com.fr.base.GraphHelper; +import com.fr.design.form.util.XCreatorConstants; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.icon.IconPathConstants; +import com.fr.design.utils.ComponentUtils; import com.fr.general.IOUtils; import com.fr.general.Inter; +import com.fr.stable.Constants; import javax.swing.*; import java.awt.*; @@ -17,14 +21,16 @@ import java.awt.*; public class CoverPane extends JPanel { private UIButton editButton; - private AlphaComposite composite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 60 / 100.0F); + private AlphaComposite composite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 50 / 100.0F); + private static final int BORDER_WIDTH = 2; + private static final Color COVER_COLOR = new Color(216, 242, 253); public CoverPane() { setLayout(getCoverLayout()); setBackground(null); setOpaque(false); - editButton = new UIButton(Inter.getLocText("Edit"), IOUtils.readIcon(IconPathConstants.TD_EDIT_ICON_PATH)) { + editButton = new UIButton(Inter.getLocText("Edit"), IOUtils.readIcon(IconPathConstants.EDIT_ICON_PATH)) { @Override public Dimension getPreferredSize() { return new Dimension(60, 24); @@ -89,9 +95,15 @@ public class CoverPane extends JPanel { Graphics2D g2d = (Graphics2D) g; Composite oldComposite = g2d.getComposite(); g2d.setComposite(composite); - g2d.setColor(Color.WHITE); + g2d.setColor(COVER_COLOR); g2d.fillRect(0, 0, getWidth(), getHeight()); g2d.setComposite(oldComposite); + g.setColor(XCreatorConstants.FORM_BORDER_COLOR); + GraphHelper.draw(g, getPaintBorderBounds(), Constants.LINE_MEDIUM); super.paint(g); } + + protected Rectangle getPaintBorderBounds(){ + return new Rectangle(BORDER_WIDTH, BORDER_WIDTH, getWidth() - BORDER_WIDTH * 2 , getHeight() - BORDER_WIDTH * 2); + } } \ No newline at end of file diff --git a/designer_form/src/com/fr/design/mainframe/CoverReportPane.java b/designer_form/src/com/fr/design/mainframe/CoverReportPane.java index 196d8752a1..3578856d95 100644 --- a/designer_form/src/com/fr/design/mainframe/CoverReportPane.java +++ b/designer_form/src/com/fr/design/mainframe/CoverReportPane.java @@ -21,6 +21,7 @@ import java.awt.event.WindowEvent; * Time: 11:32 */ public class CoverReportPane extends CoverPane implements HelpDialogHandler{ + private static final int BORDER_WIDTH = 1; private Icon controlMode = IOUtils.readIcon(IconPathConstants.TD_EL_SHARE_HELP_ICON_PATH); private JComponent controlButton = new JComponent() { protected void paintComponent(Graphics g) { @@ -126,6 +127,11 @@ public class CoverReportPane extends CoverPane implements HelpDialogHandler{ } } + @Override + protected Rectangle getPaintBorderBounds(){ + return new Rectangle(BORDER_WIDTH, BORDER_WIDTH, getWidth() - 3 * BORDER_WIDTH , getHeight() - 3 * BORDER_WIDTH); + } + @Override public void setVisible(boolean aFlag) { super.setVisible(aFlag); diff --git a/designer_form/src/com/fr/design/mainframe/FormArea.java b/designer_form/src/com/fr/design/mainframe/FormArea.java index 5174f3bb97..bcb6dd4755 100644 --- a/designer_form/src/com/fr/design/mainframe/FormArea.java +++ b/designer_form/src/com/fr/design/mainframe/FormArea.java @@ -7,6 +7,8 @@ import com.fr.design.designer.creator.XCreator; import com.fr.design.designer.creator.XLayoutContainer; import com.fr.design.designer.creator.XWBorderLayout; import com.fr.design.designer.creator.XWFitLayout; +import com.fr.design.event.TargetModifiedEvent; +import com.fr.design.event.TargetModifiedListener; import com.fr.design.file.HistoryTemplateListPane; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.ispinner.UIBasicSpinner; @@ -16,6 +18,7 @@ import com.fr.design.layout.TableLayoutHelper; import com.fr.design.scrollruler.*; import com.fr.design.utils.ComponentUtils; import com.fr.design.utils.gui.LayoutUtils; +import com.fr.form.main.mobile.FormMobileAttr; import com.fr.form.ui.container.WBorderLayout; import com.fr.general.FRScreen; import com.fr.general.Inter; @@ -36,6 +39,8 @@ public class FormArea extends JComponent implements ScrollRulerComponent { private static final int SHOWVALMAX = 400; private static final int SHOWVALMIN = 10; private static final int RESIZE_PANE_GAP = 8; + private static final int MOBILE_ONLY_WIDTH = 375; + private static final int MOBILE_ONLY_HEIGHT = 560; private FormDesigner designer; private int horizontalValue = 0; private int verticalValue = 0; @@ -79,6 +84,7 @@ public class FormArea extends JComponent implements ScrollRulerComponent { this.add(FormRulerLayout.VERTICAL, verScrollBar); this.add(FormRulerLayout.HIRIZONTAL, horScrollBar); enableEvents(AWTEvent.MOUSE_WHEEL_EVENT_MASK); + widthPane.setEnabled(!designer.getTarget().getFormMobileAttr().isMobileOnly()); } else { // 报表参数界面只要标尺和中心pane this.setLayout(new RulerLayout()); @@ -89,6 +95,17 @@ public class FormArea extends JComponent implements ScrollRulerComponent { this.designer.addMouseWheelListener(showValSpinnerMouseWheelListener); } + public void onMobileAttrModified() { + FormMobileAttr formMobileAttr = designer.getTarget().getFormMobileAttr(); + if (formMobileAttr.isMobileOnly()) { + widthPane.setValue(MOBILE_ONLY_WIDTH); + changeWidthPaneValue(MOBILE_ONLY_WIDTH); + heightPane.setValue(MOBILE_ONLY_HEIGHT); + changeHeightPaneValue(MOBILE_ONLY_HEIGHT); + } + widthPane.setEnabled(!formMobileAttr.isMobileOnly()); + } + MouseWheelListener showValSpinnerMouseWheelListener = new MouseWheelListener() { @Override public void mouseWheelMoved(MouseWheelEvent e) { @@ -471,7 +488,7 @@ public class FormArea extends JComponent implements ScrollRulerComponent { public void scrollPathToVisible(XCreator creator) { creator.seleteRelatedComponent(creator); - if (!ComponentUtils.isComponentVisible(creator) && !designer.isRoot(creator) && (creator.toData()).isVisible()) { + if (!ComponentUtils.isComponentVisible(creator) && !designer.isRoot(creator)) { designer.makeVisible(creator); } diff --git a/designer_form/src/com/fr/design/mainframe/FormDesignerUI.java b/designer_form/src/com/fr/design/mainframe/FormDesignerUI.java index 0df15215a6..e9e55800e8 100644 --- a/designer_form/src/com/fr/design/mainframe/FormDesignerUI.java +++ b/designer_form/src/com/fr/design/mainframe/FormDesignerUI.java @@ -1,6 +1,7 @@ package com.fr.design.mainframe; import java.awt.AlphaComposite; +import java.awt.Color; import java.awt.Component; import java.awt.Graphics; import java.awt.Graphics2D; @@ -264,6 +265,7 @@ public class FormDesignerUI extends ComponentUI { bounds.y -= designer.getArea().getVerticalValue(); drawResizingThumbs(g, selectionModel.getSelection().getDirections(), bounds.x, bounds.y, bounds.width, bounds.height); + //选中时边框颜色 g.setColor(XCreatorConstants.FORM_BORDER_COLOR); for (XCreator creator : selectionModel.getSelection().getSelectedCreators()) { @@ -275,7 +277,7 @@ public class FormDesignerUI extends ComponentUI { } else if (designer.getRootComponent().acceptType(XWFitLayout.class)) { resetCreatorBounds(creatorBounds); } - GraphHelper.draw(g, creatorBounds, Constants.LINE_MEDIUM); + creator.paintBorder(g, creatorBounds); } } diff --git a/designer_form/src/com/fr/design/mainframe/MobileWidgetListPane.java b/designer_form/src/com/fr/design/mainframe/MobileWidgetListPane.java new file mode 100644 index 0000000000..3d2c67cdaa --- /dev/null +++ b/designer_form/src/com/fr/design/mainframe/MobileWidgetListPane.java @@ -0,0 +1,71 @@ +package com.fr.design.mainframe; + +import com.fr.design.designer.creator.XCreator; +import com.fr.design.gui.controlpane.UISimpleListControlPane; +import com.fr.form.ui.Widget; +import com.fr.form.ui.container.WSortLayout; +import com.fr.general.NameObject; +import com.fr.stable.ArrayUtils; +import com.fr.stable.Nameable; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by plough on 2018/1/31. + */ +public class MobileWidgetListPane extends UISimpleListControlPane { + public static final String LIST_NAME = "Widget_List"; + + private FormDesigner designer; + private WSortLayout wSortLayout; + private String[] widgetNameList; + + public MobileWidgetListPane(FormDesigner designer, WSortLayout wSortLayout) { + super(); + this.designer = designer; + this.wSortLayout = wSortLayout; + widgetNameList = getData(); + + List nameObjectList = new ArrayList(); + for (String name : widgetNameList) { + nameObjectList.add(new NameObject(name, null)); + } + populate(nameObjectList.toArray(new NameObject[nameObjectList.size()])); + } + + /** + * 保存移动端控件列表顺序 + */ + public void updateToDesigner() { + Nameable[] nameableList = update(); + List newMobileWidgetList = new ArrayList<>(); + for (Nameable nameable : nameableList) { + newMobileWidgetList.add(nameable.getName()); + } + wSortLayout.updateSortedMobileWidgetList(newMobileWidgetList); + } + + /** + * 获取选中控件的控件列表 + * + * @return List widgetNameList + */ + private String[] getData() { + //选择的控件 + XCreator selectedCreator = designer.getSelectionModel().getSelection().getSelectedCreator(); + Widget selectedModel = selectedCreator != null ? selectedCreator.toData() : null; + + if (selectedModel == null || !selectedModel.acceptType(WSortLayout.class)) { + return ArrayUtils.EMPTY_STRING_ARRAY; + } + + // 选择的控件有两种类型,一种是WLayout,代表容器,一种是Widget,代表控件 + java.util.List mobileWidgetList = ((WSortLayout) selectedModel).getOrderedMobileWidgetList(); + String[] widgetNames = new String[mobileWidgetList.size()]; + for (int i = 0; i < mobileWidgetList.size(); i++) { + widgetNames[i] = mobileWidgetList.get(i); + } + return widgetNames; + } +} \ No newline at end of file diff --git a/designer_form/src/com/fr/design/mainframe/WidgetPropertyPane.java b/designer_form/src/com/fr/design/mainframe/WidgetPropertyPane.java index 75a1bed357..1e5f97136c 100644 --- a/designer_form/src/com/fr/design/mainframe/WidgetPropertyPane.java +++ b/designer_form/src/com/fr/design/mainframe/WidgetPropertyPane.java @@ -7,21 +7,18 @@ import com.fr.design.designer.beans.events.DesignerEditListener; import com.fr.design.designer.beans.events.DesignerEvent; import com.fr.design.designer.creator.*; import com.fr.design.designer.properties.EventPropertyTable; -import com.fr.design.dialog.BasicPane; import com.fr.design.fun.WidgetPropertyUIProvider; import com.fr.design.gui.ibutton.UIHeadGroup; import com.fr.design.gui.icontainer.UIScrollPane; +import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itable.AbstractPropertyTable; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.mainframe.widget.ui.FormWidgetCardPane; import com.fr.design.widget.ui.designer.mobile.MobileWidgetDefinePane; -import com.fr.form.ui.Widget; import com.fr.general.Inter; import com.fr.stable.ArrayUtils; import javax.swing.*; -import javax.swing.border.LineBorder; -import javax.swing.table.JTableHeader; import java.awt.*; import java.util.ArrayList; import java.util.List; @@ -33,22 +30,15 @@ import java.util.Set; */ public class WidgetPropertyPane extends FormDockView implements BaseWidgetPropertyPane { - private static final String PARA = "para"; - private static final String BODY = "body"; + private static final int PADDING = 10; + private static final int PADDING_M = 12; private FormWidgetCardPane formWidgetCardPane; // 控件的属性表 private EventPropertyTable eventTable; // 控件的事件表 private List widgetPropertyTables; // 这个变量应该是保存控件拓展的属性tab private List mobileExtraPropertyPanes; // 保存9.0设计器下移动端拓展的属性tab,舍弃JTable private FormDesigner designer; // 当前designer private UIScrollPane psp; // 用来装载属性表table的容器 - private UIScrollPane esp; //用来装载事件table的容器 private JPanel wsp; // 装载移动端tab的容器,包括移动端属性表和控件拓展的移动端属性表 - private MobileParaWidgetTable mobileParaWidgetTable; // 参数面板的移动端属性tab(和body的移动端属性tab区别是没有标签名column) - private MobileWidgetTable mobileWidgetTable; // body的移动端属性tab - private UIScrollPane downPanel; // 这个滚动容器是用于装载centerPane的 - private JPanel centerPane; // 此centerPane采用的是cardLayout布局,装载着mobileWidgetTable和mobileBodyWidgetTable - private CardLayout cardLayout; // 卡片布局,选中参数面板时显示mobileWidgetTable,选中body时显示mobileBodyWidgetTable - private JTableHeader header;//把表头单独get出来作为一个组件 private UIHeadGroup tabsHeaderIconPane; private XComponent lastAffectedCreator; @@ -122,6 +112,7 @@ public class WidgetPropertyPane extends FormDockView implements BaseWidgetPrope if (mobileExtraPropertyPanes != null) { for (MobileWidgetDefinePane extraPane : mobileExtraPropertyPanes) { extraPane.initPropertyGroups(designer); + extraPane.populate(designer); } } if (widgetPropertyTables != null) { @@ -156,33 +147,10 @@ public class WidgetPropertyPane extends FormDockView implements BaseWidgetPrope //加上表头后,这里不再使用borderLayout布局,而采用BoxLayout布局 wsp = FRGUIPaneFactory.createY_AXISBoxInnerContainer_S_Pane(); wsp.setBorder(null); - mobileParaWidgetTable = new MobileParaWidgetTable(designer); - mobileWidgetTable = new MobileWidgetTable(designer); designer.addDesignerEditListener(new MobileWidgetDesignerAdapter()); - centerPane = FRGUIPaneFactory.createCardLayout_S_Pane(); - cardLayout = (CardLayout) centerPane.getLayout(); - centerPane.add(mobileParaWidgetTable, PARA); - // 采用卡片布局的容器必须指定卡片名字,如果没有卡片名字 - // 就会出现:Exception in thread "main" java.lang.IllegalArgumentException: - // cannot add to layout: constraint must be a string - // 第二个参数代表卡片的名字。后来show方法调用时通过名字找到要显示的卡片 - centerPane.add(mobileWidgetTable, BODY); //这两句代码,是把JTable放到一个JPanel中去了,表头不会显示, - //只有放到JScrollPanel中去表头才能正常显示,这就是MobileWidgetTable中定义了表头却没有显示的原因! - //解决方案:MobileWidgetTable实在无法直接放到JScrollPanel中去的时候,应该把表头get出来单独作为一个组件显示 - - if (hasSelectParaPane(designer)) { - cardLayout.show(centerPane, PARA); - header = mobileParaWidgetTable.getTableHeader(); - } else { - cardLayout.show(centerPane, BODY); - header = mobileWidgetTable.getTableHeader(); - } - downPanel = new UIScrollPane(centerPane); - downPanel.setBorder(new LineBorder(Color.GRAY)); //获取拓展移动端属性tab WidgetPropertyUIProvider[] widgetAttrProviders = getExtraPropertyUIProviders(); - addWidgetAttr(widgetAttrProviders); } @@ -217,13 +185,13 @@ public class WidgetPropertyPane extends FormDockView implements BaseWidgetPrope * @param widgetAttrProviders 拓展的tab */ private void addWidgetAttr(WidgetPropertyUIProvider[] widgetAttrProviders) { - if (widgetAttrProviders.length == 0) { // 判断有没有拓展的tab,没有就使用原来的 - wsp.add(header); - wsp.add(downPanel); + if (widgetAttrProviders.length == 0) { // 判断有没有拓展的tab,提示"无可用配置项" + wsp.add(getUnavailablePane()); } else { for (WidgetPropertyUIProvider widgetAttrProvider : widgetAttrProviders) { MobileWidgetDefinePane extraPane = (MobileWidgetDefinePane) widgetAttrProvider.createWidgetAttrPane(); if (extraPane != null) { + extraPane.setBorder(BorderFactory.createEmptyBorder(PADDING, PADDING, PADDING, PADDING_M)); mobileExtraPropertyPanes.add(extraPane); wsp.add(extraPane); } @@ -232,29 +200,20 @@ public class WidgetPropertyPane extends FormDockView implements BaseWidgetPrope widgetPropertyTables.add(propertyTable); designer.addDesignerEditListener(new WidgetPropertyDesignerAdapter(formWidgetCardPane)); - UIScrollPane uiScrollPane = new UIScrollPane(getExtraBodyTable(propertyTable)); + UIScrollPane uiScrollPane = new UIScrollPane(propertyTable); wsp.add(uiScrollPane); } } } } - /** - * 如果是body的拓展属性表,那么要额外加上一张控件顺序表 - * - * @return - */ - private Component getExtraBodyTable(AbstractPropertyTable abstractPropertyTable) { - Widget selection = designer.getSelectionModel().getSelection().getSelectedCreator().toData(); - if ("body".equals(selection.getWidgetName())) { - JPanel jPanel = FRGUIPaneFactory.createY_AXISBoxInnerContainer_S_Pane(); - jPanel.add(abstractPropertyTable); - MobileWidgetTable mobileWidgetTable = new MobileWidgetTable(designer); - jPanel.add(mobileWidgetTable.getTableHeader()); - jPanel.add(mobileWidgetTable); - return jPanel; - } - return abstractPropertyTable; + // "无可用配置项"面板 + private JPanel getUnavailablePane() { + JPanel panel = FRGUIPaneFactory.createBorderLayout_S_Pane(); + UILabel label = new UILabel(Inter.getLocText("FR-Designer_No_Settings_Available")); + label.setHorizontalAlignment(SwingConstants.CENTER); + panel.add(label); + return panel; } private void initTabPane() { diff --git a/designer_form/src/com/fr/design/mainframe/actions/FormMobileAttrAction.java b/designer_form/src/com/fr/design/mainframe/actions/FormMobileAttrAction.java index 4f67187085..95df79b964 100644 --- a/designer_form/src/com/fr/design/mainframe/actions/FormMobileAttrAction.java +++ b/designer_form/src/com/fr/design/mainframe/actions/FormMobileAttrAction.java @@ -6,13 +6,18 @@ import com.fr.design.dialog.BasicDialog; import com.fr.design.dialog.DialogActionAdapter; import com.fr.design.form.mobile.FormMobileAttrPane; import com.fr.design.mainframe.DesignerContext; +import com.fr.design.mainframe.FormArea; import com.fr.design.mainframe.JForm; +import com.fr.design.mainframe.WidgetPropertyPane; import com.fr.design.menu.MenuKeySet; import com.fr.form.main.Form; import com.fr.form.main.mobile.FormMobileAttr; import com.fr.general.Inter; +import com.fr.plugin.ExtraClassManager; +import com.fr.stable.ReportFunctionProcessor; +import com.fr.stable.fun.FunctionProcessor; -import javax.swing.*; +import javax.swing.KeyStroke; import java.awt.event.ActionEvent; /** @@ -47,8 +52,16 @@ public class FormMobileAttrAction extends JTemplateAction { BasicDialog dialog = mobileAttrPane.showWindow(DesignerContext.getDesignerFrame(), new DialogActionAdapter() { @Override public void doOk() { - formTpl.setFormMobileAttr(mobileAttrPane.updateBean()); - jf.fireTargetModified(); + FormMobileAttr formMobileAttr = mobileAttrPane.updateBean(); + formTpl.setFormMobileAttr(formMobileAttr); + ((FormArea)jf.getFormDesign().getParent()).onMobileAttrModified(); + WidgetPropertyPane.getInstance().refreshDockingView(); + if (formMobileAttr.isMobileOnly()) { + FunctionProcessor processor = ExtraClassManager.getInstance().getFunctionProcessor(); + if (processor != null) { + processor.recordFunction(ReportFunctionProcessor.MOBILE_TEMPLATE_FRM); + } + } } }); dialog.setVisible(true); diff --git a/designer_form/src/com/fr/design/mainframe/widget/ui/FormWidgetCardPane.java b/designer_form/src/com/fr/design/mainframe/widget/ui/FormWidgetCardPane.java index 841e9c2908..538f26099d 100644 --- a/designer_form/src/com/fr/design/mainframe/widget/ui/FormWidgetCardPane.java +++ b/designer_form/src/com/fr/design/mainframe/widget/ui/FormWidgetCardPane.java @@ -1,5 +1,6 @@ package com.fr.design.mainframe.widget.ui; +import com.fr.base.BaseUtils; import com.fr.design.data.DataCreatorUI; import com.fr.design.designer.beans.events.DesignerEvent; import com.fr.design.designer.creator.XCreator; @@ -16,7 +17,9 @@ import com.fr.design.dialog.BasicScrollPane; import com.fr.design.foldablepane.UIExpandablePane; import com.fr.design.gui.frpane.AbstractAttrNoScrollPane; import com.fr.design.gui.frpane.AttributeChangeListener; +import com.fr.design.gui.itextfield.UITextField; import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.FormDesigner; import com.fr.design.widget.DataModify; import com.fr.design.widget.FormWidgetDefinePaneFactoryBase; @@ -34,6 +37,7 @@ import com.fr.stable.StringUtils; import javax.swing.BorderFactory; import javax.swing.JComponent; +import javax.swing.JOptionPane; import javax.swing.JPanel; import java.awt.BorderLayout; @@ -208,6 +212,12 @@ public class FormWidgetCardPane extends AbstractAttrNoScrollPane { currentEditorDefinePane.setGlobalName(getGlobalName()); Widget widget = currentEditorDefinePane.updateBean(); if (ComparatorUtils.equals(getGlobalName(), Inter.getLocText("FR-Designer_Basic")) && widgetPropertyPane != null) { + UITextField widgetNameField = widgetPropertyPane.getWidgetNameField(); + if (designer.getTarget().isNameExist(widgetNameField.getText()) && !ComparatorUtils.equals(widgetNameField.getText(), widget.getWidgetName())) { + widgetNameField.setText(widget.getWidgetName()); + JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), Inter.getLocText("FR-Designer_Form_Widget_Rename_Failure"), Inter.getLocText("FR-Designer_Joption_News"), JOptionPane.ERROR_MESSAGE, BaseUtils.readIcon("com/fr/design/form/images/joption_failure.png")); + return; + } widgetPropertyPane.update(widget); xCreator.resetCreatorName(widget.getWidgetName()); xCreator.resetVisible(widget.isVisible()); diff --git a/designer_form/src/com/fr/design/widget/ui/designer/mobile/BodyMobileDefinePane.java b/designer_form/src/com/fr/design/widget/ui/designer/mobile/BodyMobileDefinePane.java new file mode 100644 index 0000000000..f307152849 --- /dev/null +++ b/designer_form/src/com/fr/design/widget/ui/designer/mobile/BodyMobileDefinePane.java @@ -0,0 +1,123 @@ +package com.fr.design.widget.ui.designer.mobile; + +import com.fr.design.designer.beans.events.DesignerEvent; +import com.fr.design.designer.creator.XCreator; +import com.fr.design.foldablepane.UIExpandablePane; +import com.fr.design.gui.frpane.AttributeChangeListener; +import com.fr.design.gui.icheckbox.UICheckBox; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.mainframe.FormDesigner; +import com.fr.design.mainframe.MobileWidgetListPane; +import com.fr.design.mainframe.WidgetPropertyPane; +import com.fr.form.ui.container.WSortLayout; +import com.fr.general.Inter; + +import javax.swing.*; +import java.awt.*; +import java.lang.reflect.Method; + +/** + * Created by plough on 2018/2/1. + */ +public class BodyMobileDefinePane extends MobileWidgetDefinePane { + private XCreator bodyCreator; + private FormDesigner designer; + private AttributeChangeListener changeListener; + private UICheckBox appRelayoutCheck; + private MobileWidgetListPane mobileWidgetListPane; + + public BodyMobileDefinePane(XCreator xCreator) { + this.bodyCreator = xCreator; + } + + @Override + public void initPropertyGroups(Object source) { + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + this.designer = WidgetPropertyPane.getInstance().getEditingFormDesigner(); + this.add(getMobilePropertyPane(), BorderLayout.NORTH); + this.add(getMobileWidgetListPane(), BorderLayout.CENTER); + this.repaint(); + } + + // 手机属性 + private UIExpandablePane getMobilePropertyPane() { + JPanel panel = FRGUIPaneFactory.createBorderLayout_S_Pane(); + appRelayoutCheck = new UICheckBox(Inter.getLocText("FR-Designer-App_ReLayout"), true); + appRelayoutCheck.setBorder(BorderFactory.createEmptyBorder(0, 0, 10, 0)); + panel.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0)); + panel.add(appRelayoutCheck); + + final JPanel panelWrapper = FRGUIPaneFactory.createBorderLayout_S_Pane(); + panelWrapper.add(panel, BorderLayout.NORTH); + + return new UIExpandablePane(Inter.getLocText("FR-Designer_Properties_Mobile"), 280, 20, panelWrapper); + } + + // 控件顺序 + private UIExpandablePane getMobileWidgetListPane() { + mobileWidgetListPane = new MobileWidgetListPane(designer, (WSortLayout) bodyCreator.toData()); + mobileWidgetListPane.setBorder(BorderFactory.createEmptyBorder(10, 0, 5, 0)); + JPanel panelWrapper = FRGUIPaneFactory.createBorderLayout_S_Pane(); + panelWrapper.add(mobileWidgetListPane, BorderLayout.CENTER); + + return new UIExpandablePane(Inter.getLocText("FR-Designer_WidgetOrder"), 280, 20, panelWrapper); + } + + private void bindListeners2Widgets() { + reInitAllListeners(); + this.changeListener = new AttributeChangeListener() { + @Override + public void attributeChange() { + update(); + } + }; + } + + /** + * 后台初始化所有事件. + */ + private void reInitAllListeners() { + initListener(this); + } + + // body是否开启手机重布局 + private boolean isAppRelayout() { + boolean result = false; + try { + Method m = bodyCreator.toData().getClass().getMethod("isAppRelayout"); + result = (boolean)m.invoke(bodyCreator.toData()); + } catch (Exception e) { + // do nothing + } + return result; + } + + private void setAppRelayout(boolean appRelayoutSeleted) { + if (appRelayoutSeleted == isAppRelayout()) { + return; + } + try { + Method m = bodyCreator.toData().getClass().getMethod("setAppRelayout", boolean.class); + m.invoke(bodyCreator.toData(), appRelayoutSeleted); + } catch (Exception e) { + // do nothing + } + } + + @Override + public void populate(FormDesigner designer) { + this.designer = designer; + appRelayoutCheck.setSelected(isAppRelayout()); + + // 数据 populate 完成后,再设置监听 + this.bindListeners2Widgets(); + this.addAttributeChangeListener(changeListener); + } + + @Override + public void update() { + setAppRelayout(appRelayoutCheck.isSelected()); + mobileWidgetListPane.updateToDesigner(); + designer.getEditListenerTable().fireCreatorModified(DesignerEvent.CREATOR_EDITED); + } +} diff --git a/designer_form/src/com/fr/design/widget/ui/designer/mobile/ChartEditorDefinePane.java b/designer_form/src/com/fr/design/widget/ui/designer/mobile/ChartEditorDefinePane.java new file mode 100644 index 0000000000..ddde0ba21c --- /dev/null +++ b/designer_form/src/com/fr/design/widget/ui/designer/mobile/ChartEditorDefinePane.java @@ -0,0 +1,191 @@ +package com.fr.design.widget.ui.designer.mobile; + +import com.fr.base.mobile.ChartMobileAttrProvider; +import com.fr.base.mobile.ChartMobileFitAttrState; +import com.fr.base.mobile.ChartMobileFitAttrStateProvider; +import com.fr.design.constants.LayoutConstants; +import com.fr.design.designer.creator.XCreator; +import com.fr.design.designer.creator.XWAbsoluteBodyLayout; +import com.fr.design.designer.creator.XWAbsoluteLayout; +import com.fr.design.designer.properties.items.Item; +import com.fr.design.foldablepane.UIExpandablePane; +import com.fr.design.gui.frpane.AttributeChangeListener; +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.TableLayout; +import com.fr.design.layout.TableLayoutHelper; +import com.fr.design.mainframe.DesignerContext; +import com.fr.design.mainframe.FormDesigner; +import com.fr.design.mainframe.WidgetPropertyPane; +import com.fr.form.FormFunctionProcessor; +import com.fr.form.ui.BaseChartEditor; +import com.fr.form.ui.container.WFitLayout; +import com.fr.general.Inter; +import com.fr.plugin.ExtraClassManager; +import com.fr.stable.StringUtils; +import com.fr.stable.fun.FunctionProcessor; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ItemEvent; +import java.awt.event.ItemListener; + +/** + * Created by plough on 2018/1/18. + */ +public class ChartEditorDefinePane extends MobileWidgetDefinePane{ + private static final Item[] ITEMS = { + new Item(ChartMobileFitAttrState.AUTO.description(), ChartMobileFitAttrState.AUTO), + new Item(ChartMobileFitAttrState.AREA.description(), ChartMobileFitAttrState.AREA), + new Item(ChartMobileFitAttrState.PROPORTION.description(), ChartMobileFitAttrState.PROPORTION) + }; + + private XCreator xCreator; // 当前选中控件的xCreator + private FormDesigner designer; // 当前设计器 + private UIComboBox zoomOutComboBox;// 缩小逻辑下拉框 + private AttributeChangeListener changeListener; + private UILabel tipLabel; + + public ChartEditorDefinePane (XCreator xCreator) { + this.xCreator = xCreator; + } + + @Override + public void initPropertyGroups(Object source) { + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + this.designer = WidgetPropertyPane.getInstance().getEditingFormDesigner(); + JPanel mobileSettingsPane; + if (isInAbsoluteLayout()) { + mobileSettingsPane = getUnavailableTipPane(Inter.getLocText("FR-Designer_Tip_Chart_Adaptivity_Unavailable_In_Absolute_Layout")); + } else if (!isAppRelayout()) { + mobileSettingsPane = getUnavailableTipPane(Inter.getLocText("FR-Designer_Tip_Chart_Adaptivity_Unavailable")); + } else { + mobileSettingsPane = getMobileSettingsPane(); + } + this.add(mobileSettingsPane, BorderLayout.NORTH); + this.repaint(); + } + + private boolean isInAbsoluteLayout() { + Container parent = xCreator.getParent(); + while (parent != null) { + if (parent instanceof XWAbsoluteLayout && !(parent instanceof XWAbsoluteBodyLayout)) { + return true; + } + parent = parent.getParent(); + } + return false; + } + + // body是否开启手机重布局 + private boolean isAppRelayout() { + return ((WFitLayout)designer.getRootComponent().toData()).isAppRelayout(); + } + + private JPanel getUnavailableTipPane(String tipText) { + JPanel panel = new JPanel(new BorderLayout()); + UILabel unavailableTipLabel = new UILabel(); + unavailableTipLabel.setText("" + tipText + ""); + unavailableTipLabel.setForeground(Color.gray); + panel.add(unavailableTipLabel, BorderLayout.NORTH); + return panel; + } + + private UIExpandablePane getMobileSettingsPane() { + initZoomOutComboBox(); + + tipLabel = new UILabel(); + tipLabel.setForeground(Color.gray); + updateTipLabel(); + + Component[][] components = new Component[][]{ + new Component[] {new UILabel(Inter.getLocText("FR-Designer_Zoom_In_Logic"), SwingConstants.LEFT), new UILabel(ChartMobileFitAttrState.PROPORTION.description())}, + new Component[] {new UILabel(Inter.getLocText("FR-Designer_Zoom_Out_Logic"), SwingConstants.LEFT), zoomOutComboBox}, + new Component[] {tipLabel, null} + }; + + double f = TableLayout.FILL; + double p = TableLayout.PREFERRED; + double[] rowSize = {p, p, p}; + double[] columnSize = {p,f}; + int[][] rowCount = {{1, 1}, {1, 1}, {1, 1}}; + final JPanel panel = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, 30, LayoutConstants.VGAP_LARGE); + panel.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0)); + final JPanel panelWrapper = FRGUIPaneFactory.createBorderLayout_S_Pane(); + panelWrapper.add(panel, BorderLayout.NORTH); + + return new UIExpandablePane(Inter.getLocText("FR-Designer_Chart_Adaptivity"), 280, 20, panelWrapper); + } + + private void initZoomOutComboBox() { + this.zoomOutComboBox = new UIComboBox(ITEMS); + } + + + private void updateTipLabel() { + ChartMobileFitAttrState fitAttrState = (ChartMobileFitAttrState) ((Item)zoomOutComboBox.getSelectedItem()).getValue(); + // 使用 html,可以自动换行 + tipLabel.setText("" + fitAttrState.tip() + ""); + } + + private void bindListeners2Widgets() { + reInitAllListeners(); + this.changeListener = new AttributeChangeListener() { + @Override + public void attributeChange() { + update(); + } + }; + } + + /** + * 后台初始化所有事件. + */ + private void reInitAllListeners() { + initListener(this); + } + + @Override + public void populate(FormDesigner designer) { + this.designer = designer; + + if (!isAppRelayout() || isInAbsoluteLayout()) { + return; + } + + BaseChartEditor chartEditor = (BaseChartEditor)xCreator.toData(); + ChartMobileFitAttrStateProvider zoomOutAttr = chartEditor.getMobileAttr().getZoomOutAttr(); + this.zoomOutComboBox.setSelectedItem(new Item(zoomOutAttr.description(), zoomOutAttr)); + + // 数据 populate 完成后,再设置监听 + this.bindListeners2Widgets(); + this.zoomOutComboBox.addItemListener(new ItemListener() { + @Override + public void itemStateChanged(ItemEvent e) { + // 只响应选中事件 + if (e.getStateChange() != ItemEvent.SELECTED) { + return; + } + updateTipLabel(); + ChartMobileFitAttrState selectedAttr = (ChartMobileFitAttrState)((Item)e.getItem()).getValue(); + if (selectedAttr.getState() != ChartMobileFitAttrState.AUTO.getState()) { + // 功能埋点 + FunctionProcessor processor = ExtraClassManager.getInstance().getFunctionProcessor(); + if (processor != null) { + processor.recordFunction(FormFunctionProcessor.MOBILE_CHART_ADAPTIVITY); + } + } + } + }); + this.addAttributeChangeListener(changeListener); + } + + @Override + public void update() { + ChartMobileAttrProvider mobileAttr = ((BaseChartEditor)xCreator.toData()).getMobileAttr(); + mobileAttr.setZoomInAttr(ChartMobileFitAttrState.PROPORTION); + mobileAttr.setZoomOutAttr((ChartMobileFitAttrState)((Item)zoomOutComboBox.getSelectedItem()).getValue()); + DesignerContext.getDesignerFrame().getSelectedJTemplate().fireTargetModified(); // 触发设计器保存按钮亮起来 + } +} diff --git a/designer_form/src/com/fr/design/widget/ui/designer/mobile/ElementCaseDefinePane.java b/designer_form/src/com/fr/design/widget/ui/designer/mobile/ElementCaseDefinePane.java index 70c3b94f63..afe9027f02 100644 --- a/designer_form/src/com/fr/design/widget/ui/designer/mobile/ElementCaseDefinePane.java +++ b/designer_form/src/com/fr/design/widget/ui/designer/mobile/ElementCaseDefinePane.java @@ -48,25 +48,6 @@ public class ElementCaseDefinePane extends MobileWidgetDefinePane{ this.xCreator = xCreator; } - @Override - protected void initContentPane() {} - - @Override - protected JPanel createContentPane() { - return null; - } - - @Override - public String getIconPath() { - return ""; - } - - @Override - public String title4PopupWindow() { - return "ElementCase"; - } - - @Override public void initPropertyGroups(Object source) { this.setLayout(FRGUIPaneFactory.createBorderLayout()); diff --git a/designer_form/src/com/fr/design/widget/ui/designer/mobile/MobileWidgetDefinePane.java b/designer_form/src/com/fr/design/widget/ui/designer/mobile/MobileWidgetDefinePane.java index 49d0b59a52..ac4de096a6 100644 --- a/designer_form/src/com/fr/design/widget/ui/designer/mobile/MobileWidgetDefinePane.java +++ b/designer_form/src/com/fr/design/widget/ui/designer/mobile/MobileWidgetDefinePane.java @@ -3,6 +3,8 @@ package com.fr.design.widget.ui.designer.mobile; import com.fr.design.gui.frpane.AbstractAttrNoScrollPane; import com.fr.design.mainframe.FormDesigner; +import javax.swing.*; + /** * 所有移动端需要拓展的属性面板均继承此类 * @@ -23,4 +25,14 @@ public abstract class MobileWidgetDefinePane extends AbstractAttrNoScrollPane{ * 从属性面板把数据传到后台 */ public abstract void update(); + + // 暂不需要此方法 + @Override + protected void initContentPane() {} + + // 暂不需要此方法 + @Override + protected JPanel createContentPane() { + return new JPanel(); + } } diff --git a/designer_form/src/com/fr/design/widget/ui/designer/mobile/ParaMobileDefinePane.java b/designer_form/src/com/fr/design/widget/ui/designer/mobile/ParaMobileDefinePane.java new file mode 100644 index 0000000000..91c26678f4 --- /dev/null +++ b/designer_form/src/com/fr/design/widget/ui/designer/mobile/ParaMobileDefinePane.java @@ -0,0 +1,80 @@ +package com.fr.design.widget.ui.designer.mobile; + +import com.fr.design.designer.beans.events.DesignerEvent; +import com.fr.design.designer.creator.XCreator; +import com.fr.design.foldablepane.UIExpandablePane; +import com.fr.design.gui.frpane.AttributeChangeListener; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.mainframe.FormDesigner; +import com.fr.design.mainframe.MobileWidgetListPane; +import com.fr.design.mainframe.WidgetPropertyPane; +import com.fr.form.ui.container.WSortLayout; +import com.fr.general.Inter; + +import javax.swing.*; +import java.awt.*; + +/** + * Created by plough on 2018/2/5. + */ +public class ParaMobileDefinePane extends MobileWidgetDefinePane { + private XCreator paraCreator; + private FormDesigner designer; + private AttributeChangeListener changeListener; + private MobileWidgetListPane mobileWidgetListPane; + + public ParaMobileDefinePane(XCreator xCreator) { + this.paraCreator = xCreator; + } + + @Override + public void initPropertyGroups(Object source) { + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + this.designer = WidgetPropertyPane.getInstance().getEditingFormDesigner(); + this.add(getMobileWidgetListPane(), BorderLayout.CENTER); + this.repaint(); + } + + // 控件顺序 + private UIExpandablePane getMobileWidgetListPane() { + mobileWidgetListPane = new MobileWidgetListPane(designer, (WSortLayout) paraCreator.toData()); + mobileWidgetListPane.setBorder(BorderFactory.createEmptyBorder(10, 0, 5, 0)); + JPanel panelWrapper = FRGUIPaneFactory.createBorderLayout_S_Pane(); + panelWrapper.add(mobileWidgetListPane, BorderLayout.CENTER); + + return new UIExpandablePane(Inter.getLocText("FR-Designer_WidgetOrder"), 280, 20, panelWrapper); + } + + private void bindListeners2Widgets() { + reInitAllListeners(); + this.changeListener = new AttributeChangeListener() { + @Override + public void attributeChange() { + update(); + } + }; + } + + /** + * 后台初始化所有事件. + */ + private void reInitAllListeners() { + initListener(this); + } + + + @Override + public void populate(FormDesigner designer) { + this.designer = designer; + + // 设置监听 + this.bindListeners2Widgets(); + this.addAttributeChangeListener(changeListener); + } + + @Override + public void update() { + mobileWidgetListPane.updateToDesigner(); + designer.getEditListenerTable().fireCreatorModified(DesignerEvent.CREATOR_EDITED); + } +}