diff --git a/designer-base/src/com/fr/design/ExtraDesignClassManager.java b/designer-base/src/com/fr/design/ExtraDesignClassManager.java index 179251539..bfef815c8 100644 --- a/designer-base/src/com/fr/design/ExtraDesignClassManager.java +++ b/designer-base/src/com/fr/design/ExtraDesignClassManager.java @@ -17,10 +17,11 @@ import com.fr.design.gui.core.WidgetOption; import com.fr.design.gui.core.WidgetOptionFactory; import com.fr.design.menu.ShortCut; import com.fr.design.widget.Appearance; +import com.fr.design.widget.mobile.WidgetMobilePane; import com.fr.form.ui.Widget; +import com.fr.general.FRLogger; import com.fr.general.GeneralUtils; import com.fr.general.IOUtils; -import com.fr.log.FineLoggerFactory; import com.fr.plugin.AbstractExtraClassManager; import com.fr.plugin.injectable.PluginModule; import com.fr.plugin.injectable.PluginSingleInjection; @@ -41,24 +42,24 @@ import java.util.Set; * 用于设计器扩展的管理类 */ public class ExtraDesignClassManager extends AbstractExtraClassManager implements ExtraDesignClassManagerProvider { - + private static ExtraDesignClassManager classManager = new ExtraDesignClassManager(); - + private Set shortCuts = new CloseableContainedSet<>(HashSet.class); - + public synchronized static ExtraDesignClassManager getInstance() { return classManager; } - + static { PluginModule.registerAgent(PluginModule.ExtraDesign, classManager); } - + public TableDataNameObjectCreator[] getReportTableDataCreators() { return getKindsOfTableDataCreators(TableDataDefineProvider.XML_TAG); } - - + + /** * 添加serverTDCreators * @@ -67,7 +68,7 @@ public class ExtraDesignClassManager extends AbstractExtraClassManager implement public TableDataNameObjectCreator[] getServerTableDataCreators() { return getKindsOfTableDataCreators(ServerTableDataDefineProvider.XML_TAG); } - + private TableDataNameObjectCreator[] getKindsOfTableDataCreators(String tag) { Set set = getArray(tag); if (set.isEmpty()) { @@ -76,19 +77,19 @@ public class ExtraDesignClassManager extends AbstractExtraClassManager implement List creators = new ArrayList<>(); for (TableDataDefineProvider provider : set) { TableDataNameObjectCreator creator = new TableDataNameObjectCreator( - provider.nameForTableData(), - provider.prefixForTableData(), - provider.iconPathForTableData(), - provider.classForTableData(), - provider.classForInitTableData(), - provider.appearanceForTableData() + provider.nameForTableData(), + provider.prefixForTableData(), + provider.iconPathForTableData(), + provider.classForTableData(), + provider.classForInitTableData(), + provider.appearanceForTableData() ); creators.add(creator); } return creators.toArray(new TableDataNameObjectCreator[creators.size()]); } - - + + public Map, Class> getParameterWidgetOptionsMap() { Map, Class> map = new HashMap<>(); Set set = getArray(ParameterWidgetOptionProvider.XML_TAG); @@ -97,7 +98,7 @@ public class ExtraDesignClassManager extends AbstractExtraClassManager implement } return map; } - + public WidgetOption[] getParameterWidgetOptions() { Set set = getArray(ParameterWidgetOptionProvider.XML_TAG); if (set.isEmpty()) { @@ -106,16 +107,16 @@ public class ExtraDesignClassManager extends AbstractExtraClassManager implement Set result = new HashSet<>(); for (ParameterWidgetOptionProvider provider : set) { WidgetOption option = WidgetOptionFactory.createByWidgetClass( - provider.nameForWidget(), - IOUtils.readIcon(provider.iconPathForWidget()), - provider.classForWidget() + provider.nameForWidget(), + IOUtils.readIcon(provider.iconPathForWidget()), + provider.classForWidget() ); result.add(option); } return result.toArray(new WidgetOption[result.size()]); } - - + + public WidgetOption[] getWebWidgetOptions() { Set set = getArray(ToolbarItemProvider.XML_TAG); if (set.isEmpty()) { @@ -124,17 +125,17 @@ public class ExtraDesignClassManager extends AbstractExtraClassManager implement List list = new ArrayList<>(); for (ToolbarItemProvider provider : set) { WidgetOption option = WidgetOptionFactory.createByWidgetClass( - provider.nameForWidget(), - IOUtils.readIcon(provider.iconPathForWidget()), - provider.classForWidget() + provider.nameForWidget(), + IOUtils.readIcon(provider.iconPathForWidget()), + provider.classForWidget() ); list.add(option); } return list.toArray(new WidgetOption[list.size()]); } - - - + + + public Map, Class> getFormWidgetOptionsMap() { Set set = getArray(FormWidgetOptionProvider.XML_TAG); Map, Class> map = new HashMap<>(); @@ -143,15 +144,15 @@ public class ExtraDesignClassManager extends AbstractExtraClassManager implement } return map; } - + public WidgetOption[] getFormWidgetOptions() { return getFormUnits(false); } - + public WidgetOption[] getFormWidgetContainerOptions() { return getFormUnits(true); } - + private WidgetOption[] getFormUnits(boolean isContainer) { Set set = getArray(FormWidgetOptionProvider.XML_TAG); if (set.isEmpty()) { @@ -161,18 +162,18 @@ public class ExtraDesignClassManager extends AbstractExtraClassManager implement for (FormWidgetOptionProvider provider : set) { if (provider.isContainer() == isContainer) { WidgetOption option = WidgetOptionFactory.createByWidgetClass( - provider.nameForWidget(), - BaseUtils.readIcon(provider.iconPathForWidget()), - provider.classForWidget() + provider.nameForWidget(), + BaseUtils.readIcon(provider.iconPathForWidget()), + provider.classForWidget() ); result.add(option); } } return result.toArray(new WidgetOption[result.size()]); } - - - + + + public WidgetOption[] getCellWidgetOptions() { Set set = getArray(CellWidgetOptionProvider.XML_TAG); if (set.isEmpty()) { @@ -181,16 +182,16 @@ public class ExtraDesignClassManager extends AbstractExtraClassManager implement Set result = new HashSet<>(); for (CellWidgetOptionProvider provider : set) { WidgetOption option = WidgetOptionFactory.createByWidgetClass( - provider.nameForWidget(), - IOUtils.readIcon(provider.iconPathForWidget()), - provider.classForWidget() + provider.nameForWidget(), + IOUtils.readIcon(provider.iconPathForWidget()), + provider.classForWidget() ); result.add(option); } return result.toArray(new WidgetOption[result.size()]); - + } - + public Map, Appearance> getCellWidgetOptionsMap() { Set set = getArray(CellWidgetOptionProvider.XML_TAG); Map, Appearance> map = new HashMap<>(); @@ -199,8 +200,17 @@ public class ExtraDesignClassManager extends AbstractExtraClassManager implement } return map; } - - + + public Map, Class> getCellWidgetMobileOptionsMap() { + Set set = getArray(CellWidgetOptionProvider.XML_TAG); + Map, Class> map = new HashMap<>(); + for (CellWidgetOptionProvider provider : set) { + map.put(provider.classForWidget(), provider.classForMobilePane()); + } + return map; + } + + public Feedback getFeedback() { try { Class clazz = GeneralUtils.classForName("com.fr.design.feedback.CurrentFeedback"); @@ -208,33 +218,33 @@ public class ExtraDesignClassManager extends AbstractExtraClassManager implement return (Feedback) clazz.newInstance(); } } catch (Exception e) { - FineLoggerFactory.getLogger().info("no feed back support"); + FRLogger.getLogger().info("no feed back support"); } return Feedback.EMPTY; } - + @Override protected boolean demountSpecific(PluginSingleInjection injection) { - + if (ShortCut.TEMPLATE_TREE.equals(injection.getName()) && injection.getObject() instanceof ShortCut) { shortCuts.remove(injection.getObject()); return true; } return false; } - + @Override protected boolean mountSpecific(PluginSingleInjection injection) { - + if (ShortCut.TEMPLATE_TREE.equals(injection.getName()) && injection.getObject() instanceof ShortCut) { shortCuts.add((ShortCut) injection.getObject()); return true; } return false; } - + public Set getExtraShortCuts() { - + return Collections.unmodifiableSet(shortCuts); } } \ No newline at end of file diff --git a/designer-form/src/com/fr/design/designer/properties/items/Item.java b/designer-base/src/com/fr/design/designer/properties/items/Item.java similarity index 92% rename from designer-form/src/com/fr/design/designer/properties/items/Item.java rename to designer-base/src/com/fr/design/designer/properties/items/Item.java index 31ae4a070..6cba90e41 100644 --- a/designer-form/src/com/fr/design/designer/properties/items/Item.java +++ b/designer-base/src/com/fr/design/designer/properties/items/Item.java @@ -24,7 +24,7 @@ public class Item { } @Override - public boolean equals(Object o) { + public boolean equals(Object o) { if (o == null) { return false; } @@ -32,7 +32,7 @@ public class Item { Item a = (Item) o; Object av = a.getValue(); if (value == null) { - return av == null; + return av == null; } else { if (av == null) { return false; diff --git a/designer-base/src/com/fr/design/fun/CellWidgetOptionProvider.java b/designer-base/src/com/fr/design/fun/CellWidgetOptionProvider.java index 1cb7869d7..e22b68146 100644 --- a/designer-base/src/com/fr/design/fun/CellWidgetOptionProvider.java +++ b/designer-base/src/com/fr/design/fun/CellWidgetOptionProvider.java @@ -1,6 +1,7 @@ package com.fr.design.fun; import com.fr.design.beans.BasicBeanPane; +import com.fr.design.widget.mobile.WidgetMobilePane; import com.fr.form.ui.Widget; import com.fr.stable.fun.Level; @@ -20,4 +21,10 @@ public interface CellWidgetOptionProvider extends ParameterWidgetOptionProvider */ Class> appearanceForWidget(); + /** + * 自定义格子控件的移动端界面类 + * @return 控件移动端界面类 + */ + Class classForMobilePane(); + } \ No newline at end of file diff --git a/designer-base/src/com/fr/design/fun/impl/AbstractCellWidgetOptionProvider.java b/designer-base/src/com/fr/design/fun/impl/AbstractCellWidgetOptionProvider.java index 8e040bcd9..1efbdd80e 100644 --- a/designer-base/src/com/fr/design/fun/impl/AbstractCellWidgetOptionProvider.java +++ b/designer-base/src/com/fr/design/fun/impl/AbstractCellWidgetOptionProvider.java @@ -1,6 +1,7 @@ package com.fr.design.fun.impl; import com.fr.design.fun.CellWidgetOptionProvider; +import com.fr.design.widget.mobile.WidgetMobilePane; import com.fr.stable.fun.impl.AbstractProvider; import com.fr.stable.fun.mark.API; @@ -20,4 +21,9 @@ public abstract class AbstractCellWidgetOptionProvider extends AbstractProvider public String mark4Provider() { return getClass().getName(); } + + @Override + public Class classForMobilePane() { + return WidgetMobilePane.class; + } } \ No newline at end of file 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 000000000..a07e4c2ce --- /dev/null +++ b/designer-base/src/com/fr/design/gui/controlpane/UISimpleListControlPane.java @@ -0,0 +1,483 @@ +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.BorderFactory; +import javax.swing.DefaultListModel; +import javax.swing.JComponent; +import javax.swing.JList; +import javax.swing.JPanel; +import javax.swing.ListCellRenderer; +import javax.swing.ListSelectionModel; +import javax.swing.border.Border; +import javax.swing.event.ListSelectionEvent; +import javax.swing.event.ListSelectionListener; +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Component; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Point; +import java.awt.Toolkit; +import java.awt.event.ActionEvent; +import java.awt.event.InputEvent; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +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/ilable/UILabel.java b/designer-base/src/com/fr/design/gui/ilable/UILabel.java index f90dbea0d..6583e8d61 100644 --- a/designer-base/src/com/fr/design/gui/ilable/UILabel.java +++ b/designer-base/src/com/fr/design/gui/ilable/UILabel.java @@ -1,9 +1,16 @@ package com.fr.design.gui.ilable; import com.fr.design.utils.gui.GUICoreUtils; +import com.fr.stable.StringUtils; -import javax.swing.*; -import java.awt.*; +import com.fr.stable.StringUtils; +import javax.swing.Icon; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JPanel; +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Dimension; /** * Created by IntelliJ IDEA. @@ -13,6 +20,7 @@ import java.awt.*; * Time: 下午3:15 */ public class UILabel extends JLabel { + private static final int HTML_SHIFT_HEIGHT = 3; public UILabel(String text, Icon image, int horizontalAlignment) { super(text, image, horizontalAlignment); @@ -46,6 +54,16 @@ public class UILabel extends JLabel { super(); } + @Override + public Dimension getPreferredSize() { + Dimension preferredSize = super.getPreferredSize(); + // (Windows 下)使用 html 时,文字内容会略微向下偏移,导致文字底部被截断,所以适当增加 UILabel 的高度 + if (StringUtils.isNotEmpty(getText()) && getText().startsWith("")) { + return new Dimension(preferredSize.width, preferredSize.height + HTML_SHIFT_HEIGHT); + } + return preferredSize; + } + public static void main(String[] args) { // UILabel label = new UILabel("shishi",SwingConstants.LEFT); diff --git a/designer-base/src/com/fr/design/widget/mobile/WidgetMobilePane.java b/designer-base/src/com/fr/design/widget/mobile/WidgetMobilePane.java new file mode 100644 index 000000000..392b4b500 --- /dev/null +++ b/designer-base/src/com/fr/design/widget/mobile/WidgetMobilePane.java @@ -0,0 +1,47 @@ +package com.fr.design.widget.mobile; + +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.form.ui.Widget; +import com.fr.general.Inter; + +import javax.swing.BorderFactory; +import javax.swing.JPanel; +import javax.swing.SwingConstants; + +/** + * 单元格控件的"移动端"面板。默认显示"无可用配置项",在子类中扩展 + * Created by plough on 2018/4/25. + */ +public class WidgetMobilePane extends JPanel { + public static WidgetMobilePane DEFAULT_PANE = new WidgetMobilePane(); + + public WidgetMobilePane() { + this.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); + init(); + } + + protected void init() { + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + UILabel label = new UILabel(Inter.getLocText("FR-Designer_No_Settings_Available")); + label.setHorizontalAlignment(SwingConstants.CENTER); + this.add(label); + } + + /** + * 从 widget 中提取数据展示在属性面板中 + * + * @param widget + */ + public void populate(Widget widget) { + // do nothing + } + + /** + * 从属性面板把数据保存到 widget 中 + * @param widget + */ + public void update(Widget widget) { + // do nothing + } +} 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 a53aae956..bb730122a 100644 --- a/designer-form/src/com/fr/design/designer/creator/XChartEditor.java +++ b/designer-form/src/com/fr/design/designer/creator/XChartEditor.java @@ -11,11 +11,13 @@ 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.*; import com.fr.design.mainframe.widget.editors.WLayoutBorderStyleEditor; -import com.fr.design.mainframe.widget.renderer.LayoutBorderStyleRenderer; import com.fr.design.module.DesignModuleFactory; import com.fr.design.designer.beans.events.DesignerEditor; import com.fr.form.ui.BaseChartEditor; @@ -23,6 +25,7 @@ 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; /** @@ -35,18 +38,17 @@ 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; //marro:无奈的属性,暂时想不出好办法 private boolean isRefreshing = false; - private boolean isHovering = false; private boolean isEditing = false; + + private boolean isHovering = false; 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 JPanel coverPanel; public XChartEditor(BaseChartEditor editor) { this(editor, new Dimension(250, 150)); @@ -67,19 +69,19 @@ public class XChartEditor extends XBorderStyleWidgetCreator { return "Chart.png"; } - /** - * 返回组件默认名 - * @return 组件类名(小写) - */ - public String createDefaultName() { - return "chart"; - } - - /** - * 是否支持设置标题 - * @return 是返回true - */ - public boolean hasTitleStyle() { + /** + * 返回组件默认名 + * @return 组件类名(小写) + */ + public String createDefaultName() { + return "chart"; + } + + /** + * 是否支持设置标题 + * @return 是返回true + */ + public boolean hasTitleStyle() { return true; } @@ -88,15 +90,15 @@ public class XChartEditor extends XBorderStyleWidgetCreator { isEditing = false; } - /** - * 得到属性名 - * @return 属性名 - * @throws java.beans.IntrospectionException - */ - public CRPropertyDescriptor[] supportedDescriptor() throws IntrospectionException { - return new CRPropertyDescriptor[] { - new CRPropertyDescriptor("widgetName", this.data.getClass()).setI18NName(Inter - .getLocText("Form-Widget_Name")), + /** + * 得到属性名 + * @return 属性名 + * @throws java.beans.IntrospectionException + */ + public CRPropertyDescriptor[] supportedDescriptor() throws IntrospectionException { + return new CRPropertyDescriptor[] { + new CRPropertyDescriptor("widgetName", this.data.getClass()).setI18NName(Inter + .getLocText("Form-Widget_Name")), new CRPropertyDescriptor("visible", this.data.getClass()).setI18NName( Inter.getLocText("FR-Designer_Widget-Visible")).setPropertyChangeListener(new PropertyChangeAdapter() { @@ -104,26 +106,42 @@ public class XChartEditor extends XBorderStyleWidgetCreator { public void propertyChange() { makeVisible(toData().isVisible());} }), - new CRPropertyDescriptor("borderStyle", this.data.getClass()).setEditorClass( - WLayoutBorderStyleEditor.class).setI18NName( - Inter.getLocText("Chart-Style_Name")).putKeyValue(XCreatorConstants.PROPERTY_CATEGORY, "Advanced") - .setPropertyChangeListener(new PropertyChangeAdapter() { - - @Override - public void propertyChange() { - initStyle(); - } - }), - }; - } - - /** - * 该组件是否可以拖入参数面板 - * @return 是则返回true - */ - public boolean canEnterIntoParaPane(){ - return false; - } + new CRPropertyDescriptor("borderStyle", this.data.getClass()).setEditorClass( + WLayoutBorderStyleEditor.class).setI18NName( + Inter.getLocText("Chart-Style_Name")).putKeyValue(XCreatorConstants.PROPERTY_CATEGORY, "Advanced") + .setPropertyChangeListener(new PropertyChangeAdapter() { + + @Override + public void propertyChange() { + initStyle(); + } + }), + }; + } + + /** + * 该组件是否可以拖入参数面板 + * @return 是则返回true + */ + public boolean canEnterIntoParaPane(){ + 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 @@ -187,22 +205,6 @@ public class XChartEditor extends XBorderStyleWidgetCreator { return bcc; } - - /** - * 编辑状态的时候需要重新绘制下边框 - * - */ - @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); - } - } - - /** * 渲染Painter */ @@ -244,6 +246,10 @@ public class XChartEditor extends XBorderStyleWidgetCreator { editingMouseListener.startEditing(this, isEditing ? adapter.getDesignerEditor() : null, adapter); } } + HelpDialogManager.getInstance().setPane(coverPanel); + if (this.isHelpBtnOnFocus()) { + coverPanel.setMsgDisplay(e); + } } @Override @@ -272,7 +278,7 @@ public class XChartEditor extends XBorderStyleWidgetCreator { editor.setLayout(null); editor.setOpaque(false); - coverPanel = new CoverPane(); + coverPanel = new CoverReportPane(); coverPanel.setPreferredSize(this.getPreferredSize()); coverPanel.setBounds(this.getBounds()); @@ -287,6 +293,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()); @@ -313,4 +320,16 @@ public class XChartEditor extends XBorderStyleWidgetCreator { initStyle(); } + @Override + public WidgetPropertyUIProvider[] getWidgetPropertyUIProviders() { + return new WidgetPropertyUIProvider[]{ new ChartEditorPropertyUI(this)}; + } + + /** + * 是否支持共享-现只支持报表块、图表、tab块、绝对布局 + * @return + */ + public boolean isSupportShared() { + return true; + } } \ 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 0ca67aabf..05f301159 100644 --- a/designer-form/src/com/fr/design/designer/creator/XElementCase.java +++ b/designer-form/src/com/fr/design/designer/creator/XElementCase.java @@ -349,4 +349,12 @@ public class XElementCase extends XBorderStyleWidgetCreator implements FormEleme public boolean supportSetEnable(){ return false; } + + /** + * 是否支持共享-现只支持报表块、图表、tab块、绝对布局 + * @return + */ + public boolean isSupportShared() { + return true; + } } \ No newline at end of file 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 a397996a3..bd92dfe71 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; @@ -28,18 +30,18 @@ import java.beans.PropertyDescriptor; * 表单参数界面container */ public class XWParameterLayout extends XWAbsoluteLayout { - - public XWParameterLayout() { - this(new WParameterLayout(), new Dimension()); - } - - public XWParameterLayout(WParameterLayout widget) { - this(widget,new Dimension()); - } - public XWParameterLayout(WParameterLayout widget, Dimension initSize) { - super(widget, initSize); - } + public XWParameterLayout() { + this(new WParameterLayout(), new Dimension()); + } + + public XWParameterLayout(WParameterLayout widget) { + this(widget,new Dimension()); + } + + public XWParameterLayout(WParameterLayout widget, Dimension initSize) { + super(widget, initSize); + } /** * 初始化尺寸 @@ -74,11 +76,11 @@ public class XWParameterLayout extends XWAbsoluteLayout { return ArrayUtils.addAll(propertyTableEditor, getExtraTableEditor()); } - - @Override - public LayoutAdapter getLayoutAdapter() { - return new FRParameterLayoutAdapter(this); - } + + @Override + public LayoutAdapter getLayoutAdapter() { + return new FRParameterLayoutAdapter(this); + } /** * 获取插件给该控件提供的额外属性表 @@ -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"; @@ -237,4 +244,12 @@ public class XWParameterLayout extends XWAbsoluteLayout { return false; } + /** + * 是否支持共享-现只支持报表块、图表、tab块、绝对布局 + * @return + */ + public boolean isSupportShared() { + return false; + } + } \ No newline at end of file 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 000000000..6e642a635 --- /dev/null +++ b/designer-form/src/com/fr/design/designer/properties/mobile/ChartEditorPropertyUI.java @@ -0,0 +1,36 @@ +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.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.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 000000000..e9fc479fa --- /dev/null +++ b/designer-form/src/com/fr/design/designer/properties/mobile/ParaMobilePropertyUI.java @@ -0,0 +1,36 @@ +package com.fr.design.designer.properties.mobile; + +import com.fr.design.designer.creator.XCreator; +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.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/mainframe/CoverReportPane.java b/designer-form/src/com/fr/design/mainframe/CoverReportPane.java index a47403f0f..a6ec28abb 100644 --- a/designer-form/src/com/fr/design/mainframe/CoverReportPane.java +++ b/designer-form/src/com/fr/design/mainframe/CoverReportPane.java @@ -35,7 +35,7 @@ public class CoverReportPane extends CoverPane implements HelpDialogHandler{ private String helpMsg;//帮助信息(后续帮助信息可能会变成标配,就直接放这边了) - private ElementCaseHelpDialog helpDialog = null; + private WidgetHelpDialog helpDialog = null; public CoverReportPane() { this(StringUtils.EMPTY); @@ -62,7 +62,7 @@ public class CoverReportPane extends CoverPane implements HelpDialogHandler{ if (helpDialog == null) { // controlMode = IOUtils.readIcon(IconPathConstants.TD_EL_SHARE_CLOSE_ICON_PATH); controlButton.setVisible(false); - helpDialog = new ElementCaseHelpDialog(DesignerContext.getDesignerFrame(), helpMsg); + helpDialog = new WidgetHelpDialog(DesignerContext.getDesignerFrame(), helpMsg); double screenValue = FRScreen.getByDimension(Toolkit.getDefaultToolkit().getScreenSize()).getValue(); int offsetX = 0; if (screenValue < FormArea.DEFAULT_SLIDER) { diff --git a/designer-form/src/com/fr/design/mainframe/EditingMouseListener.java b/designer-form/src/com/fr/design/mainframe/EditingMouseListener.java index 1f94f3fa6..d53865f4b 100644 --- a/designer-form/src/com/fr/design/mainframe/EditingMouseListener.java +++ b/designer-form/src/com/fr/design/mainframe/EditingMouseListener.java @@ -1,6 +1,8 @@ package com.fr.design.mainframe; import com.fr.base.BaseUtils; +import com.fr.base.vcs.DesignerMode; +import com.fr.common.inputevent.InputEventBaseOnOS; import com.fr.design.designer.beans.AdapterBus; import com.fr.design.designer.beans.ComponentAdapter; import com.fr.design.designer.beans.events.DesignerEditor; @@ -9,13 +11,7 @@ import com.fr.design.designer.beans.location.Direction; import com.fr.design.designer.beans.location.Location; import com.fr.design.designer.beans.models.SelectionModel; import com.fr.design.designer.beans.models.StateModel; -import com.fr.design.designer.creator.XChartEditor; -import com.fr.design.designer.creator.XCreator; -import com.fr.design.designer.creator.XCreatorUtils; -import com.fr.design.designer.creator.XEditorHolder; -import com.fr.design.designer.creator.XElementCase; -import com.fr.design.designer.creator.XLayoutContainer; -import com.fr.design.designer.creator.XWFitLayout; +import com.fr.design.designer.creator.*; import com.fr.design.designer.creator.cardlayout.XCardSwitchButton; import com.fr.design.designer.creator.cardlayout.XWCardLayout; import com.fr.design.form.util.XCreatorConstants; @@ -27,18 +23,13 @@ import com.fr.design.utils.ComponentUtils; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.design.utils.gui.LayoutUtils; import com.fr.general.Inter; +import com.fr.share.ShareConstants; import com.fr.stable.Constants; -import javax.swing.BorderFactory; -import javax.swing.JComponent; -import javax.swing.JPopupMenu; -import javax.swing.JWindow; -import javax.swing.SwingUtilities; +import com.fr.stable.StringUtils; +import javax.swing.*; import javax.swing.event.MouseInputAdapter; -import java.awt.Color; -import java.awt.Container; -import java.awt.Cursor; -import java.awt.Rectangle; +import java.awt.*; import java.awt.event.MouseEvent; /** @@ -158,7 +149,7 @@ public class EditingMouseListener extends MouseInputAdapter { if (e.getButton() == MouseEvent.BUTTON1) { Direction dir = selectionModel.getDirectionAt(e); - if (!BaseUtils.isAuthorityEditing()) { + if (!DesignerMode.isAuthorityEditing()) { stateModel.setDirection(dir); } @@ -272,7 +263,7 @@ public class EditingMouseListener extends MouseInputAdapter { public void mouseMoved(MouseEvent e) { XCreator component = designer.getComponentAt(e); - setCoverPaneNotDisplay(e, false); + setCoverPaneNotDisplay(component, e, false); if (processTopLayoutMouseMove(component, e)) { return; @@ -297,7 +288,7 @@ public class EditingMouseListener extends MouseInputAdapter { if (designer.isDrawLineMode() && stateModel.getDirection() == Location.outer) { designer.updateDrawLineMode(e); } - if (!BaseUtils.isAuthorityEditing()) { + if (!DesignerMode.isAuthorityEditing()) { stateModel.setDirection(dir); } @@ -325,23 +316,42 @@ public class EditingMouseListener extends MouseInputAdapter { designer.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); } } - xElementCase.setHelpBtnOnFocus(false); - if (xElementCase.getCoverPane().getComponentCount() > 1) { - JComponent button1 = (JComponent) xElementCase.getCoverPane().getComponent(1); - int minX1 = button1.getX() + getParentPositionX(component, 0) - designer.getArea().getHorizontalValue(); - int minY1 = button1.getY() + getParentPositionY(component, 0) - designer.getArea().getVerticalValue(); - if (e.getX() + GAP - xElementCase.getInsets().left > minX1 && e.getX() - GAP - xElementCase.getInsets().left < minX1 + button1.getWidth()) { - if (e.getY() + GAP - xElementCase.getInsets().top > minY1 && e.getY() - GAP - xElementCase.getInsets().top < minY1 + button1.getHeight()) { + setHelpBtnFocus(e, xElementCase); + } + + private void setHelpBtnFocus(MouseEvent e, XCreator component) { + component.setHelpBtnOnFocus(false); + if (component.getCoverPane() != null) { + if (component.getCoverPane().getComponentCount() > 1) { + JComponent button1 = (JComponent) component.getCoverPane().getComponent(1); + int minX1 = button1.getX() + getParentPositionX(component, 0) - designer.getArea().getHorizontalValue(); + int minY1 = button1.getY() + getParentPositionY(component, 0) - designer.getArea().getVerticalValue(); + if (e.getX() + GAP - component.getInsets().left > minX1 && e.getX() - GAP - component.getInsets().left < minX1 + button1.getWidth()) { + if (e.getY() + GAP - component.getInsets().top > minY1 && e.getY() - GAP - component.getInsets().top < minY1 + button1.getHeight()) { + designer.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); + component.setHelpBtnOnFocus(true); + } + } + } + component.displayCoverPane(true); + component.setDirections(Direction.TOP_BOTTOM_LEFT_RIGHT); + } else { + //没有帮助信息时,不显示帮助图标 + if (StringUtils.isEmpty(component.toData().getDescription())) { + return; + } + int minX1 = getParentPositionX(component, component.getX()) + component.getWidth() - ShareConstants.SHARE_EL_CONTROL_BUTTON_HW - designer.getArea().getHorizontalValue(); + int minY1 = getParentPositionY(component, component.getY()) - designer.getArea().getVerticalValue(); + if (e.getX() + GAP - component.getInsets().left > minX1 && e.getX() - GAP - component.getInsets().left < minX1 + ShareConstants.SHARE_EL_CONTROL_BUTTON_HW) { + if (e.getY() + GAP - component.getInsets().top > minY1 && e.getY() - GAP - component.getInsets().top < minY1 + ShareConstants.SHARE_EL_CONTROL_BUTTON_HW) { designer.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); - xElementCase.setHelpBtnOnFocus(true); + component.setHelpBtnOnFocus(true); } } } - xElementCase.displayCoverPane(true); - xElementCase.setDirections(Direction.TOP_BOTTOM_LEFT_RIGHT); } - private void setCoverPaneNotDisplay(MouseEvent e, boolean isLinkedHelpDialog) { + private void setCoverPaneNotDisplay(XCreator component, MouseEvent e, boolean isLinkedHelpDialog) { if (xElementCase != null) { int x = getParentPositionX(xElementCase, 0) - designer.getArea().getHorizontalValue(); int y = getParentPositionY(xElementCase, 0) - designer.getArea().getVerticalValue(); @@ -349,15 +359,16 @@ public class EditingMouseListener extends MouseInputAdapter { if (rect.contains(e.getPoint())) { return; } - if (isLinkedHelpDialog) { - xElementCase.destroyHelpDialog(); - } + xElementCase.displayCoverPane(false); } if (xChartEditor != null) { xChartEditor.displayCoverPane(false); } - + if (isLinkedHelpDialog) { + component.destroyHelpDialog(); + } + component.displayCoverPane(false); if (xTopLayoutContainer != null) { xTopLayoutContainer.setMouseEnter(false); } @@ -383,6 +394,7 @@ public class EditingMouseListener extends MouseInputAdapter { designer.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); } } + setHelpBtnFocus(e, xTopLayoutContainer); return true; } } @@ -403,8 +415,7 @@ public class EditingMouseListener extends MouseInputAdapter { designer.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); } } - xChartEditor.displayCoverPane(true); - xChartEditor.setDirections(Direction.TOP_BOTTOM_LEFT_RIGHT); + setHelpBtnFocus(e, xChartEditor); designer.repaint(); } } @@ -425,9 +436,12 @@ public class EditingMouseListener extends MouseInputAdapter { * @param e 鼠标事件 */ public void mouseDragged(MouseEvent e) { - if (BaseUtils.isAuthorityEditing()) { + if (DesignerMode.isAuthorityEditing()) { return; } + if ((e.isShiftDown() || InputEventBaseOnOS.isControlDown(e)) && !stateModel.isSelecting()) { + stateModel.startSelecting(e); + } // 如果当前是左键拖拽状态,拖拽组件 if (stateModel.dragable()) { if (SwingUtilities.isRightMouseButton(e)) { @@ -571,12 +585,9 @@ public class EditingMouseListener extends MouseInputAdapter { * @param e 鼠标事件 */ public void mouseExited(MouseEvent e) { - if (designer.getCursor().getType() != Cursor.DEFAULT_CURSOR) { + if (designer.getCursor().getType() != Cursor.DEFAULT_CURSOR && !(e.isShiftDown() || InputEventBaseOnOS.isControlDown(e))) { designer.setCursor(Cursor.getDefaultCursor()); } - - setCoverPaneNotDisplay(e, true); - cancelPromptWidgetForbidEnter(); } diff --git a/designer-form/src/com/fr/design/mainframe/FormEditorKeyListener.java b/designer-form/src/com/fr/design/mainframe/FormEditorKeyListener.java index 24d067d70..81f3d6efc 100644 --- a/designer-form/src/com/fr/design/mainframe/FormEditorKeyListener.java +++ b/designer-form/src/com/fr/design/mainframe/FormEditorKeyListener.java @@ -1,5 +1,10 @@ package com.fr.design.mainframe; +import com.fr.base.BaseUtils; +import com.fr.common.inputevent.InputEventBaseOnOS; +import java.awt.Cursor; +import java.awt.Point; +import java.awt.Toolkit; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; @@ -10,6 +15,9 @@ import com.fr.design.designer.creator.XLayoutContainer; import com.fr.design.designer.creator.XWAbsoluteLayout; public class FormEditorKeyListener extends KeyAdapter{ + private static final Cursor ADDCURSOR = Toolkit.getDefaultToolkit().createCustomCursor( + BaseUtils.readImage("/com/fr/design/images/form/designer/cursor/add.png"), new Point(0, 0), + "addCursor"); private FormDesigner designer; private boolean moved; @@ -19,6 +27,9 @@ public class FormEditorKeyListener extends KeyAdapter{ @Override public void keyPressed(KeyEvent e) { + if(e.isShiftDown() || InputEventBaseOnOS.isControlDown(e)) { + designer.setCursor(ADDCURSOR); + } int code = e.getKeyCode(); XCreator creator = designer.getSelectionModel().getSelection().getSelectedCreator(); XLayoutContainer container; @@ -26,26 +37,29 @@ public class FormEditorKeyListener extends KeyAdapter{ return; } moved = true; - + switch (code) { - case KeyEvent.VK_LEFT: - designer.getSelectionModel().move(-1, 0); - break; - case KeyEvent.VK_RIGHT: - designer.getSelectionModel().move(1, 0); - break; - case KeyEvent.VK_UP: - designer.getSelectionModel().move(0, -1); - break; - case KeyEvent.VK_DOWN: - designer.getSelectionModel().move(0, 1); - break; - default: - moved = false; + case KeyEvent.VK_LEFT: + designer.getSelectionModel().move(-1, 0); + break; + case KeyEvent.VK_RIGHT: + designer.getSelectionModel().move(1, 0); + break; + case KeyEvent.VK_UP: + designer.getSelectionModel().move(0, -1); + break; + case KeyEvent.VK_DOWN: + designer.getSelectionModel().move(0, 1); + break; + default: + moved = false; } } - + public void keyReleased(KeyEvent e) { + if(!(e.isShiftDown() || InputEventBaseOnOS.isControlDown(e))) { + designer.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + } if (moved) { designer.getEditListenerTable().fireCreatorModified( designer.getSelectionModel().getSelection().getSelectedCreator(), DesignerEvent.CREATOR_RESIZED); 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 000000000..40af6f34b --- /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,代表控件 + 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/widget/ui/designer/mobile/BodyMobileDefinePane.java b/designer-form/src/com/fr/design/widget/ui/designer/mobile/BodyMobileDefinePane.java new file mode 100644 index 000000000..394a59791 --- /dev/null +++ b/designer-form/src/com/fr/design/widget/ui/designer/mobile/BodyMobileDefinePane.java @@ -0,0 +1,124 @@ +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.BorderFactory; +import javax.swing.JPanel; +import java.awt.BorderLayout; +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 000000000..fe299bfaa --- /dev/null +++ b/designer-form/src/com/fr/design/widget/ui/designer/mobile/ChartEditorDefinePane.java @@ -0,0 +1,196 @@ +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.fun.FunctionProcessor; + +import javax.swing.BorderFactory; +import javax.swing.JPanel; +import javax.swing.SwingConstants; +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Component; +import java.awt.Container; +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)); + updateTipLabel(); + + // 数据 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/MultiFileUploaderDefinePane.java b/designer-form/src/com/fr/design/widget/ui/designer/mobile/MultiFileUploaderDefinePane.java new file mode 100644 index 000000000..bdf206898 --- /dev/null +++ b/designer-form/src/com/fr/design/widget/ui/designer/mobile/MultiFileUploaderDefinePane.java @@ -0,0 +1,110 @@ +package com.fr.design.widget.ui.designer.mobile; + +import com.fr.base.mobile.FileUploadModeState; +import com.fr.base.mobile.MultiFileUploaderMobileAttr; +import com.fr.design.constants.LayoutConstants; +import com.fr.design.designer.creator.XCreator; +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.form.ui.MultiFileEditor; +import com.fr.general.Inter; + +import javax.swing.BorderFactory; +import javax.swing.JPanel; +import javax.swing.SwingConstants; +import java.awt.BorderLayout; +import java.awt.Component; + +/** + * Created by plough on 2018/4/19. + */ +public class MultiFileUploaderDefinePane extends MobileWidgetDefinePane { + private static final Item[] ITEMS = { + new Item(Inter.getLocText("FR-Designer_Take_Photos_And_Choose_From_Album"), FileUploadModeState.TAKE_PHOTOS_AND_CHOOSE_FROM_ALBUM), + new Item(Inter.getLocText("FR-Designer_Only_Take_Photos"), FileUploadModeState.ONLY_TAKE_PHOTOS) + }; + + private XCreator xCreator; // 当前选中控件的xCreator + private UIComboBox uploadModeComboBox;// 上传方式下拉框 + + public MultiFileUploaderDefinePane(XCreator xCreator) { + this.xCreator = xCreator; + } + + @Override + public void initPropertyGroups(Object source) { + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + JPanel mobileSettingsPane; + mobileSettingsPane = getMobileSettingsPane(); + + this.add(mobileSettingsPane, BorderLayout.NORTH); + this.repaint(); + } + + private UIExpandablePane getMobileSettingsPane() { + initUploadModeComboBox(); + + // 以后可能会扩展,还是用 TableLayout 吧 + Component[][] components = new Component[][]{ + new Component[] {new UILabel(Inter.getLocText("FR-Designer_Upload_Mode"), SwingConstants.LEFT), uploadModeComboBox} + }; + + double f = TableLayout.FILL; + double p = TableLayout.PREFERRED; + double[] rowSize = {p}; + double[] columnSize = {p,f}; + int[][] rowCount = {{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_Terminal"), 280, 20, panelWrapper); + } + + private void initUploadModeComboBox() { + this.uploadModeComboBox = new UIComboBox(ITEMS); + } + + private void bindListeners2Widgets() { + reInitAllListeners(); + AttributeChangeListener changeListener = new AttributeChangeListener() { + @Override + public void attributeChange() { + update(); + } + }; + this.addAttributeChangeListener(changeListener); + } + + /** + * 后台初始化所有事件. + */ + private void reInitAllListeners() { + initListener(this); + } + + @Override + public void populate(FormDesigner designer) { + MultiFileUploaderMobileAttr mobileAttr = ((MultiFileEditor)xCreator.toData()).getMobileAttr(); + FileUploadModeState fileUploadModeState = mobileAttr.getFileUploadModeState(); + uploadModeComboBox.setSelectedIndex(fileUploadModeState.getState()); + // 数据 populate 完成后,再设置监听 + this.bindListeners2Widgets(); + } + + @Override + public void update() { + MultiFileUploaderMobileAttr mobileAttr = ((MultiFileEditor)xCreator.toData()).getMobileAttr(); + mobileAttr.setFileUploadModeState((FileUploadModeState) ((Item)uploadModeComboBox.getSelectedItem()).getValue()); + DesignerContext.getDesignerFrame().getSelectedJTemplate().fireTargetModified(); // 触发设计器保存按钮亮起来 + } +} 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 000000000..a6910391c --- /dev/null +++ b/designer-form/src/com/fr/design/widget/ui/designer/mobile/ParaMobileDefinePane.java @@ -0,0 +1,81 @@ +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.BorderFactory; +import javax.swing.JPanel; +import java.awt.BorderLayout; + +/** + * 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); + } +} diff --git a/designer-realize/src/com/fr/design/actions/report/ReportMobileAttrAction.java b/designer-realize/src/com/fr/design/actions/report/ReportMobileAttrAction.java index 3813af30c..f6acfb251 100644 --- a/designer-realize/src/com/fr/design/actions/report/ReportMobileAttrAction.java +++ b/designer-realize/src/com/fr/design/actions/report/ReportMobileAttrAction.java @@ -1,5 +1,6 @@ package com.fr.design.actions.report; +import com.fr.base.iofileattr.MobileOnlyTemplateAttrMark; import com.fr.design.actions.JWorkBookAction; import com.fr.design.dialog.BasicDialog; import com.fr.design.dialog.DialogActionAdapter; @@ -7,6 +8,7 @@ import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.JWorkBook; import com.fr.design.menu.MenuKeySet; import com.fr.design.report.mobile.ReportMobileAttrPane; +import com.fr.file.FILE; import com.fr.general.IOUtils; import com.fr.general.Inter; import com.fr.main.TemplateWorkBook; @@ -53,14 +55,26 @@ public class ReportMobileAttrAction extends JWorkBookAction{ @Override public void doOk() { 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); + if (elementCaseMobileAttr.isMobileCanvasSize() && wbTpl.getAttrMark(MobileOnlyTemplateAttrMark.XML_TAG) == null) { + // 如果是老模板,选择手机专属之后需要另存为 + FILE editingFILE = jwb.getEditingFILE(); + if (editingFILE != null && editingFILE.exists()) { + String fileName = editingFILE.getName().substring(0, editingFILE.getName().length() - jwb.suffix().length()) + "_mobile"; + if (!jwb.saveAsTemplate(true, fileName)) { + return; // 不激活保存按钮 + } } + // 放到后面。如果提前 return 了,则仍然处于未设置状态,不要添加 + wbTpl.addAttrMark(new MobileOnlyTemplateAttrMark()); + } + // 记录功能点 + FunctionProcessor processor = ExtraClassManager.getInstance().getFunctionProcessor(); + if (processor != null) { + processor.recordFunction(ReportFunctionProcessor.MOBILE_TEMPLATE_CPT); } + // 设置移动端属性并刷新界面 + wbTpl.setReportMobileAttr(elementCaseMobileAttr); // 会同时修改页面设置,放到最后 + jwb.fireTargetModified(); } }); dialog.setVisible(true); diff --git a/designer-realize/src/com/fr/design/mainframe/CellWidgetPropertyPane.java b/designer-realize/src/com/fr/design/mainframe/CellWidgetPropertyPane.java index 9d311c310..2da57a7a7 100644 --- a/designer-realize/src/com/fr/design/mainframe/CellWidgetPropertyPane.java +++ b/designer-realize/src/com/fr/design/mainframe/CellWidgetPropertyPane.java @@ -107,17 +107,22 @@ public class CellWidgetPropertyPane extends BasicPane { } final CellSelection finalCS = (CellSelection) ePane.getSelection(); final TemplateElementCase tplEC = ePane.getEditingElementCase(); + final Widget cellWidget = cellEditorDefPane.update(); if(finalCS.isSelectedOneCell(ePane)){ if(tplEC.getTemplateCellElement(cellElement.getColumn(), cellElement.getRow())== null){//cellElement未加入到report中时要添加进去 tplEC.addCellElement(cellElement); } - setCellWidget(cellElement); + setCellWidget(cellWidget, cellElement); }else{ ReportActionUtils.actionIterateWithCellSelection(finalCS, tplEC, new ReportActionUtils.IterAction() { public void dealWith(CellElement editCellElement) { // p:最后把这个cellEditorDef设置到CellGUIAttr. TemplateCellElement templateCellElement = (TemplateCellElement) editCellElement; - setCellWidget(templateCellElement); + try { + setCellWidget((Widget)cellWidget.clone(), templateCellElement); + } catch (CloneNotSupportedException e) { + FRContext.getLogger().error("InternalError: " + e.getMessage()); + } } }); } @@ -126,8 +131,7 @@ public class CellWidgetPropertyPane extends BasicPane { } } - private void setCellWidget(TemplateCellElement cellElement){ - Widget cellWidget = cellEditorDefPane.update(); + private void setCellWidget(Widget cellWidget, TemplateCellElement cellElement){ if (cellWidget instanceof NoneWidget) { cellElement.setWidget(null); } else { diff --git a/designer-realize/src/com/fr/design/webattr/EditToolBar.java b/designer-realize/src/com/fr/design/webattr/EditToolBar.java index 2c2852d9e..978d96db6 100644 --- a/designer-realize/src/com/fr/design/webattr/EditToolBar.java +++ b/designer-realize/src/com/fr/design/webattr/EditToolBar.java @@ -31,19 +31,31 @@ import com.fr.form.ui.WidgetInfoConfig; import com.fr.general.Background; import com.fr.general.Inter; import com.fr.report.web.button.Export; -import com.fr.report.web.button.PDFPrint; -import com.fr.report.web.button.Print; import com.fr.report.web.button.write.AppendColumnRow; import com.fr.report.web.button.write.Submit; import com.fr.stable.ArrayUtils; import com.fr.stable.StringUtils; -import javax.swing.*; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; +import javax.swing.BorderFactory; +import javax.swing.Box; +import javax.swing.DefaultListCellRenderer; +import javax.swing.DefaultListModel; +import javax.swing.ImageIcon; +import javax.swing.JList; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JSplitPane; +import javax.swing.ListCellRenderer; +import javax.swing.SpinnerNumberModel; +import javax.swing.SwingUtilities; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; -import java.awt.*; +import java.awt.BorderLayout; +import java.awt.CardLayout; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.Image; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; @@ -320,7 +332,8 @@ public class EditToolBar extends BasicPane { private CardLayout card; private JPanel centerPane; private UICheckBox icon, text, pdf, excelP, excelO, excelS, image, word, - flashPrint, pdfPrint, appletPrint, serverPrint, isPopup, isVerify, failSubmit, isCurSheet; + isPopup, isVerify, failSubmit, isCurSheet, excelImClean, + excelImCover, excelImAppend, excelImCust; private UIBasicSpinner count; private Widget widget; private UITextField nameField; @@ -381,9 +394,7 @@ public class EditToolBar extends BasicPane { centerPane.setLayout(card); centerPane.add("custom", getCustomPane()); centerPane.add("export", getExport()); - centerPane.add("print", getPrint()); centerPane.add("none", none); - centerPane.add("pdfprint", getPdfPrintSetting()); // centerPane.add("editexcel", editExcel); centerPane.add(getCpane(), "appendcount"); centerPane.add(getSubmitPane(), "submit"); @@ -435,22 +446,6 @@ public class EditToolBar extends BasicPane { return export; } - private JPanel getPrint() { - JPanel print = FRGUIPaneFactory.createY_AXISBoxInnerContainer_L_Pane(); - // print.setLayout(new BoxLayout(print, BoxLayout.Y_AXIS)); - flashPrint = new UICheckBox(Inter.getLocText("FR-Designer_Flash_Print")); - pdfPrint = new UICheckBox(Inter.getLocText("FR-Designer_PDF_Print")); - appletPrint = new UICheckBox(Inter.getLocText("FR-Designer_Applet_Print")); - serverPrint = new UICheckBox(Inter.getLocText("FR-Designer_Server_Print")); - print.add(flashPrint); - print.add(pdfPrint); - print.add(appletPrint); - print.add(serverPrint); - print.setBorder(BorderFactory.createTitledBorder(Inter.getLocText(new String[]{"Form-Button", "Property", "Set"}))); - return print; - } - - private JPanel getCpane() { JPanel appendCountPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_S_Pane(); count = new UIBasicSpinner(new SpinnerNumberModel(1, 0, Integer.MAX_VALUE, 1)); @@ -463,16 +458,6 @@ public class EditToolBar extends BasicPane { } - private JPanel getPdfPrintSetting() { - // richer:pdf打印按钮设置 - JPanel pdfPrintSetting = FRGUIPaneFactory.createY_AXISBoxInnerContainer_S_Pane(); - isPopup = new UICheckBox(Inter.getLocText("PDF-Print_isPopup")); - pdfPrintSetting.add(isPopup); - pdfPrintSetting.setBorder(BorderFactory.createTitledBorder(Inter.getLocText("PDF-Print_Setting"))); - return pdfPrintSetting; - } - - private JPanel getSubmitPane() { isVerify = new UICheckBox(Inter.getLocText("Verify-Data_Verify")); failSubmit = new UICheckBox(Inter.getLocText(new String[]{"Verify_Fail", "Still", "Submit"})); @@ -523,10 +508,6 @@ public class EditToolBar extends BasicPane { } if (widget instanceof Export) { populateExport(); - } else if (widget instanceof Print) { - populatePrint(); - } else if (widget instanceof PDFPrint) { - populatePDFPrint(); } else if (widget instanceof AppendColumnRow) { populateAppendColumnRow(); } else if (widget instanceof Submit) { @@ -581,21 +562,6 @@ public class EditToolBar extends BasicPane { this.isCurSheet.setSelected(submit.isOnlySubmitSelect()); } - private void populatePDFPrint(){ - card.show(centerPane, "pdfprint"); - PDFPrint pdfPrint = (PDFPrint) widget; - this.isPopup.setSelected(pdfPrint.isPopup()); - } - - private void populatePrint(){ - card.show(centerPane, "print"); - Print print = (Print) widget; - this.pdfPrint.setSelected(print.isPDFPrint()); - this.appletPrint.setSelected(print.isAppletPrint()); - this.flashPrint.setSelected(print.isFlashPrint()); - this.serverPrint.setSelected(print.isServerPrint()); - } - private void populateDefault(){ Button button = (Button) widget; this.icon.setSelected(button.isShowIcon()); @@ -612,11 +578,6 @@ public class EditToolBar extends BasicPane { public Widget update() { if (widget instanceof Export) { updateExport(); - } else if (widget instanceof Print) { - updatePrint(); - } else if (widget instanceof PDFPrint) { - PDFPrint pdfPrint = (PDFPrint) widget; - pdfPrint.setPopup(this.isPopup.isSelected()); } else if (widget instanceof AppendColumnRow) { ((AppendColumnRow) widget).setCount(((Integer) count.getValue()).intValue()); } else if (widget instanceof Submit) { @@ -650,14 +611,6 @@ public class EditToolBar extends BasicPane { submit.setOnlySubmitSelect(this.isCurSheet.isSelected()); } - private void updatePrint(){ - Print print = (Print) widget; - print.setAppletPrint(this.appletPrint.isSelected()); - print.setFlashPrint(this.flashPrint.isSelected()); - print.setPDFPrint(this.pdfPrint.isSelected()); - print.setServerPrint(this.serverPrint.isSelected()); - } - private void updateExport(){ Export export = (Export) widget; export.setPdfAvailable(this.pdf.isSelected()); diff --git a/designer-realize/src/com/fr/design/webattr/ToolBarPane.java b/designer-realize/src/com/fr/design/webattr/ToolBarPane.java index ebb3a696e..872b17008 100644 --- a/designer-realize/src/com/fr/design/webattr/ToolBarPane.java +++ b/designer-realize/src/com/fr/design/webattr/ToolBarPane.java @@ -7,9 +7,14 @@ import com.fr.design.gui.core.WidgetOption; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.form.ui.ToolBar; import com.fr.form.ui.Widget; - -import javax.swing.*; -import java.awt.*; +import com.fr.general.Inter; +import com.fr.report.web.annotation.OldPrintMethod; + +import javax.swing.BorderFactory; +import javax.swing.JOptionPane; +import javax.swing.SwingUtilities; +import javax.swing.TransferHandler; +import java.awt.Component; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.UnsupportedFlavorException; import java.awt.event.MouseAdapter; @@ -19,6 +24,7 @@ import java.util.List; public class ToolBarPane extends BasicBeanPane { private FToolBar ftoolbar = new FToolBar(); + private boolean populateFinished = false; // 正在 populate 数据 public ToolBarPane() { super(); @@ -26,11 +32,11 @@ public class ToolBarPane extends BasicBeanPane { } - /** - * 添加鼠标监听 - * - * @param mouselistener 鼠标监听 - */ + /** + * 添加鼠标监听 + * + * @param mouselistener 鼠标监听 + */ public void addAuthorityListener(MouseListener mouselistener) { List list = ftoolbar.getButtonlist(); for (int i = 0; i < list.size(); i++) { @@ -44,9 +50,9 @@ public class ToolBarPane extends BasicBeanPane { this.add(button); } - /** - * 初始化组件 - */ + /** + * 初始化组件 + */ public void initComponent() { this.addMouseListener(listener); this.setLayout(FRGUIPaneFactory.createBoxFlowLayout()); @@ -54,9 +60,9 @@ public class ToolBarPane extends BasicBeanPane { this.setBorder(BorderFactory.createTitledBorder("")); } - /** - * 删除鼠标事件 - */ + /** + * 删除鼠标事件 + */ public void removeDefaultMouseListener() { this.removeMouseListener(listener); } @@ -70,15 +76,19 @@ public class ToolBarPane extends BasicBeanPane { this.ftoolbar.addButton(button); } - /** - * 添加组件 - * - * @param comp 组件 - * - * @return 被添加的组件 - */ + /** + * 添加组件 + * + * @param comp 组件 + * + * @return 被添加的组件 + */ public Component add(Component comp) { if (comp instanceof ToolBarButton) { + if (isPopulateFinished() && ((ToolBarButton) comp).getWidget().getClass().isAnnotationPresent(OldPrintMethod.class)) { + JOptionPane.showMessageDialog(SwingUtilities.getWindowAncestor(this), Inter.getLocText("FR-Designer_Use_New_Print_Tip")); + return comp; + } this.ftoolbar.addButton((ToolBarButton) comp); } return super.add(comp); @@ -128,15 +138,16 @@ public class ToolBarPane extends BasicBeanPane { @Override public void populateBean(ToolBar toolbar) { + setPopulateFinished(false); this.removeAll(); this.getFToolBar().clearButton(); for (int j = 0; j < toolbar.getWidgetSize(); j++) { Widget widget = toolbar.getWidget(j); WidgetOption no = WidgetOption.getToolBarButton(widget.getClass()); - if (no == null){ - //如果装了什么插件, 放到了工具栏上, 后来删除了插件, 模板里还存着之前的控件 - continue; - } + if (no == null){ + //如果装了什么插件, 放到了工具栏上, 后来删除了插件, 模板里还存着之前的控件 + continue; + } ToolBarButton button = new ToolBarButton(no.optionIcon(), widget); button.setNameOption(no); @@ -146,6 +157,7 @@ public class ToolBarPane extends BasicBeanPane { } this.getFToolBar().setBackground(toolbar.getBackground()); this.getFToolBar().setDefault(toolbar.isDefault()); + setPopulateFinished(true); } @Override @@ -171,6 +183,14 @@ public class ToolBarPane extends BasicBeanPane { } }; + private boolean isPopulateFinished() { + return populateFinished; + } + + private void setPopulateFinished(boolean populateFinished) { + this.populateFinished = populateFinished; + } + /* * 拖拽属性设置 diff --git a/designer-realize/src/com/fr/design/widget/CellWidgetCardPane.java b/designer-realize/src/com/fr/design/widget/CellWidgetCardPane.java index 77d1542cb..c590a84b2 100644 --- a/designer-realize/src/com/fr/design/widget/CellWidgetCardPane.java +++ b/designer-realize/src/com/fr/design/widget/CellWidgetCardPane.java @@ -9,13 +9,16 @@ import com.fr.design.foldablepane.UIExpandablePane; import com.fr.design.gui.ibutton.UIHeadGroup; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.mainframe.ElementCasePane; +import com.fr.design.widget.mobile.WidgetMobilePane; import com.fr.design.widget.ui.BasicWidgetPropertySettingPane; import com.fr.form.event.Listener; import com.fr.form.ui.Widget; import com.fr.general.Inter; -import javax.swing.*; -import java.awt.*; +import javax.swing.BorderFactory; +import javax.swing.JPanel; +import java.awt.BorderLayout; +import java.awt.CardLayout; import java.util.ArrayList; /* @@ -24,6 +27,8 @@ import java.util.ArrayList; public class CellWidgetCardPane extends BasicPane { //当前的编辑器属性定义面板 private DataModify currentEditorDefinePane; + //当前的编辑器移动端面板 + private WidgetMobilePane currentWidgetMobilePane; //属性配置切换面板 private ArrayList paneList; private JPanel center; @@ -40,6 +45,11 @@ public class CellWidgetCardPane extends BasicPane { private JPanel eventTabPane; private WidgetEventPane eventPane; + //移动端属性容器 + private JPanel mobileTabPane; + private JPanel mobileCardPane; + private CardLayout mobileCardLayout; + private ElementCasePane pane; public CellWidgetCardPane(ElementCasePane pane) { @@ -51,27 +61,45 @@ public class CellWidgetCardPane extends BasicPane { this.removeAll(); this.setLayout(FRGUIPaneFactory.createBorderLayout()); - //k tabbedPane = new CardLayout(); center = new JPanel(tabbedPane); this.add(center, BorderLayout.CENTER); + + // 属性 attriTabPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - eventTabPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - eventTabPane.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 10)); - initPaneList(); - eventPane = initWidgetEventPane(pane); - eventTabPane.add(eventPane, BorderLayout.CENTER); - //k BasicScrollPane basicScrollPane = new AttrScrollPane() { @Override protected JPanel createContentPane() { return attriTabPane; } }; + widgetPropertyPane = new BasicWidgetPropertySettingPane(); + UIExpandablePane uiExpandablePane = new UIExpandablePane(Inter.getLocText("FR-Designer_Basic"), 280, 24, widgetPropertyPane); + attriTabPane.setBorder(BorderFactory.createEmptyBorder(10, 10, 0, 10)); + attriTabPane.add(uiExpandablePane, BorderLayout.NORTH); + attriCardPane = FRGUIPaneFactory.createCardLayout_S_Pane(); + attriTabPane.add(attriCardPane, BorderLayout.CENTER); + attriCardLayout = (CardLayout) attriCardPane.getLayout(); + + // 事件 + eventTabPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + eventTabPane.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 10)); + eventPane = initWidgetEventPane(pane); + eventTabPane.add(eventPane, BorderLayout.CENTER); + + // 移动端 + mobileTabPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + mobileCardPane = FRGUIPaneFactory.createCardLayout_S_Pane(); + mobileTabPane.add(mobileCardPane, BorderLayout.CENTER); + mobileCardLayout = (CardLayout) mobileCardPane.getLayout(); + center.add(basicScrollPane, Inter.getLocText("FR-Designer_Attribute")); center.add(eventTabPane, Inter.getLocText("FR-Designer_Event")); - final String[] tabTitles = new String[]{Inter.getLocText("FR-Designer_Attribute"), Inter.getLocText("FR-Designer_Event")}; + center.add(mobileTabPane, Inter.getLocText("FR-Widget_Mobile_Terminal")); + initPaneList(); + + final String[] tabTitles = new String[]{Inter.getLocText("FR-Designer_Attribute"), Inter.getLocText("FR-Designer_Event"), Inter.getLocText("FR-Widget_Mobile_Terminal")}; tabsHeaderIconPane = new UIHeadGroup(tabTitles) { @Override public void tabChanged(int index) { @@ -81,24 +109,13 @@ public class CellWidgetCardPane extends BasicPane { tabsHeaderIconPane.setNeedLeftRightOutLine(true); tabsHeaderIconPane.setBorder(BorderFactory.createMatteBorder(1, 0, 0, 0, UIConstants.SHADOW_GREY)); this.add(tabsHeaderIconPane, BorderLayout.NORTH); - - widgetPropertyPane = new BasicWidgetPropertySettingPane(); - - UIExpandablePane uiExpandablePane = new UIExpandablePane(Inter.getLocText("FR-Designer_Basic"), 280, 24, widgetPropertyPane); - - - attriTabPane.setBorder(BorderFactory.createEmptyBorder(10, 10, 0, 10)); - attriTabPane.add(uiExpandablePane, BorderLayout.NORTH); - - attriCardPane = FRGUIPaneFactory.createCardLayout_S_Pane(); - attriTabPane.add(attriCardPane, BorderLayout.CENTER); - attriCardLayout = (CardLayout) attriCardPane.getLayout(); } private void initPaneList() { paneList = new ArrayList(); paneList.add(attriTabPane); paneList.add(eventPane); + paneList.add(mobileTabPane); } protected WidgetEventPane initWidgetEventPane(ElementCasePane pane){ @@ -112,7 +129,6 @@ public class CellWidgetCardPane extends BasicPane { public void populate(Widget cellWidget) { initComponents(pane); - currentEditorDefinePane = null; WidgetDefinePaneFactory.RN rn = WidgetDefinePaneFactory.createWidgetDefinePane(cellWidget, new Operator() { @Override @@ -123,9 +139,17 @@ public class CellWidgetCardPane extends BasicPane { DataModify definePane = rn.getDefinePane(); attriCardPane.add(definePane.toSwingComponent(), rn.getCardName()); attriCardLayout.show(attriCardPane, rn.getCardName()); + widgetPropertyPane.populate(cellWidget); currentEditorDefinePane = definePane; + eventPane.populate(cellWidget); - widgetPropertyPane.populate(cellWidget); + + WidgetMobilePane mobilePane = WidgetMobilePaneFactory.createWidgetMobilePane(cellWidget); + mobileCardPane.add(mobilePane, mobilePane.getClass().toString()); + mobileCardLayout.show(mobileCardPane, mobilePane.getClass().toString()); + currentWidgetMobilePane = mobilePane; + + tabsHeaderIconPane.setSelectedIndex(0); } @@ -145,6 +169,8 @@ public class CellWidgetCardPane extends BasicPane { widget.addListener(l); } + currentWidgetMobilePane.update(widget); + return widget; } diff --git a/designer-realize/src/com/fr/design/widget/WidgetMobilePaneFactory.java b/designer-realize/src/com/fr/design/widget/WidgetMobilePaneFactory.java new file mode 100644 index 000000000..8b9afc3f2 --- /dev/null +++ b/designer-realize/src/com/fr/design/widget/WidgetMobilePaneFactory.java @@ -0,0 +1,39 @@ +package com.fr.design.widget; + +import com.fr.base.FRContext; +import com.fr.design.ExtraDesignClassManager; +import com.fr.design.widget.mobile.WidgetMobilePane; +import com.fr.design.widget.ui.mobile.MultiFileEditorMobilePane; +import com.fr.form.ui.MultiFileEditor; +import com.fr.form.ui.Widget; + +import java.util.HashMap; +import java.util.Map; + +/** + * Created by plough on 2018/4/25. + */ +public class WidgetMobilePaneFactory { + private static Map, Class> mobilePaneMap = new HashMap<>(); + + static { + mobilePaneMap.put(MultiFileEditor.class, MultiFileEditorMobilePane.class); + mobilePaneMap.putAll(ExtraDesignClassManager.getInstance().getCellWidgetMobileOptionsMap()); + } + + private WidgetMobilePaneFactory() { + } + + public static WidgetMobilePane createWidgetMobilePane(Widget widget) { + WidgetMobilePane mobilePane = WidgetMobilePane.DEFAULT_PANE; + try { + if (mobilePaneMap.containsKey(widget.getClass())) { + mobilePane = mobilePaneMap.get(widget.getClass()).newInstance(); + mobilePane.populate(widget); + } + } catch (Exception e) { + FRContext.getLogger().error(e.getMessage(), e); + } + return mobilePane; + } +} diff --git a/designer-realize/src/com/fr/design/widget/ui/mobile/MultiFileEditorMobilePane.java b/designer-realize/src/com/fr/design/widget/ui/mobile/MultiFileEditorMobilePane.java new file mode 100644 index 000000000..e88e0c05e --- /dev/null +++ b/designer-realize/src/com/fr/design/widget/ui/mobile/MultiFileEditorMobilePane.java @@ -0,0 +1,84 @@ +package com.fr.design.widget.ui.mobile; + +import com.fr.base.mobile.FileUploadModeState; +import com.fr.base.mobile.MultiFileUploaderMobileAttr; +import com.fr.design.constants.LayoutConstants; +import com.fr.design.designer.properties.items.Item; +import com.fr.design.foldablepane.UIExpandablePane; +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.widget.mobile.WidgetMobilePane; +import com.fr.form.ui.MultiFileEditor; +import com.fr.form.ui.Widget; +import com.fr.general.Inter; + +import javax.swing.BorderFactory; +import javax.swing.JPanel; +import javax.swing.SwingConstants; +import java.awt.BorderLayout; +import java.awt.Component; + +/** + * Created by plough on 2018/4/25. + */ +public class MultiFileEditorMobilePane extends WidgetMobilePane { + private static final Item[] ITEMS = { + new Item(Inter.getLocText("FR-Designer_Take_Photos_And_Choose_From_Album"), FileUploadModeState.TAKE_PHOTOS_AND_CHOOSE_FROM_ALBUM), + new Item(Inter.getLocText("FR-Designer_Only_Take_Photos"), FileUploadModeState.ONLY_TAKE_PHOTOS) + }; + + private UIComboBox uploadModeComboBox;// 上传方式下拉框 + + protected void init() { + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + this.add(getMobileSettingsPane(), BorderLayout.NORTH); + } + + /** + * 从 widget 中提取数据展示在属性面板中 + * + * @param widget + */ + public void populate(Widget widget) { + MultiFileUploaderMobileAttr mobileAttr = ((MultiFileEditor)widget).getMobileAttr(); + FileUploadModeState fileUploadModeState = mobileAttr.getFileUploadModeState(); + uploadModeComboBox.setSelectedIndex(fileUploadModeState.getState()); + } + + /** + * 从属性面板把数据保存到 widget 中 + * @param widget + */ + public void update(Widget widget) { + MultiFileUploaderMobileAttr mobileAttr = ((MultiFileEditor)widget).getMobileAttr(); + mobileAttr.setFileUploadModeState((FileUploadModeState) ((Item)uploadModeComboBox.getSelectedItem()).getValue()); + } + + private UIExpandablePane getMobileSettingsPane() { + initUploadModeComboBox(); + + // 以后可能会扩展 + Component[][] components = new Component[][]{ + new Component[] {new UILabel(Inter.getLocText("FR-Designer_Upload_Mode"), SwingConstants.LEFT), uploadModeComboBox} + }; + + double f = TableLayout.FILL; + double p = TableLayout.PREFERRED; + double[] rowSize = {p}; + double[] columnSize = {p,f}; + int[][] rowCount = {{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_Terminal"), 280, 20, panelWrapper); + } + + private void initUploadModeComboBox() { + this.uploadModeComboBox = new UIComboBox(ITEMS); + } +}