From 46d31e960133dd333b8867599505c8ff68d96c53 Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Wed, 10 May 2017 19:58:57 +0800 Subject: [PATCH] alphafine 1 --- .../alphafine/AlphaFineConstants.java | 59 ++ .../mainframe/alphafine/AlphaFineHelper.java | 34 + .../design/mainframe/alphafine/CellType.java | 24 + .../fr/design/mainframe/alphafine/Main.java | 56 ++ .../alphafine/cell/cellModel/ActionModel.java | 30 + .../cell/cellModel/AlphaCellModel.java | 61 ++ .../cell/cellModel/DocumentModel.java | 27 + .../alphafine/cell/cellModel/FileModel.java | 29 + .../alphafine/cell/cellModel/ModelHandle.java | 12 + .../alphafine/cell/cellModel/MoreModel.java | 76 +++ .../alphafine/cell/cellModel/PluginModel.java | 77 +++ .../cell/cellRender/CommonCellRender.java | 48 ++ .../cell/cellRender/TitleCellRender.java | 42 ++ .../alphafine/component/AlphaFineDialog.java | 607 ++++++++++++++++++ .../alphafine/component/AlphaFinePane.java | 48 ++ .../alphafine/component/AlphaTextField.java | 62 ++ .../mainframe/alphafine/images/alphafine0.png | Bin 0 -> 369 bytes .../mainframe/alphafine/images/alphafine1.png | Bin 0 -> 372 bytes .../mainframe/alphafine/images/alphafine2.png | Bin 0 -> 248 bytes .../mainframe/alphafine/images/alphafine3.png | Bin 0 -> 418 bytes .../mainframe/alphafine/images/alphafine4.png | Bin 0 -> 237 bytes .../alphafine/images/alphafine_close.png | Bin 0 -> 258 bytes .../mainframe/alphafine/images/bigsearch.png | Bin 0 -> 503 bytes .../mainframe/alphafine/images/loading.gif | Bin 0 -> 8781 bytes .../mainframe/alphafine/images/opening.gif | Bin 0 -> 172950 bytes .../alphafine/images/smallsearch.png | Bin 0 -> 15320 bytes .../alphafine/listener/ComponentHandler.java | 28 + .../alphafine/listener/DocumentAdapter.java | 42 ++ .../alphafine/model/SearchListModel.java | 39 ++ .../alphafine/model/SearchResult.java | 20 + .../previewPane/ActionPreviewPane.java | 7 + .../previewPane/DocumentPreviewPane.java | 45 ++ .../previewPane/FilePreviewPane.java | 23 + .../previewPane/PluginPreviewPane.java | 58 ++ .../searchManager/ActionSearchManager.java | 63 ++ .../AlphaFineSearchProcessor.java | 12 + .../searchManager/AlphaSearchManager.java | 88 +++ .../searchManager/ConcludeSearchManager.java | 31 + .../searchManager/DocumentSearchManager.java | 90 +++ .../searchManager/FileSearchManager.java | 137 ++++ .../searchManager/LatestSearchManager.java | 53 ++ .../searchManager/PluginSearchManager.java | 104 +++ designer/src/com/fr/start/Designer.java | 13 +- .../src/com/fr/design/DesignerEnvManager.java | 576 +++++++++-------- .../help/AlphaFine/AlphafineAction.java | 62 ++ .../AlphaFine/AlphafineConfigManager.java | 204 ++++++ .../help/AlphaFine/AlphafineConfigPane.java | 216 +++++++ .../fr/design/mainframe/DesignerFrame.java | 4 + .../mainframe/hold/DefaultTitlePlace.java | 2 +- .../mainframe/toolbar/ToolBarMenuDock.java | 62 +- .../toolbar/UpdateActionManager.java | 28 + .../src/com/fr/design/menu/MenuDef.java | 152 ++--- 52 files changed, 3084 insertions(+), 367 deletions(-) create mode 100644 designer/src/com/fr/design/mainframe/alphafine/AlphaFineConstants.java create mode 100644 designer/src/com/fr/design/mainframe/alphafine/AlphaFineHelper.java create mode 100644 designer/src/com/fr/design/mainframe/alphafine/CellType.java create mode 100644 designer/src/com/fr/design/mainframe/alphafine/Main.java create mode 100644 designer/src/com/fr/design/mainframe/alphafine/cell/cellModel/ActionModel.java create mode 100644 designer/src/com/fr/design/mainframe/alphafine/cell/cellModel/AlphaCellModel.java create mode 100644 designer/src/com/fr/design/mainframe/alphafine/cell/cellModel/DocumentModel.java create mode 100644 designer/src/com/fr/design/mainframe/alphafine/cell/cellModel/FileModel.java create mode 100644 designer/src/com/fr/design/mainframe/alphafine/cell/cellModel/ModelHandle.java create mode 100644 designer/src/com/fr/design/mainframe/alphafine/cell/cellModel/MoreModel.java create mode 100644 designer/src/com/fr/design/mainframe/alphafine/cell/cellModel/PluginModel.java create mode 100644 designer/src/com/fr/design/mainframe/alphafine/cell/cellRender/CommonCellRender.java create mode 100644 designer/src/com/fr/design/mainframe/alphafine/cell/cellRender/TitleCellRender.java create mode 100644 designer/src/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java create mode 100644 designer/src/com/fr/design/mainframe/alphafine/component/AlphaFinePane.java create mode 100644 designer/src/com/fr/design/mainframe/alphafine/component/AlphaTextField.java create mode 100644 designer/src/com/fr/design/mainframe/alphafine/images/alphafine0.png create mode 100644 designer/src/com/fr/design/mainframe/alphafine/images/alphafine1.png create mode 100644 designer/src/com/fr/design/mainframe/alphafine/images/alphafine2.png create mode 100644 designer/src/com/fr/design/mainframe/alphafine/images/alphafine3.png create mode 100644 designer/src/com/fr/design/mainframe/alphafine/images/alphafine4.png create mode 100644 designer/src/com/fr/design/mainframe/alphafine/images/alphafine_close.png create mode 100644 designer/src/com/fr/design/mainframe/alphafine/images/bigsearch.png create mode 100644 designer/src/com/fr/design/mainframe/alphafine/images/loading.gif create mode 100644 designer/src/com/fr/design/mainframe/alphafine/images/opening.gif create mode 100644 designer/src/com/fr/design/mainframe/alphafine/images/smallsearch.png create mode 100644 designer/src/com/fr/design/mainframe/alphafine/listener/ComponentHandler.java create mode 100644 designer/src/com/fr/design/mainframe/alphafine/listener/DocumentAdapter.java create mode 100644 designer/src/com/fr/design/mainframe/alphafine/model/SearchListModel.java create mode 100644 designer/src/com/fr/design/mainframe/alphafine/model/SearchResult.java create mode 100644 designer/src/com/fr/design/mainframe/alphafine/previewPane/ActionPreviewPane.java create mode 100644 designer/src/com/fr/design/mainframe/alphafine/previewPane/DocumentPreviewPane.java create mode 100644 designer/src/com/fr/design/mainframe/alphafine/previewPane/FilePreviewPane.java create mode 100644 designer/src/com/fr/design/mainframe/alphafine/previewPane/PluginPreviewPane.java create mode 100644 designer/src/com/fr/design/mainframe/alphafine/searchManager/ActionSearchManager.java create mode 100644 designer/src/com/fr/design/mainframe/alphafine/searchManager/AlphaFineSearchProcessor.java create mode 100644 designer/src/com/fr/design/mainframe/alphafine/searchManager/AlphaSearchManager.java create mode 100644 designer/src/com/fr/design/mainframe/alphafine/searchManager/ConcludeSearchManager.java create mode 100644 designer/src/com/fr/design/mainframe/alphafine/searchManager/DocumentSearchManager.java create mode 100644 designer/src/com/fr/design/mainframe/alphafine/searchManager/FileSearchManager.java create mode 100644 designer/src/com/fr/design/mainframe/alphafine/searchManager/LatestSearchManager.java create mode 100644 designer/src/com/fr/design/mainframe/alphafine/searchManager/PluginSearchManager.java create mode 100644 designer_base/src/com/fr/design/actions/help/AlphaFine/AlphafineAction.java create mode 100644 designer_base/src/com/fr/design/actions/help/AlphaFine/AlphafineConfigManager.java create mode 100644 designer_base/src/com/fr/design/actions/help/AlphaFine/AlphafineConfigPane.java create mode 100644 designer_base/src/com/fr/design/mainframe/toolbar/UpdateActionManager.java diff --git a/designer/src/com/fr/design/mainframe/alphafine/AlphaFineConstants.java b/designer/src/com/fr/design/mainframe/alphafine/AlphaFineConstants.java new file mode 100644 index 000000000..8842b2782 --- /dev/null +++ b/designer/src/com/fr/design/mainframe/alphafine/AlphaFineConstants.java @@ -0,0 +1,59 @@ +package com.fr.design.mainframe.alphafine; + +import com.fr.general.SiteCenter; + +import java.awt.*; + +/** + * Created by XiaXiang on 2017/5/10. + */ +public class AlphaFineConstants { + public static final String SAVE_FILE_NAME = "alpha.coco"; + + public static final int SHOW_SIZE = 5; + + public static final int LATEST_SHOW_SIZE = 3; + + public static final int HEIGHT = 680; + + public static final int WIDTH = 460; + + public static final int LEFT_WIDTH = 300; + + public static final int RIGHT_WIDTH = 380; + + public static final int FIELD_HEIGHT = 55; + + public static final int CONTENT_HEIGHT = 405; + + public static final int CELL_HEIGHT = 32; + + + public static final Dimension FULL_SIZE = new Dimension(680, 460); + + public static final Dimension CONTENT_SIZE = new Dimension(680, 405); + + public static final Dimension FIELD_SIZE = new Dimension(680, 55); + + public static final Dimension ICON_LABEL_SIZE = new Dimension(64, 64); + + public static final Dimension CLOSE_BUTTON_SIZE = new Dimension(40, 40); + + public static final Color GRAY = new Color(0xd2d2d2); + + public static final Color BLUE = new Color(0x3394f0); + + public static final Color BLACK = new Color(0x222222); + + + + public static final String PLUGIN_SEARCH_URL = SiteCenter.getInstance().acquireUrlByKind("plugin.searchAPI"); + + public static final String PLUGIN_IMAGE_URL = "http://shop.finereport.com/plugin/"; + + public static final String REUSE_IMAGE_URL = "http://shop.finereport.com/reuse/"; + + public static final String DOCUMENT_SEARCH_URL = "http://help.finereport.com/doc-view-"; + + +} diff --git a/designer/src/com/fr/design/mainframe/alphafine/AlphaFineHelper.java b/designer/src/com/fr/design/mainframe/alphafine/AlphaFineHelper.java new file mode 100644 index 000000000..572de96a7 --- /dev/null +++ b/designer/src/com/fr/design/mainframe/alphafine/AlphaFineHelper.java @@ -0,0 +1,34 @@ +package com.fr.design.mainframe.alphafine; + +import com.fr.base.FRContext; +import com.fr.design.mainframe.DesignerContext; +import com.fr.design.mainframe.alphafine.component.AlphaFineDialog; +import com.fr.stable.StableUtils; + +import java.io.File; + +/** + * Created by XiaXiang on 2017/5/8. + */ +public class AlphaFineHelper { + + public static void showAlphaFineDialog() { + AlphaFineDialog dialog = new AlphaFineDialog(DesignerContext.getDesignerFrame()); + dialog.setVisible(true); + } + + public static File getInfoFile() { + return new File(StableUtils.pathJoin(FRContext.getCurrentEnv().getPath(), AlphaFineConstants.SAVE_FILE_NAME)); + } + + public static String findFolderName (String text) { + String[] textArray = text.split("/"); + if (textArray != null && textArray.length > 1) { + return textArray[textArray.length - 2]; + + } + return null; + } + + +} diff --git a/designer/src/com/fr/design/mainframe/alphafine/CellType.java b/designer/src/com/fr/design/mainframe/alphafine/CellType.java new file mode 100644 index 000000000..d10249124 --- /dev/null +++ b/designer/src/com/fr/design/mainframe/alphafine/CellType.java @@ -0,0 +1,24 @@ +package com.fr.design.mainframe.alphafine; + +/** + * Created by XiaXiang on 2017/4/27. + */ +public enum CellType { + PLUGIN(0), DOCUMENT(1), FILE(2), ACTION(3), REUSE(4); + + + private int cellType; + CellType(int type) { + this.cellType = type; + } + + + public int getCellType() { + return cellType; + } + + public void setCellType(int cellType) { + this.cellType = cellType; + } +} + diff --git a/designer/src/com/fr/design/mainframe/alphafine/Main.java b/designer/src/com/fr/design/mainframe/alphafine/Main.java new file mode 100644 index 000000000..e9aef375b --- /dev/null +++ b/designer/src/com/fr/design/mainframe/alphafine/Main.java @@ -0,0 +1,56 @@ +package com.fr.design.mainframe.alphafine;//package com.fr.design.mainframe.alphafine; +// +//import javax.swing.*; +//import java.awt.*; +//import java.awt.image.ImageObserver; +//import java.util.Vector; +// +///** +// * Created by XiaXiang on 2017/5/10. +// */ +//public class Main { +// public static void main(String args[]) { +// JFrame frame = new JFrame("JList Background Demonstration"); +// +// JList list = new JList(); +// +// String [] imageIcon = new String[] { +// "female.gif", "male.gif" +// }; +// +// // create model +// Vector v = new Vector(); +// for (int i=0; i<10; i++) { +// ImageIcon ii = new ImageIcon(getClass().getResource("/com/fr/design/mainframe/alphafine/images/loading.gif")); +// ii.setImageObserver(new AnimatedObserver(list, i)); +// v.addElement(ii); +// } +// +// list.setListData(v); +// +// frame.getContentPane().add(BorderLayout.CENTER, list); //new JScrollPane(list)); +// frame.setDefaultCloseOperation(3); +// frame.pack(); +// frame.setVisible(true); +// } +//} +// +//class AnimatedObserver implements ImageObserver +//{ +// JList list; +// int index; +// +// public AnimatedObserver(JList list, int index) { +// this.list = list; +// this.index = index; +// } +// +// public boolean imageUpdate (Image img, int infoflags, int x, int y, int width, int height) { +// if ((infoflags & (FRAMEBITS|ALLBITS)) != 0) { +// Rectangle rect = list.getCellBounds(index, index); +// list.repaint(rect); +// } +// +// return (infoflags & (ALLBITS|ABORT)) == 0; +// } +//} diff --git a/designer/src/com/fr/design/mainframe/alphafine/cell/cellModel/ActionModel.java b/designer/src/com/fr/design/mainframe/alphafine/cell/cellModel/ActionModel.java new file mode 100644 index 000000000..8cbfae7e8 --- /dev/null +++ b/designer/src/com/fr/design/mainframe/alphafine/cell/cellModel/ActionModel.java @@ -0,0 +1,30 @@ +package com.fr.design.mainframe.alphafine.cell.cellModel; + +import com.fr.design.mainframe.alphafine.CellType; + +import javax.swing.*; +import java.io.Serializable; + +/** + * Created by XiaXiang on 2017/4/20. + */ +public class ActionModel extends AlphaCellModel implements Serializable { + private Action action; + + public ActionModel(String name, String content, CellType type) { + super(name, content, type); + } + + public ActionModel(String name, Action action) { + super(name, null, CellType.ACTION); + this.action = action; + } + + public Action getAction() { + return action; + } + + public void setAction(Action action) { + this.action = action; + } +} diff --git a/designer/src/com/fr/design/mainframe/alphafine/cell/cellModel/AlphaCellModel.java b/designer/src/com/fr/design/mainframe/alphafine/cell/cellModel/AlphaCellModel.java new file mode 100644 index 000000000..61867e3d2 --- /dev/null +++ b/designer/src/com/fr/design/mainframe/alphafine/cell/cellModel/AlphaCellModel.java @@ -0,0 +1,61 @@ +package com.fr.design.mainframe.alphafine.cell.cellModel; + +import com.fr.design.mainframe.alphafine.CellType; + +import java.io.Serializable; + +/** + * Created by XiaXiang on 2017/3/23. + */ +public class AlphaCellModel implements Serializable{ + private String name; + private String content; + private String description; + private CellType type; + + public AlphaCellModel(String name, String content, CellType type) { + this.name = name; + this.content = content; + this.type = type; + + } + + public AlphaCellModel(String name, String content) { + this.name = name; + this.content = content; + + } + + public CellType getType() { + return type; + } + + public void setType(CellType type) { + this.type = type; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } +} diff --git a/designer/src/com/fr/design/mainframe/alphafine/cell/cellModel/DocumentModel.java b/designer/src/com/fr/design/mainframe/alphafine/cell/cellModel/DocumentModel.java new file mode 100644 index 000000000..887763118 --- /dev/null +++ b/designer/src/com/fr/design/mainframe/alphafine/cell/cellModel/DocumentModel.java @@ -0,0 +1,27 @@ +package com.fr.design.mainframe.alphafine.cell.cellModel; + +import com.fr.design.mainframe.alphafine.CellType; + +/** + * Created by XiaXiang on 2017/4/20. + */ +public class DocumentModel extends AlphaCellModel { + private String documentUrl; + + public DocumentModel(String name, String content, CellType type) { + super(name, content, type); + } + + public DocumentModel(String name, String content, String documentUrl) { + super(name, content, CellType.DOCUMENT); + this.documentUrl = documentUrl; + } + + public String getDocumentUrl() { + return documentUrl; + } + + public void setDocumentUrl(String documentUrl) { + this.documentUrl = documentUrl; + } +} diff --git a/designer/src/com/fr/design/mainframe/alphafine/cell/cellModel/FileModel.java b/designer/src/com/fr/design/mainframe/alphafine/cell/cellModel/FileModel.java new file mode 100644 index 000000000..81e229552 --- /dev/null +++ b/designer/src/com/fr/design/mainframe/alphafine/cell/cellModel/FileModel.java @@ -0,0 +1,29 @@ +package com.fr.design.mainframe.alphafine.cell.cellModel; + +import com.fr.design.mainframe.alphafine.AlphaFineHelper; +import com.fr.design.mainframe.alphafine.CellType; + +/** + * Created by XiaXiang on 2017/4/20. + */ +public class FileModel extends AlphaCellModel{ + private String filePath; + + public FileModel(String name, String content, CellType type) { + super(name, content, type); + } + + public FileModel(String name, String content, String filePath) { + super(name, content, CellType.FILE); + this.filePath = filePath; + setDescription(AlphaFineHelper.findFolderName(content)); + } + + public String getFilePath() { + return filePath; + } + + public void setFilePath(String filePath) { + this.filePath = filePath; + } +} diff --git a/designer/src/com/fr/design/mainframe/alphafine/cell/cellModel/ModelHandle.java b/designer/src/com/fr/design/mainframe/alphafine/cell/cellModel/ModelHandle.java new file mode 100644 index 000000000..a478b6f1e --- /dev/null +++ b/designer/src/com/fr/design/mainframe/alphafine/cell/cellModel/ModelHandle.java @@ -0,0 +1,12 @@ +package com.fr.design.mainframe.alphafine.cell.cellModel; + +import com.fr.design.mainframe.alphafine.CellType; + +import java.io.Serializable; + +/** + * Created by XiaXiang on 2017/4/27. + */ +public interface ModelHandle extends Serializable { + CellType getType(); +} diff --git a/designer/src/com/fr/design/mainframe/alphafine/cell/cellModel/MoreModel.java b/designer/src/com/fr/design/mainframe/alphafine/cell/cellModel/MoreModel.java new file mode 100644 index 000000000..c9449c110 --- /dev/null +++ b/designer/src/com/fr/design/mainframe/alphafine/cell/cellModel/MoreModel.java @@ -0,0 +1,76 @@ +package com.fr.design.mainframe.alphafine.cell.cellModel; + +import com.fr.design.mainframe.alphafine.CellType; + +/** + * Created by XiaXiang on 2017/4/20. + */ +public class MoreModel { + private String name; + private boolean needMore; + private String content; + private CellType type; + private boolean isLoading; + + public MoreModel(String name, String content, boolean needMore, CellType type) { + this.name = name; + this.needMore = needMore; + this.content = content; + this.type = type; + } + + public MoreModel(String name, CellType type) { + this.name = name; + this.needMore = false; + this.type = type; + } + + public MoreModel(String name) { + this.name = name; + this.isLoading = true; + } + public MoreModel(String name, boolean isLoading) { + this.name = name; + this.isLoading = isLoading; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public boolean isNeedMore() { + return needMore; + } + + public void setNeedMore(boolean needMore) { + this.needMore = needMore; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public CellType getType() { + return type; + } + + public void setType(CellType type) { + this.type = type; + } + + public boolean isLoading() { + return isLoading; + } + + public void setLoading(boolean loading) { + isLoading = loading; + } +} diff --git a/designer/src/com/fr/design/mainframe/alphafine/cell/cellModel/PluginModel.java b/designer/src/com/fr/design/mainframe/alphafine/cell/cellModel/PluginModel.java new file mode 100644 index 000000000..9be4e4dfd --- /dev/null +++ b/designer/src/com/fr/design/mainframe/alphafine/cell/cellModel/PluginModel.java @@ -0,0 +1,77 @@ +package com.fr.design.mainframe.alphafine.cell.cellModel; + +import com.fr.design.mainframe.alphafine.CellType; +import com.fr.general.ComparatorUtils; + +/** + * Created by XiaXiang on 2017/4/20. + */ +public class PluginModel extends AlphaCellModel { + private String pluginUrl; + private String imageUrl; + private String version; + private String jartime; + private String link; + private int price; + + public PluginModel(String name, String content, CellType type) { + super(name, content, type); + } + public PluginModel(String name, String content, String pluginUrl, String imageUrl, String version, String jartime, CellType type, int price) { + super(name, content); + setType(type); + this.pluginUrl = pluginUrl; + this.imageUrl = imageUrl; + this.jartime = jartime; + this.version = version; + this.price = price; + } + + public String getImageUrl() { + return imageUrl; + } + + public void setImageUrl(String imageUrl) { + this.imageUrl = imageUrl; + } + + public String getPluginUrl() { + return pluginUrl; + } + + public void setPluginUrl(String pluginUrl) { + this.pluginUrl = pluginUrl; + } + + public String getVersion() { + return version; + } + + public void setVersion(String verSion) { + this.version = verSion; + } + + public String getJartime() { + return jartime; + } + + public void setJarTime(String jarTime) { + this.jartime = jarTime; + } + + public String getLink() { + return link; + } + + public void setLink(String link) { + this.link = link; + } + + public int getPrice() { + return price; + } + + public void setPrice(int price) { + this.price = price; + } +} diff --git a/designer/src/com/fr/design/mainframe/alphafine/cell/cellRender/CommonCellRender.java b/designer/src/com/fr/design/mainframe/alphafine/cell/cellRender/CommonCellRender.java new file mode 100644 index 000000000..f2ca22c2c --- /dev/null +++ b/designer/src/com/fr/design/mainframe/alphafine/cell/cellRender/CommonCellRender.java @@ -0,0 +1,48 @@ +package com.fr.design.mainframe.alphafine.cell.cellRender; + +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.mainframe.alphafine.cell.cellModel.AlphaCellModel; +import com.fr.design.mainframe.alphafine.cell.cellModel.MoreModel; + +import javax.swing.*; +import java.awt.*; + +/** + * Created by XiaXiang on 2017/4/20. + */ +public class CommonCellRender implements ListCellRenderer { + private UILabel name; + private UILabel content; + public CommonCellRender() { + this.name = new UILabel(); + this.content = new UILabel(); + } + + @Override + public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { + if (value instanceof MoreModel) { + return new TitleCellRender().getListCellRendererComponent(list, value,index,isSelected,cellHasFocus); + } + JPanel panel = new JPanel(new BorderLayout()); + panel.setBackground(Color.white); + if (isSelected) { + panel.setBackground(new Color(0x3394f0)); + } + panel.setBorder(BorderFactory.createEmptyBorder(0,15,0,0)); + AlphaCellModel model = (AlphaCellModel) value; + name.setText(model.getName()); + String iconUrl = "/com/fr/design/mainframe/alphafine/images/alphafine" + model.getType().getCellType() + ".png"; + name.setIcon(new ImageIcon(getClass().getResource(iconUrl))); + name.setFont(new Font("Song_TypeFace",0,12)); + name.setForeground(new Color(0x222222)); + name.setVerticalTextPosition(SwingConstants.CENTER); + name.setHorizontalTextPosition(SwingConstants.RIGHT); + if (model.getDescription() != null) { + content.setText("-" + model.getDescription()); + content.setForeground(new Color(0xcccccc)); + panel.add(content, BorderLayout.CENTER); + } + panel.add(name, BorderLayout.WEST); + return panel; + } +} diff --git a/designer/src/com/fr/design/mainframe/alphafine/cell/cellRender/TitleCellRender.java b/designer/src/com/fr/design/mainframe/alphafine/cell/cellRender/TitleCellRender.java new file mode 100644 index 000000000..21a163db6 --- /dev/null +++ b/designer/src/com/fr/design/mainframe/alphafine/cell/cellRender/TitleCellRender.java @@ -0,0 +1,42 @@ +package com.fr.design.mainframe.alphafine.cell.cellRender; + +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.mainframe.alphafine.cell.cellModel.MoreModel; +import javax.swing.*; +import java.awt.*; + +/** + * Created by XiaXiang on 2017/4/20. + */ +public class TitleCellRender implements ListCellRenderer { + private UILabel name; + private UILabel more; + + public TitleCellRender() { + this.name = new UILabel(); + this.more = new UILabel(); + } + @Override + public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { + MoreModel moreModel = (MoreModel)value; + JPanel panel = new JPanel(new BorderLayout()); + panel.setBackground(new Color(0xf9f9f9)); + panel.setBorder(BorderFactory.createEmptyBorder(0,15,0,0)); + name.setText(moreModel.getName()); + name.setFont(new Font("Song_TypeFace",0,10)); + more.setFont(new Font("Song_TypeFace",0,10)); + more.setText(moreModel.getContent()); + name.setForeground(new Color(0x666666)); + more.setForeground(new Color(0x666666)); + panel.add(name, BorderLayout.WEST); + if (moreModel.isNeedMore()) { + this.more.setBorder(BorderFactory.createEmptyBorder(0,0,0,10)); + panel.add(this.more, BorderLayout.EAST); + } + if (moreModel.isLoading()) { + UILabel loadingLabel = new UILabel(new ImageIcon(getClass().getResource("/com/fr/design/mainframe/alphafine/images/loading.gif"))); + panel.add(loadingLabel, BorderLayout.SOUTH); + } + return panel; + } +} diff --git a/designer/src/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java b/designer/src/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java new file mode 100644 index 000000000..56d95a89d --- /dev/null +++ b/designer/src/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java @@ -0,0 +1,607 @@ +package com.fr.design.mainframe.alphafine.component; + +import com.fr.base.FRContext; +import com.fr.design.DesignerEnvManager; +import com.fr.design.dialog.UIDialog; +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.gui.icontainer.UIScrollPane; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.mainframe.DesignerContext; +import com.fr.design.mainframe.alphafine.AlphaFineConstants; +import com.fr.design.mainframe.alphafine.AlphaFineHelper; +import com.fr.design.mainframe.alphafine.cell.cellRender.CommonCellRender; +import com.fr.design.mainframe.alphafine.cell.cellModel.*; +import com.fr.design.mainframe.alphafine.listener.ComponentHandler; +import com.fr.design.mainframe.alphafine.listener.DocumentAdapter; +import com.fr.design.mainframe.alphafine.model.SearchListModel; +import com.fr.design.mainframe.alphafine.model.SearchResult; +import com.fr.design.mainframe.alphafine.previewPane.DocumentPreviewPane; +import com.fr.design.mainframe.alphafine.previewPane.FilePreviewPane; +import com.fr.design.mainframe.alphafine.previewPane.PluginPreviewPane; +import com.fr.design.mainframe.alphafine.searchManager.*; +import com.fr.file.FileNodeFILE; +import com.fr.file.filetree.FileNode; +import com.fr.form.main.Form; +import com.fr.form.main.FormIO; +import com.fr.general.ComparatorUtils; +import com.fr.general.FRLogger; +import com.fr.io.TemplateWorkBookIO; +import com.fr.io.exporter.ImageExporter; +import com.fr.main.impl.WorkBook; +import com.fr.stable.StringUtils; +import com.fr.stable.project.ProjectConstants; + +import javax.imageio.ImageIO; +import javax.swing.*; +import javax.swing.event.DocumentEvent; +import javax.swing.event.ListSelectionEvent; +import javax.swing.event.ListSelectionListener; +import java.awt.*; +import java.awt.event.*; +import java.awt.image.BufferedImage; +import java.io.*; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.URL; +import java.util.concurrent.ExecutionException; + +/** + * Created by XiaXiang on 2017/3/21. + */ +public class AlphaFineDialog extends UIDialog { + private AlphaTextField searchTextField; + private UIButton closeButton; + private JPanel searchResultPane; + private Point pressedPoint; + private UIScrollPane leftSearchResultPane; + private JPanel rightSearchResultPane; + private JList searchResultList; + private SearchListModel searchListModel; + private SwingWorker searchWorker; + + public AlphaFineDialog(Frame parent) { + super(parent); + initProperties(); + initListener(); + initComponents(); + } + + private void initComponents() { + searchTextField = new AlphaTextField("AlphaFine"); + searchTextField.setFont(new Font("Song_TypeFace",0,20)); + searchTextField.setBackground(Color.white); + searchTextField.setBorderPainted(false); + JPanel topPane = new JPanel(new BorderLayout()); + UILabel iconLabel = new UILabel(new ImageIcon(getClass().getResource("/com/fr/design/mainframe/alphafine/images/bigsearch.png"))); + iconLabel.setPreferredSize(AlphaFineConstants.ICON_LABEL_SIZE); + iconLabel.setOpaque(true); + iconLabel.setBackground(Color.white); + topPane.add(iconLabel, BorderLayout.WEST); + topPane.add(searchTextField, BorderLayout.CENTER); + closeButton = new UIButton() { + @Override + public void paintComponent(Graphics g) { + g.setColor( Color.white ); + g.fillRect(0, 0, getSize().width, getSize().height); + super.paintComponent(g); + } + }; + closeButton.setContentAreaFilled(false); + closeButton.setPreferredSize(AlphaFineConstants.CLOSE_BUTTON_SIZE); + closeButton.setIcon(new ImageIcon(getClass().getResource("/com/fr/design/mainframe/alphafine/images/alphafine_close.png"))); + closeButton.set4ToolbarButton(); + closeButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + dispose(); + } + }); + UILabel borderLabel = new UILabel(); + borderLabel.setBackground(AlphaFineConstants.GRAY); + borderLabel.setPreferredSize(new Dimension(AlphaFineConstants.HEIGHT, 1)); + topPane.add(closeButton, BorderLayout.EAST); + topPane.add(borderLabel, BorderLayout.SOUTH); + add(topPane, BorderLayout.CENTER); + searchTextField.getDocument().addDocumentListener(new DocumentAdapter() { + @Override + protected void textChanged(DocumentEvent e) { + doSearch(searchTextField.getText()); + } + }); + } + + private void initProperties() { + setUndecorated(true); + addComponentListener(new ComponentHandler()); + setSize(AlphaFineConstants.FIELD_SIZE); + centerWindow(this); + } + + private void centerWindow(Window win) { + Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); + + Dimension winSize = win.getSize(); + + if (winSize.height > screenSize.height) { + winSize.height = screenSize.height; + } + if (winSize.width > screenSize.width) { + winSize.width = screenSize.width; + } + //这里设置位置:水平居中,竖直偏上 + win.setLocation((screenSize.width - winSize.width ) / 2, (screenSize.height - winSize.height) / AlphaFineConstants.SHOW_SIZE); + } + + private void doSearch(String text) { + if (text.length() < 2 || text.contains("'")) { + return; + } + if (StringUtils.isBlank(text) || text.equals("AlphaFine")) { + removeSearchResult(); + } else { + showSearchResult(text); + } + + } + + private void removeSearchResult() { + if (searchResultPane != null) { + remove(searchResultPane); + searchResultPane = null; + } + setSize(AlphaFineConstants.FIELD_SIZE); + repaint(); + } + + // TODO: 2017/5/8 xiaxiang: 窗体圆角setShape()有毛边,重写paint方法可以解决毛边问题,但带来了别的问题,处理比较麻烦,暂用setShape(); +// public void paint(Graphics g){ +// +// Graphics2D g2 = (Graphics2D) g.create(); +// RenderingHints qualityHints = new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); +// qualityHints.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); +// g2.setRenderingHints(qualityHints); +// g2.setPaint(Color.WHITE); +// g2.fillRoundRect(0, 0, getWidth(), getHeight(), 25, 25); +// g2.dispose(); +// } + + + + private void showSearchResult(String searchText) { + if (searchResultPane == null) { + searchResultList = new JList(); + searchResultPane = new JPanel(); + searchResultPane.setPreferredSize(AlphaFineConstants.CONTENT_SIZE); + searchResultPane.setLayout(new BorderLayout()); + searchResultList.setCellRenderer(new CommonCellRender()); + searchResultList.setFixedCellHeight(AlphaFineConstants.CELL_HEIGHT); + searchResultList.addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + int selectedIndex = searchResultList.getSelectedIndex(); + Object selectedValue = searchResultList.getSelectedValue(); + if (e.getClickCount() == 2) { + final int i = searchResultList.locationToIndex(e.getPoint()); + searchResultList.setSelectedIndex(i); + doNavigate(selectedIndex); + if (selectedValue instanceof AlphaCellModel) { + SearchResult originalResultList = LatestSearchManager.getLatestSearchManager().getLatestModelList(); + originalResultList.add(searchResultList.getSelectedValue()); + LatestSearchManager.getLatestSearchManager().setLatestModelList(originalResultList); + //保存最近搜索 + saveHistory(originalResultList); + } + } else if (e.getClickCount() == 1) { + if (selectedValue instanceof MoreModel && ((MoreModel) selectedValue).isNeedMore()) { + HandleMoreOrLessResult(selectedIndex, (MoreModel) selectedValue); + } + } + } + }); + + // TODO: 2017/5/8 xiaxiang: e.getClickCount() == 1 时,偶发性的不能触发,所以先放到valueChanged + searchResultList.addListSelectionListener(new ListSelectionListener() { + @Override + public void valueChanged(ListSelectionEvent e) { + if (!e.getValueIsAdjusting()) { + showResult(searchResultList.getSelectedIndex(), searchResultList.getSelectedValue()); + + } + } + }); + leftSearchResultPane = new UIScrollPane(searchResultList); + leftSearchResultPane.setBackground(Color.white); + leftSearchResultPane.setBorder(BorderFactory.createEmptyBorder(10,10,10,10)); + leftSearchResultPane.setPreferredSize(new Dimension(AlphaFineConstants.LEFT_WIDTH, AlphaFineConstants.CONTENT_HEIGHT)); + rightSearchResultPane = new JPanel(); + rightSearchResultPane.setBackground(Color.white); + searchResultPane.add(leftSearchResultPane, BorderLayout.WEST); + rightSearchResultPane.setPreferredSize(new Dimension(AlphaFineConstants.RIGHT_WIDTH, AlphaFineConstants.CONTENT_HEIGHT)); + searchResultPane.add(rightSearchResultPane, BorderLayout.EAST); + add(searchResultPane, BorderLayout.SOUTH); + setSize(AlphaFineConstants.FULL_SIZE); + } + searchResultList.setModel(new SearchListModel(AlphaSearchManager.getSearchManager().showDefaultSearchResult())); + if (this.searchWorker != null && !this.searchWorker.isDone()) { + this.searchWorker.cancel(true); + this.searchWorker = null; + } + this.searchWorker = new SwingWorker() { + + @Override + protected SearchListModel doInBackground() throws Exception { + return setjListModel(new SearchListModel(AlphaSearchManager.getSearchManager().showLessSearchResult(searchText))); + } + + @Override + protected void done() { + try { + if (!isCancelled()) { + searchResultList.setModel(get()); + searchResultList.validate(); + searchResultList.repaint(); + validate(); + repaint(); + } + } catch (InterruptedException e) { + FRLogger.getLogger().error(e.getMessage()); + } catch (ExecutionException e) { + searchResultList.setModel(null); + FRLogger.getLogger().error(e.getMessage()); + } + + } + + }; + this.searchWorker.execute(); + } + + private void showResult(int index, Object selectedValue) { + if (selectedValue instanceof FileModel) { + String fileName = ((FileModel) selectedValue).getFilePath().substring(ProjectConstants.REPORTLETS_NAME.length() + 1); + showDefaultPreviewPane(); + if (fileName.endsWith("frm")) { + if (this.searchWorker != null && !this.searchWorker.isDone()) { + this.searchWorker.cancel(true); + this.searchWorker = null; + } + this.searchWorker = new SwingWorker() { + @Override + protected BufferedImage doInBackground() throws Exception { + Form form = FormIO.readForm(FRContext.getCurrentEnv(), fileName); + return FormIO.exportFormAsImage(form); + } + + @Override + protected void done() { + if (!isCancelled()) { + rightSearchResultPane.removeAll(); + try { + rightSearchResultPane.add(new FilePreviewPane(get())); + } catch (InterruptedException e) { + FRLogger.getLogger().error(e.getMessage()); + } catch (ExecutionException e) { + FRLogger.getLogger().error(e.getMessage()); + } + validate(); + repaint(); + } + + } + }; + this.searchWorker.execute(); + } else if (fileName.endsWith("cpt")) { + if (this.searchWorker != null && !this.searchWorker.isDone()) { + this.searchWorker.cancel(true); + this.searchWorker = null; + } + this.searchWorker = new SwingWorker() { + @Override + protected BufferedImage doInBackground() throws Exception { + WorkBook workBook = (WorkBook) TemplateWorkBookIO.readTemplateWorkBook(FRContext.getCurrentEnv(), fileName); + BufferedImage bufferedImage = new ImageExporter().export(workBook); + return bufferedImage; + } + + @Override + protected void done() { + if (!isCancelled()) { + rightSearchResultPane.removeAll(); + try { + rightSearchResultPane.add(new FilePreviewPane(get())); + validate(); + repaint(); + } catch (InterruptedException e) { + FRLogger.getLogger().error(e.getMessage()); + } catch (ExecutionException e) { + FRLogger.getLogger().error(e.getMessage()); + } + } + + } + }; + this.searchWorker.execute(); + + + } + + } else if (selectedValue instanceof DocumentModel) { + rightSearchResultPane.removeAll(); + rightSearchResultPane.add(new DocumentPreviewPane(((DocumentModel) selectedValue).getName(), ((DocumentModel) selectedValue).getContent())); + validate(); + repaint(); + } else if (selectedValue instanceof PluginModel) { + showDefaultPreviewPane(); + if (this.searchWorker != null && !this.searchWorker.isDone()) { + this.searchWorker.cancel(true); + this.searchWorker = null; + } + this.searchWorker = new SwingWorker() { + @Override + protected Image doInBackground() throws Exception { + BufferedImage bufferedImage = ImageIO.read(new URL(((PluginModel) selectedValue).getImageUrl())); + return bufferedImage; + } + + @Override + protected void done() { + try { + rightSearchResultPane.removeAll(); + rightSearchResultPane.add(new PluginPreviewPane(((PluginModel) selectedValue).getName(), get(), ((PluginModel) selectedValue).getVersion(), ((PluginModel) selectedValue).getJartime(), ((PluginModel) selectedValue).getType(), ((PluginModel) selectedValue).getPrice())); + validate(); + repaint(); + } catch (InterruptedException e) { + FRLogger.getLogger().error(e.getMessage()); + } catch (ExecutionException e) { + FRLogger.getLogger().error(e.getMessage()); + } + + } + }; + this.searchWorker.execute(); + + } else if (selectedValue instanceof ActionModel) { + showDefaultPreviewPane(); + } + + } + + private void HandleMoreOrLessResult(int index, MoreModel selectedValue) { + if (selectedValue.getContent().equals("显示全部")) { + selectedValue.setContent("收起"); + rebuildList(index, selectedValue); + + } else { + selectedValue.setContent("显示全部"); + rebuildList(index, selectedValue); + } + } + + private void showDefaultPreviewPane() { + rightSearchResultPane.removeAll(); + UILabel label = new UILabel(new ImageIcon(getClass().getResource("/com/fr/design/mainframe/alphafine/images/opening.gif"))); + label.setBorder(BorderFactory.createEmptyBorder(120,0,0,0)); + rightSearchResultPane.add(label, BorderLayout.CENTER); + validate(); + repaint(); + } + + private void initListener() { + initAWTEventListener(); + + initMouseListener(); + + } + + private void initMouseListener() { + addMouseMotionListener(new MouseMotionAdapter() { + @Override + public void mouseDragged(MouseEvent e) { + doMouseDragged(e); + } + }); + + addMouseListener(new MouseAdapter() { + public void mousePressed(MouseEvent e) { + doMousePressed(e); + } + + }); + } + + private void doMousePressed(MouseEvent e) { + + pressedPoint = e.getPoint(); + + } + + private void doMouseDragged(MouseEvent e) { + + Point point = e.getPoint();// 获取当前坐标 + + Point locationPoint = getLocation();// 获取窗体坐标 + + int x = locationPoint.x + point.x - pressedPoint.x;// 计算移动后的新坐标 + + int y = locationPoint.y + point.y - pressedPoint.y; + + setLocation(x, y);// 改变窗体位置 + + } + + /** + * 当鼠标在搜索界面边界外点击时触发 + */ + private void initAWTEventListener() { + Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() { + @Override + public void eventDispatched(AWTEvent event) { + if (!AlphaFineDialog.this.isVisible()) { + return; + } + if (event instanceof MouseEvent) { + MouseEvent k = (MouseEvent) event; + if (SwingUtilities.isLeftMouseButton(k)) { + Point p = k.getLocationOnScreen(); + Rectangle dialogRectangle = AlphaFineDialog.this.getBounds(); + Rectangle paneRectangle = new Rectangle(AlphaFinePane.createAlphaFinePane().getLocationOnScreen(), AlphaFinePane.createAlphaFinePane().getSize()); + if (!dialogRectangle.contains(p) && !paneRectangle.contains(p)) { + AlphaFineDialog.this.dispose(); + } + } + } + } + }, AWTEvent.MOUSE_EVENT_MASK|AWTEvent.KEY_EVENT_MASK); + } + + /** + * 全局快捷键 + * @return + */ + public static AWTEventListener listener() { + return new AWTEventListener() { + + @Override + public void eventDispatched(AWTEvent event) { + if (event instanceof KeyEvent) { + KeyEvent e = (KeyEvent) event; + KeyStroke keyStroke = (KeyStroke) KeyStroke.getAWTKeyStrokeForEvent(e); + KeyStroke storeKeyStroke = DesignerEnvManager.getEnvManager().getAlphafineConfigManager().getShortCutKeyStore(); + if (ComparatorUtils.equals(keyStroke.toString(), storeKeyStroke.toString())) { + doClickAction(); + } + + } + } + }; + } + + private static void doClickAction() { + AlphaFineHelper.showAlphaFineDialog(); + } + + + @Override + public void checkValid() throws Exception { + + } + + private void doNavigate(int index) { + AlphaFineDialog.this.dispose(); + final Object value = searchResultList.getSelectedValue(); + if (value instanceof ActionModel) { + ((ActionModel) value).getAction().actionPerformed(null); + } else if (value instanceof FileModel) { + DesignerContext.getDesignerFrame().openTemplate(new FileNodeFILE(new FileNode(((FileModel)value).getFilePath(), false))); + } else if (value instanceof PluginModel) { + String url = ((PluginModel) value).getPluginUrl(); + try { + Desktop.getDesktop().browse(new URI(url)); + } catch (IOException e) { + FRLogger.getLogger().error(e.getMessage()); + } catch (URISyntaxException e) { + FRLogger.getLogger().error(e.getMessage()); + } + } else if (value instanceof DocumentModel) { + String url = ((DocumentModel) value).getDocumentUrl(); + try { + Desktop.getDesktop().browse(new URI(url)); + } catch (IOException e) { + FRLogger.getLogger().error(e.getMessage()); + + } catch (URISyntaxException e) { + FRLogger.getLogger().error(e.getMessage()); + } + } + + } + + /** + * todo:保存到本地的逻辑待修改 + * @param searchResult + */ + private void saveHistory(SearchResult searchResult) { + try { + ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(AlphaFineHelper.getInfoFile())); + os.writeObject(searchResult); + os.close(); + } catch (IOException e) { + FRLogger.getLogger().error(e.getMessage()); + } + + sendToServer(); + + } + + /** + *todo:还没做上传服务器 + */ + private void sendToServer() { + } + + private void rebuildList(int index, MoreModel selectedValue) { + SearchResult moreResult = getMoreResult(selectedValue); + if((selectedValue).getContent().equals("收起")) { + for (int i = 0; i < moreResult.size(); i++) { + this.searchListModel.insertElementAt(moreResult.get(i), index + 4 + i); + } + } else { + for (int i = 0; i < moreResult.size(); i++) { + this.searchListModel.removeElementAt(index + 4); + + } + } + this.searchResultList.validate(); + this.searchResultList.repaint(); + validate(); + repaint(); + + } + + private SearchResult getMoreResult(MoreModel selectedValue) { + SearchResult moreResult; + switch (selectedValue.getType()) { + case PLUGIN: + moreResult = PluginSearchManager.getPluginSearchManager().showMoreSearchResult(); + break; + case DOCUMENT: + moreResult = DocumentSearchManager.getDocumentSearchManager().showMoreSearchResult(); + break; + case FILE: + moreResult = FileSearchManager.getFileSearchManager().showMoreSearchResult(); + break; + case ACTION: + moreResult = ActionSearchManager.getActionSearchManager().showMoreSearchResult(); + break; + default: + moreResult = AlphaSearchManager.getSearchManager().showMoreSearchResult(); + } + return moreResult; + } + + private SearchListModel getModel() { + return (SearchListModel) searchResultList.getModel(); + } + + //测试 + public static void main(String[] args) { + AlphaFineDialog alphaFineDialog = new AlphaFineDialog(DesignerContext.getDesignerFrame()); + alphaFineDialog.setSize(new Dimension(680,55)); + alphaFineDialog.setVisible(true); + } + + + public SearchListModel setjListModel(SearchListModel jListModel) { + this.searchListModel = jListModel; + return this.searchListModel; + } + + public SwingWorker getSearchWorker() { + return searchWorker; + } + + public void setSearchWorker(SwingWorker searchWorker) { + this.searchWorker = searchWorker; + } + +} \ No newline at end of file diff --git a/designer/src/com/fr/design/mainframe/alphafine/component/AlphaFinePane.java b/designer/src/com/fr/design/mainframe/alphafine/component/AlphaFinePane.java new file mode 100644 index 000000000..86a9f9655 --- /dev/null +++ b/designer/src/com/fr/design/mainframe/alphafine/component/AlphaFinePane.java @@ -0,0 +1,48 @@ +package com.fr.design.mainframe.alphafine.component; + +import com.fr.base.BaseUtils; +import com.fr.design.DesignerEnvManager; +import com.fr.design.dialog.BasicPane; +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.mainframe.alphafine.AlphaFineHelper; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +/** + * Created by XiaXiang on 2017/3/21. + */ +public class AlphaFinePane extends BasicPane { + private static AlphaFinePane alphaFinePane; + + public static AlphaFinePane createAlphaFinePane() { + if (alphaFinePane == null) { + alphaFinePane = new AlphaFinePane(); + } + return alphaFinePane; + } + public AlphaFinePane() { + setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 14)); + if (DesignerEnvManager.getEnvManager().getAlphafineConfigManager().isEnabled()) { + Toolkit.getDefaultToolkit().addAWTEventListener(AlphaFineDialog.listener(), AWTEvent.KEY_EVENT_MASK); + } + UIButton refreshButton = new UIButton(); + refreshButton.setIcon(BaseUtils.readIcon("/com/fr/design/mainframe/alphafine/images/smallsearch.png")); + refreshButton.setToolTipText("AlphaFine智能搜索"); + refreshButton.set4ToolbarButton(); + this.add(refreshButton); + refreshButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + AlphaFineHelper.showAlphaFineDialog(); + } + }); + } + + @Override + protected String title4PopupWindow() { + return "AlphaFine"; + } +} diff --git a/designer/src/com/fr/design/mainframe/alphafine/component/AlphaTextField.java b/designer/src/com/fr/design/mainframe/alphafine/component/AlphaTextField.java new file mode 100644 index 000000000..acda5f907 --- /dev/null +++ b/designer/src/com/fr/design/mainframe/alphafine/component/AlphaTextField.java @@ -0,0 +1,62 @@ +package com.fr.design.mainframe.alphafine.component; + +import com.fr.design.gui.itextfield.UITextField; +import com.fr.report.web.button.Image; + +import java.awt.*; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.awt.event.MouseMotionAdapter; + +/** + * Created by XiaXiang on 2017/3/21. + */ +public class AlphaTextField extends UITextField { + + private String placeHolder; + + private Image image; + + public AlphaTextField(String placeHolder) { + this.placeHolder = placeHolder; + } + + public AlphaTextField() { + this.placeHolder = null; + } + + + @Override + public String getText() { + String text = super.getText(); + + if (text.trim().length() == 0 && placeHolder != null) { + text = placeHolder; + } + + return text; + } + + @Override + public void paintComponent(Graphics g) { + super.paintComponent(g); + + if (super.getText().length() > 0 || placeHolder == null) { + return; + } + + Graphics2D g2 = (Graphics2D) g; + g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + g2.setColor(super.getDisabledTextColor()); + g2.drawString(placeHolder, getInsets().left, g.getFontMetrics().getMaxAscent() + getInsets().top + 15); + } + + public Image getImage() { + return image; + } + + public void setImage(Image image) { + this.image = image; + } + +} diff --git a/designer/src/com/fr/design/mainframe/alphafine/images/alphafine0.png b/designer/src/com/fr/design/mainframe/alphafine/images/alphafine0.png new file mode 100644 index 0000000000000000000000000000000000000000..e23a33ab542ea640bb96bbd86d609624a7fd87e4 GIT binary patch literal 369 zcmV-%0gnEOP)_OaZPf)Q->&My_7?6NkeSLuTq(Z= P00000NkvXXu0mjfh`61) literal 0 HcmV?d00001 diff --git a/designer/src/com/fr/design/mainframe/alphafine/images/alphafine1.png b/designer/src/com/fr/design/mainframe/alphafine/images/alphafine1.png new file mode 100644 index 0000000000000000000000000000000000000000..aae79cb065f47bb3a700dd4941308fc908ed2ba2 GIT binary patch literal 372 zcmV-)0gL{LP))>M&LGbJUgSRWwbNuBxpLIE24{PrSgpwnxcPqe<2`& zCR^|_U4tNLDFi=y*EUo_8o=m`8j}f@2(%3)&@MHiZRmk!PE=f&`Mt2LfDcIo@CG~p zCv8Im9P*Xm-Wl~MEmU&u?)fhHQ|Stjv5uk#o2J$Fke Su_s^v00002BR0px`P` z7sn8b(^n@4avfF>aEb5wzfCOf7Gp-ouw6fB0M3km|0-2 z@75O=Z=Y-3^HkjL*h{u$OUhOqT+eoTP5y&8oBBoD|K>F_AN-ZY#;*OFneDED+Sa@U u0yRdfZKc=lS$mg3*kJm%HNTE|*D!Lomz=VG@M07 zJ1`Y+w&pJsDc^y{39=HbH0V`JpTmjF3 z_0Ak4CW{s1byxx)Ku{73oGC6SNd*|-)H^dwD>#=eyfZye<#i|lyfd91IRGz;J^X4x zYZ*5YIOqGpfy%E`YM<~?Dy~!CeQYPML+PCvvdjCS0k#Uf@y;}P9SWdRzmbE&JJaWN zu)u@v+l9a_u=dV0ax?-5osB9)F>7JAiwH=iN!Z^h5J?-kIqDH&0;`_mdX?QL?LAKB z#l{4!g5K0$d^t=ws06kma|^WDIF3<;PWrCAGs8rMMt4gfs_~^lGKmH71Z=!Bhq<|* zi2BR0px}H@ z7sn8b(`P3gFJnLPVPkUi%KyJwfL zF>vcRd@_tT|Iw_u^v`$xHw=@k{FGz9tg~cWnZ7DfYMY+N{1u0`$xlf8YR7v`I_K); jrX|Y-W_{(@_JJXn!7Z!n!^^!ur!siD`njxgN@xNAlSy2u literal 0 HcmV?d00001 diff --git a/designer/src/com/fr/design/mainframe/alphafine/images/alphafine_close.png b/designer/src/com/fr/design/mainframe/alphafine/images/alphafine_close.png new file mode 100644 index 0000000000000000000000000000000000000000..e17a3a7b5540a382ee6469c90a91794e0232eab7 GIT binary patch literal 258 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0px_oy z7sn8b(@Q5iay1(WxX#}!wx{d1LQwycK$}Sc(%a(>DvR8?eO8}CR(4^d!-)@ZhyE;? zQ6$$O^_Nv*A{{Pk#W#O^zM(sBx>e=nTfWDeRz#h>+@ag0 z)pcXhoWS$av()G00igRCJYD@<);T3K F0RR@bX-WV9 literal 0 HcmV?d00001 diff --git a/designer/src/com/fr/design/mainframe/alphafine/images/bigsearch.png b/designer/src/com/fr/design/mainframe/alphafine/images/bigsearch.png new file mode 100644 index 0000000000000000000000000000000000000000..192a8131dd0842ac8230341edb4ef54c29708b7e GIT binary patch literal 503 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 literal 0 HcmV?d00001 diff --git a/designer/src/com/fr/design/mainframe/alphafine/images/opening.gif b/designer/src/com/fr/design/mainframe/alphafine/images/opening.gif new file mode 100644 index 0000000000000000000000000000000000000000..41cfeb9bc869c3b3b9396ba318be7b24adbc3999 GIT binary patch literal 172950 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

QjO{xt0y^u-cuz`o45ze)w!nFt$>il`sF1K!3 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 >x|M* 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.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 { + private boolean needMore; + + + + public boolean isNeedMore() { + return needMore; + } + + public void setNeedMore(boolean needMore) { + this.needMore = needMore; + } +} diff --git a/designer/src/com/fr/design/mainframe/alphafine/previewPane/ActionPreviewPane.java b/designer/src/com/fr/design/mainframe/alphafine/previewPane/ActionPreviewPane.java new file mode 100644 index 000000000..577f8ac13 --- /dev/null +++ b/designer/src/com/fr/design/mainframe/alphafine/previewPane/ActionPreviewPane.java @@ -0,0 +1,7 @@ +package com.fr.design.mainframe.alphafine.previewPane; + +/** + * Created by XiaXiang on 2017/5/5. + */ +public class ActionPreviewPane { +} diff --git a/designer/src/com/fr/design/mainframe/alphafine/previewPane/DocumentPreviewPane.java b/designer/src/com/fr/design/mainframe/alphafine/previewPane/DocumentPreviewPane.java new file mode 100644 index 000000000..767594371 --- /dev/null +++ b/designer/src/com/fr/design/mainframe/alphafine/previewPane/DocumentPreviewPane.java @@ -0,0 +1,45 @@ +package com.fr.design.mainframe.alphafine.previewPane; + + +import com.fr.design.gui.itextarea.UITextArea; +import com.fr.design.mainframe.alphafine.AlphaFineConstants; +import com.fr.design.utils.gui.GUICoreUtils; + +import javax.swing.*; +import java.awt.*; + +/** + * Created by XiaXiang on 2017/5/2. + */ +public class DocumentPreviewPane extends JPanel { + + public DocumentPreviewPane(String title, String summary) { + this.setLayout(new BorderLayout()); + this.setBackground(Color.white); + UITextArea titleArea = new UITextArea(title); + UITextArea contentArea = new UITextArea(summary); + titleArea.setOpaque(false); + contentArea.setOpaque(false); + titleArea.setBorder(BorderFactory.createEmptyBorder(0,0,0,0)); + titleArea.setForeground(AlphaFineConstants.BLUE); + contentArea.setForeground(AlphaFineConstants.BLACK); + titleArea.setPreferredSize(new Dimension(360, 30)); + titleArea.setFont(new Font("Song_TypeFace",0,18)); + contentArea.setFont(new Font("Song_TypeFace",0,12)); + add(titleArea, BorderLayout.NORTH); + add(contentArea, BorderLayout.CENTER); + } + + + public static void main(String[] args) { + JFrame jf = new JFrame("test"); + jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + JPanel content = (JPanel) jf.getContentPane(); + content.setLayout(null); + + content.add(new DocumentPreviewPane("test", "ababababaabbababab")); + GUICoreUtils.centerWindow(jf); + jf.setSize(400, 400); + jf.setVisible(true); + } +} diff --git a/designer/src/com/fr/design/mainframe/alphafine/previewPane/FilePreviewPane.java b/designer/src/com/fr/design/mainframe/alphafine/previewPane/FilePreviewPane.java new file mode 100644 index 000000000..97aee06ed --- /dev/null +++ b/designer/src/com/fr/design/mainframe/alphafine/previewPane/FilePreviewPane.java @@ -0,0 +1,23 @@ +package com.fr.design.mainframe.alphafine.previewPane; + +import com.fr.design.gui.ilable.UILabel; + +import javax.swing.*; +import java.awt.*; + +/** + * Created by XiaXiang on 2017/5/2. + */ +public class FilePreviewPane extends JPanel { + + public FilePreviewPane(Image image) { + UILabel label = new UILabel(); + label.setOpaque(true); + label.setBackground(Color.white); + float scale = image.getWidth(null) / 380; + image = image.getScaledInstance(380, (int) (image.getHeight(null) / scale), Image.SCALE_SMOOTH); + label.setIcon(new ImageIcon(image)); + add(label); + } +} + diff --git a/designer/src/com/fr/design/mainframe/alphafine/previewPane/PluginPreviewPane.java b/designer/src/com/fr/design/mainframe/alphafine/previewPane/PluginPreviewPane.java new file mode 100644 index 000000000..cdd5ba98d --- /dev/null +++ b/designer/src/com/fr/design/mainframe/alphafine/previewPane/PluginPreviewPane.java @@ -0,0 +1,58 @@ +package com.fr.design.mainframe.alphafine.previewPane; + +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.mainframe.alphafine.CellType; + +import javax.swing.*; +import java.awt.*; + + +/** + * Created by XiaXiang on 2017/5/2. + */ +public class PluginPreviewPane extends JPanel { + public PluginPreviewPane(String title, Image image, String version, String jartime, CellType type, int price) { + this.setLayout(new BorderLayout()); + this.setBorder(BorderFactory.createEmptyBorder(50,0,0,0)); + this.setBackground(Color.white); + UILabel imageLabel = new UILabel(); + image = image.getScaledInstance(200, 200, Image.SCALE_SMOOTH); + imageLabel.setIcon(new ImageIcon(image)); + UILabel nameLabel = new UILabel(title); + nameLabel.setVerticalAlignment(SwingConstants.CENTER); + JPanel line = new JPanel(); + line.setPreferredSize(new Dimension(200,1)); + line.setBackground(new Color(0xd2d2d2)); + JPanel panel = new JPanel(new BorderLayout()); + panel.setBackground(Color.white); + JPanel bottomPane = new JPanel(new BorderLayout()); + bottomPane.setBackground(Color.white); + bottomPane.setBorder(BorderFactory.createEmptyBorder(10,0,0,0)); + if (type == CellType.PLUGIN) { + UILabel versionLabel = new UILabel("V" + version); + versionLabel.setBorder(BorderFactory.createEmptyBorder(0,20,10,20)); + versionLabel.setForeground(new Color(0x666666)); + versionLabel.setFont(new Font("Song_TypeFace",0,12)); + panel.add(versionLabel, BorderLayout.CENTER); + UILabel jartimeLabel = new UILabel(jartime.substring(0, 10)); + jartimeLabel.setForeground(new Color(0x222222)); + jartimeLabel.setFont(new Font("Song_TypeFace",0,12)); + bottomPane.add(jartimeLabel, BorderLayout.EAST); + } + nameLabel.setFont(new Font("Song_TypeFace",0,18)); + nameLabel.setBackground(new Color(0x3394f0)); + nameLabel.setBorder(BorderFactory.createEmptyBorder(20,20,10,20)); + line.setBorder(BorderFactory.createEmptyBorder(20, 0, 10, 0)); + String price0 = price == 0 ? "免费" : String.valueOf(price); + UILabel priceLabel = new UILabel(price0); + priceLabel.setForeground(new Color(0xf46c4c)); + priceLabel.setFont(new Font("Song_TypeFace",0,10)); + bottomPane.add(priceLabel, BorderLayout.WEST); + panel.add(nameLabel, BorderLayout.NORTH); + panel.add(line, BorderLayout.SOUTH); + nameLabel.setForeground(new Color(0x3394f0)); + add(imageLabel, BorderLayout.NORTH); + add(panel, BorderLayout.CENTER); + add(bottomPane, BorderLayout.SOUTH); + } +} diff --git a/designer/src/com/fr/design/mainframe/alphafine/searchManager/ActionSearchManager.java b/designer/src/com/fr/design/mainframe/alphafine/searchManager/ActionSearchManager.java new file mode 100644 index 000000000..a2caf0531 --- /dev/null +++ b/designer/src/com/fr/design/mainframe/alphafine/searchManager/ActionSearchManager.java @@ -0,0 +1,63 @@ +package com.fr.design.mainframe.alphafine.searchManager; + +import com.fr.design.DesignerEnvManager; +import com.fr.design.actions.UpdateAction; +import com.fr.design.mainframe.alphafine.CellType; +import com.fr.design.mainframe.alphafine.cell.cellModel.MoreModel; +import com.fr.design.mainframe.alphafine.cell.cellModel.ActionModel; +import com.fr.design.mainframe.alphafine.model.SearchResult; +import com.fr.design.mainframe.toolbar.UpdateActionManager; + +import java.util.List; + +/** + * Created by XiaXiang on 2017/3/27. + */ +public class ActionSearchManager implements AlphaFineSearchProcessor { + private static ActionSearchManager actionSearchManager = null; + private SearchResult filterModelList; + private SearchResult lessModelList; + private SearchResult moreModelList; + + public synchronized static ActionSearchManager getActionSearchManager() { + if (actionSearchManager == null) { + actionSearchManager = new ActionSearchManager(); + } + return actionSearchManager; + } + + @Override + public synchronized SearchResult showLessSearchResult(String searchText) { + this.filterModelList = new SearchResult(); + this.lessModelList = new SearchResult(); + this.moreModelList = new SearchResult(); + if (DesignerEnvManager.getEnvManager().getAlphafineConfigManager().isContainAction()) { + List updateActions = UpdateActionManager.getUpdateActionManager().getUpdateActions(); + for (UpdateAction updateAction : updateActions) { + if (updateAction.getName() != null && updateAction.getName().toLowerCase().contains(searchText.toLowerCase())) { + filterModelList.add(new ActionModel(updateAction.getName() ,updateAction)); + } + } + final int length = Math.min(5, filterModelList.size()); + for (int i = 0; i < length; i++) { + lessModelList.add(filterModelList.get(i)); + } + for (int i = length; i < filterModelList.size(); i++) { + moreModelList.add(filterModelList.get(i)); + } + if (filterModelList.size() > 0) { + if (filterModelList.size() > 5) { + lessModelList.add(0, new MoreModel("设置", "显示全部",true, CellType.ACTION)); + } else { + lessModelList.add(0, new MoreModel("设置", CellType.ACTION)); + } + } + } + return lessModelList; + } + + @Override + public SearchResult showMoreSearchResult() { + return moreModelList; + } +} diff --git a/designer/src/com/fr/design/mainframe/alphafine/searchManager/AlphaFineSearchProcessor.java b/designer/src/com/fr/design/mainframe/alphafine/searchManager/AlphaFineSearchProcessor.java new file mode 100644 index 000000000..eb1b2b68d --- /dev/null +++ b/designer/src/com/fr/design/mainframe/alphafine/searchManager/AlphaFineSearchProcessor.java @@ -0,0 +1,12 @@ +package com.fr.design.mainframe.alphafine.searchManager; + +import com.fr.design.mainframe.alphafine.model.SearchResult; + +/** + * Created by XiaXiang on 2017/3/27. + */ +public interface AlphaFineSearchProcessor { + SearchResult showLessSearchResult(String searchText); + + SearchResult showMoreSearchResult(); +} diff --git a/designer/src/com/fr/design/mainframe/alphafine/searchManager/AlphaSearchManager.java b/designer/src/com/fr/design/mainframe/alphafine/searchManager/AlphaSearchManager.java new file mode 100644 index 000000000..2b840615b --- /dev/null +++ b/designer/src/com/fr/design/mainframe/alphafine/searchManager/AlphaSearchManager.java @@ -0,0 +1,88 @@ +package com.fr.design.mainframe.alphafine.searchManager; + +import com.fr.design.mainframe.alphafine.AlphaFineHelper; +import com.fr.design.mainframe.alphafine.cell.cellModel.MoreModel; +import com.fr.design.mainframe.alphafine.model.SearchResult; + +import java.io.*; + +/** + * Created by XiaXiang on 2017/3/28. + */ +public class AlphaSearchManager implements AlphaFineSearchProcessor { + private static AlphaSearchManager searchManager; + private static PluginSearchManager pluginSearchManager; + private static DocumentSearchManager documentSearchManager; + private static FileSearchManager fileSearchManager; + private static ActionSearchManager actionSearchManager; + private static ConcludeSearchManager concludeSearchManager; + private static LatestSearchManager latestSearchManager; + + public synchronized static AlphaSearchManager getSearchManager() { + init(); + return searchManager; + + } + + private synchronized static void init() { + if (searchManager == null) { + searchManager = new AlphaSearchManager(); + pluginSearchManager = PluginSearchManager.getPluginSearchManager(); + documentSearchManager = DocumentSearchManager.getDocumentSearchManager(); + fileSearchManager = FileSearchManager.getFileSearchManager(); + actionSearchManager = ActionSearchManager.getActionSearchManager(); + concludeSearchManager = ConcludeSearchManager.getConcludeSearchManager(); + latestSearchManager = LatestSearchManager.getLatestSearchManager(); + } + } + + @Override + public synchronized SearchResult showLessSearchResult(String searchText) { + SearchResult latestModelList = latestSearchManager.showLessSearchResult(searchText); + SearchResult concludeModelList = concludeSearchManager.showLessSearchResult(searchText); + SearchResult actionModelList = actionSearchManager.showLessSearchResult(searchText); + SearchResult fileModelList = fileSearchManager.showLessSearchResult(searchText); + SearchResult documentModelList = documentSearchManager.showLessSearchResult(searchText); + SearchResult pluginModelList = pluginSearchManager.showLessSearchResult(searchText); + latestModelList.addAll(concludeModelList); + latestModelList.addAll(actionModelList); + latestModelList.addAll(fileModelList); + latestModelList.addAll(documentModelList); + latestModelList.addAll(pluginModelList); + return latestModelList; + } + + public SearchResult showDefaultSearchResult() { + SearchResult searchResult = new SearchResult(); + searchResult.add(new MoreModel("本地常用")); + searchResult.add(new MoreModel("猜您喜欢")); + searchResult.add(new MoreModel("设置")); + searchResult.add(new MoreModel("模板")); + searchResult.add(new MoreModel("帮助文档")); + searchResult.add(new MoreModel("应用中心")); + return searchResult; + } + + @Override + public SearchResult showMoreSearchResult() { + return null; + } + + public SearchResult getLatestSearchResult() { + ObjectInputStream is; + SearchResult searchResult; + try { + is = new ObjectInputStream(new FileInputStream(AlphaFineHelper.getInfoFile())); + searchResult = (SearchResult) is.readObject(); + + } catch (IOException e) { + searchResult = new SearchResult(); + } catch (ClassNotFoundException e) { + searchResult = new SearchResult(); + + } + return searchResult; + + } + +} diff --git a/designer/src/com/fr/design/mainframe/alphafine/searchManager/ConcludeSearchManager.java b/designer/src/com/fr/design/mainframe/alphafine/searchManager/ConcludeSearchManager.java new file mode 100644 index 000000000..8b1dc33d2 --- /dev/null +++ b/designer/src/com/fr/design/mainframe/alphafine/searchManager/ConcludeSearchManager.java @@ -0,0 +1,31 @@ +package com.fr.design.mainframe.alphafine.searchManager; + +import com.fr.design.mainframe.alphafine.cell.cellModel.MoreModel; +import com.fr.design.mainframe.alphafine.model.SearchResult; + +/** + * Created by XiaXiang on 2017/3/31. + */ +public class ConcludeSearchManager implements AlphaFineSearchProcessor { + private static ConcludeSearchManager concludeSearchManager = null; + private SearchResult modelList; + + public synchronized static ConcludeSearchManager getConcludeSearchManager() { + if (concludeSearchManager == null) { + concludeSearchManager = new ConcludeSearchManager(); + } + return concludeSearchManager; + } + @Override + public synchronized SearchResult showLessSearchResult(String searchText) { + this.modelList = new SearchResult(); + modelList.add(new MoreModel("猜您需要", false)); + return modelList; + } + + @Override + public SearchResult showMoreSearchResult() { + return null; + } + +} diff --git a/designer/src/com/fr/design/mainframe/alphafine/searchManager/DocumentSearchManager.java b/designer/src/com/fr/design/mainframe/alphafine/searchManager/DocumentSearchManager.java new file mode 100644 index 000000000..a5af9be28 --- /dev/null +++ b/designer/src/com/fr/design/mainframe/alphafine/searchManager/DocumentSearchManager.java @@ -0,0 +1,90 @@ +package com.fr.design.mainframe.alphafine.searchManager; + +import com.fr.design.DesignerEnvManager; +import com.fr.design.mainframe.alphafine.AlphaFineConstants; +import com.fr.design.mainframe.alphafine.CellType; +import com.fr.design.mainframe.alphafine.cell.cellModel.DocumentModel; +import com.fr.design.mainframe.alphafine.cell.cellModel.MoreModel; +import com.fr.design.mainframe.alphafine.model.SearchResult; +import com.fr.general.FRLogger; +import com.fr.general.http.HttpClient; +import com.fr.json.JSONArray; +import com.fr.json.JSONException; +import com.fr.json.JSONObject; + +import java.security.AlgorithmConstraints; + +/** + * Created by XiaXiang on 2017/3/27. + */ +public class DocumentSearchManager implements AlphaFineSearchProcessor { + private static DocumentSearchManager documentSearchManager = null; + private SearchResult lessModelList; + private SearchResult moreModelList; + + public synchronized static DocumentSearchManager getDocumentSearchManager() { + if (documentSearchManager == null) { + documentSearchManager = new DocumentSearchManager(); + + } + return documentSearchManager; + } + + @Override + public synchronized SearchResult showLessSearchResult(String searchText) { + this.lessModelList = new SearchResult(); + this.moreModelList = new SearchResult(); + if (DesignerEnvManager.getEnvManager().getAlphafineConfigManager().isContainDocument()) { + String result; + String url = "http://help.finereport.com/?api-search-title-" + searchText + "-1"; + HttpClient httpClient = new HttpClient(url); + httpClient.setTimeout(5000); + httpClient.asGet(); + result = httpClient.getResponseText(); + try { + JSONObject jsonObject = new JSONObject(result); + JSONArray jsonArray = null; + if (jsonObject.get("docdata") != null) { + jsonArray = (JSONArray) jsonObject.get("docdata"); + } + if (jsonArray.length() > 0) { + if (jsonArray.length() > 5) { + lessModelList.add(new MoreModel("帮助文档", "显示全部",true, CellType.DOCUMENT)); + } else { + lessModelList.add(new MoreModel("帮助文档", CellType.DOCUMENT)); + } + } + + final int length = Math.min(AlphaFineConstants.SHOW_SIZE, jsonArray.length()); + for (int i = 0; i < length; i++) { + DocumentModel cellModel = getDocumentModel(jsonArray, i); + this.lessModelList.add(cellModel); + } + for (int i = length; i < jsonArray.length(); i++) { + DocumentModel cellModel = getDocumentModel(jsonArray, i); + this.moreModelList.add(cellModel); + } + + } catch (JSONException e) { + FRLogger.getLogger().error(e.getMessage()); + return lessModelList; + } + + } + return lessModelList; + } + + private DocumentModel getDocumentModel(JSONArray jsonArray, int i) throws JSONException { + JSONObject object = jsonArray.getJSONObject(i); + String name = (String) object.get("title"); + String content = ((String) object.get("summary")); + String documentUrl = AlphaFineConstants.DOCUMENT_SEARCH_URL + object.get("did") + ".html"; + return new DocumentModel(name, content, documentUrl); + } + + @Override + public SearchResult showMoreSearchResult() { + return moreModelList; + } + +} diff --git a/designer/src/com/fr/design/mainframe/alphafine/searchManager/FileSearchManager.java b/designer/src/com/fr/design/mainframe/alphafine/searchManager/FileSearchManager.java new file mode 100644 index 000000000..29bfba0bd --- /dev/null +++ b/designer/src/com/fr/design/mainframe/alphafine/searchManager/FileSearchManager.java @@ -0,0 +1,137 @@ +package com.fr.design.mainframe.alphafine.searchManager; + +import com.fr.base.Env; +import com.fr.base.FRContext; +import com.fr.design.DesignerEnvManager; +import com.fr.design.mainframe.alphafine.AlphaFineConstants; +import com.fr.design.mainframe.alphafine.CellType; +import com.fr.design.mainframe.alphafine.cell.cellModel.FileModel; +import com.fr.design.mainframe.alphafine.cell.cellModel.MoreModel; +import com.fr.design.mainframe.alphafine.model.SearchResult; +import com.fr.file.filetree.FileNode; +import com.fr.general.FRLogger; +import com.fr.stable.StableUtils; +import com.fr.stable.project.ProjectConstants; + +import java.io.*; +import java.util.ArrayList; +import java.util.List; + +/** + * Created by XiaXiang on 2017/3/27. + */ +public class FileSearchManager implements AlphaFineSearchProcessor { + private SearchResult filterModelList; + private SearchResult lessModelList; + private SearchResult moreModelList; + private List fileNodes = null; + private static FileSearchManager fileSearchManager = null; + + public synchronized static FileSearchManager getFileSearchManager() { + init(); + return fileSearchManager; + } + + public synchronized static void init() { + if (fileSearchManager == null) { + fileSearchManager = new FileSearchManager(); + } + } + + public synchronized SearchResult showLessSearchResult(String searchText) { + this.filterModelList = new SearchResult(); + this.lessModelList = new SearchResult(); + this.moreModelList = new SearchResult(); + Env env = FRContext.getCurrentEnv(); + fileNodes = new ArrayList<>(); + fileNodes = listTpl(env, ProjectConstants.REPORTLETS_NAME, true); + for (FileNode node : fileNodes) { + boolean hasName = false; + String fileEnvPath = node.getEnvPath(); + String filePath = StableUtils.pathJoin(env.getPath(), fileEnvPath); + if (DesignerEnvManager.getEnvManager().getAlphafineConfigManager().isContainTemplate()) { + if (node.getName().toLowerCase().contains(searchText.toLowerCase())) { + FileModel model = new FileModel(node.getName(), node.getEnvPath().substring(node.getName().length(), node.getEnvPath().length()),node.getEnvPath()); + this.filterModelList.add(model); + hasName = true; + } + } + + if (DesignerEnvManager.getEnvManager().getAlphafineConfigManager().isContainFileContent()) { + //文件的内容搜索 + try { + BufferedReader reader = new BufferedReader(new FileReader(filePath)); + String line; + int columnNumber; + boolean test = false; + while ((line = reader.readLine()) != null) { + columnNumber = line.toLowerCase().indexOf(searchText); + if (columnNumber != -1) { + test = true; + } + } + if (test && !hasName) { + FileModel model = new FileModel(node.getName(), node.getEnvPath().substring(node.getName().length(), node.getEnvPath().length()),node.getEnvPath()); + this.filterModelList.add(model); + } + reader.close(); + } catch (FileNotFoundException e) { + FRLogger.getLogger().error(e.getMessage()); + } catch (IOException e) { + FRLogger.getLogger().error(e.getMessage()); + } + } + + } + + final int length = Math.min(AlphaFineConstants.SHOW_SIZE, filterModelList.size()); + for (int i = 0; i < length; i++) { + lessModelList.add(filterModelList.get(i)); + } + for (int i = length; i< filterModelList.size(); i++) { + moreModelList.add(filterModelList.get(i)); + } + if (filterModelList.size() > 0) { + if (filterModelList.size() > AlphaFineConstants.SHOW_SIZE) { + lessModelList.add(0,new MoreModel("模板", "显示全部",true, CellType.FILE)); + } else { + lessModelList.add(0,new MoreModel("模板", CellType.FILE)); + } + } + + + return this.lessModelList; + } + + @Override + public SearchResult showMoreSearchResult() { + return moreModelList; + } + + private List listTpl(Env env, String rootFilePath, boolean recurse) { + List fileNodeList = new ArrayList(); + try { + listAll(env, rootFilePath, fileNodeList, recurse); + } catch (Exception e) { + FRContext.getLogger().error(e.getMessage(), e); + } + return fileNodeList; + } + + private void listAll(Env env, String rootFilePath, List nodeList, boolean recurse) throws Exception { + FileNode[] fns = env.listFile(rootFilePath); + for (int i = 0; i < fns.length; i++) { + FileNode fileNode = fns[i]; + if (fileNode.isDirectory()) { + if (recurse) { + listAll(env, rootFilePath + File.separator + fns[i].getName(), nodeList, true); + } else { + nodeList.add(fns[i]); + } + } else { + nodeList.add(fileNode); + } + } + } + +} diff --git a/designer/src/com/fr/design/mainframe/alphafine/searchManager/LatestSearchManager.java b/designer/src/com/fr/design/mainframe/alphafine/searchManager/LatestSearchManager.java new file mode 100644 index 000000000..c9747daf3 --- /dev/null +++ b/designer/src/com/fr/design/mainframe/alphafine/searchManager/LatestSearchManager.java @@ -0,0 +1,53 @@ +package com.fr.design.mainframe.alphafine.searchManager; + +import com.fr.design.mainframe.alphafine.cell.cellModel.MoreModel; +import com.fr.design.mainframe.alphafine.model.SearchResult; + +/** + * Created by XiaXiang on 2017/3/31. + */ +public class LatestSearchManager implements AlphaFineSearchProcessor { + private static LatestSearchManager latestSearchManager = null; + private SearchResult modelList; + private SearchResult latestModelList; + + public synchronized static LatestSearchManager getLatestSearchManager() { + if (latestSearchManager == null) { + latestSearchManager = new LatestSearchManager(); + } + return latestSearchManager; + } + @Override + public synchronized SearchResult showLessSearchResult(String searchText) { + this.modelList = new SearchResult(); + modelList.add(new MoreModel("本地常用", false)); + if (getLatestModelList() != null && getLatestModelList().size() > 0) { + modelList.addAll(getLatestModelList()); + } + return modelList; + } + + @Override + public SearchResult showMoreSearchResult() { + return null; + } + + public SearchResult getModelList() { + return modelList; + } + + public void setModelList(SearchResult modelList) { + this.modelList = modelList; + } + + public SearchResult getLatestModelList() { + if(this.latestModelList != null && this.latestModelList.size() > 0) { + return this.latestModelList; + } + return AlphaSearchManager.getSearchManager().getLatestSearchResult(); + } + + public void setLatestModelList(SearchResult latestModelList) { + this.latestModelList = latestModelList; + } +} diff --git a/designer/src/com/fr/design/mainframe/alphafine/searchManager/PluginSearchManager.java b/designer/src/com/fr/design/mainframe/alphafine/searchManager/PluginSearchManager.java new file mode 100644 index 000000000..d0dd49780 --- /dev/null +++ b/designer/src/com/fr/design/mainframe/alphafine/searchManager/PluginSearchManager.java @@ -0,0 +1,104 @@ +package com.fr.design.mainframe.alphafine.searchManager; + +import com.fr.design.DesignerEnvManager; +import com.fr.design.mainframe.alphafine.AlphaFineConstants; +import com.fr.design.mainframe.alphafine.CellType; +import com.fr.design.mainframe.alphafine.cell.cellModel.PluginModel; +import com.fr.design.mainframe.alphafine.cell.cellModel.MoreModel; +import com.fr.design.mainframe.alphafine.model.SearchResult; +import com.fr.general.ComparatorUtils; +import com.fr.general.FRLogger; +import com.fr.general.http.HttpClient; +import com.fr.json.JSONArray; +import com.fr.json.JSONException; +import com.fr.json.JSONObject; + +import java.net.URLEncoder; + +/** + * Created by XiaXiang on 2017/3/27. + */ +public class PluginSearchManager implements AlphaFineSearchProcessor { + private static PluginSearchManager pluginSearchManager = null; + private SearchResult lessModelList; + private SearchResult moreModelList; + + public synchronized static PluginSearchManager getPluginSearchManager() { + if (pluginSearchManager == null) { + pluginSearchManager = new PluginSearchManager(); + } + return pluginSearchManager; + + } + + @Override + public synchronized SearchResult showLessSearchResult(String searchText) { + + this.lessModelList = new SearchResult(); + this.moreModelList = new SearchResult(); + if (DesignerEnvManager.getEnvManager().getAlphafineConfigManager().isContainPlugin()) { + String result; + try { + String encodedKey = URLEncoder.encode(searchText, "UTF-8"); + String url = AlphaFineConstants.PLUGIN_SEARCH_URL + "?keyword=" + encodedKey; + HttpClient httpClient = new HttpClient(url); + httpClient.setTimeout(5000); + httpClient.asGet(); + result = httpClient.getResponseText(); + JSONObject jsonObject = new JSONObject(result); + JSONArray jsonArray = null; + if (jsonObject.get("result") != null) { + jsonArray = (JSONArray) jsonObject.get("result"); + } + if (jsonArray.length() > 0) { + if (jsonArray.length() > AlphaFineConstants.SHOW_SIZE) { + lessModelList.add(new MoreModel("应用中心", "显示全部",true, CellType.PLUGIN)); + } else { + lessModelList.add(new MoreModel("应用中心", CellType.PLUGIN)); + } + } + + int length = Math.min(5, jsonArray.length()); + for (int i = 0; i < length; i++) { + PluginModel cellModel = getPluginModel(jsonArray, i); + this.lessModelList.add(cellModel); + } + for (int i = length; i < jsonArray.length(); i++) { + PluginModel cellModel = getPluginModel(jsonArray, i); + this.moreModelList.add(cellModel); + } + } catch (Exception e) { + FRLogger.getLogger().error(e.getMessage()); + return lessModelList; + } + } + return this.lessModelList; + } + + private PluginModel getPluginModel(JSONArray jsonArray, int i) throws JSONException { + JSONObject object = jsonArray.getJSONObject(i); + String name = (String) object.get("name"); + String content = ((String) object.get("description")); + String pluginUrl = AlphaFineConstants.REUSE_IMAGE_URL + object.get("id"); + String imageUrl = ((String) object.get("pic")); + String version = null; + String jartime = null; + CellType type = CellType.REUSE; + String link = (String) object.get("link"); + if (ComparatorUtils.equals(link, "plugin")) { + version = (String) object.get("version"); + jartime = (String) object.get("jartime"); + type = CellType.PLUGIN; + pluginUrl = AlphaFineConstants.PLUGIN_IMAGE_URL + object.get("id"); + } + int price = (int) object.get("price"); + return new PluginModel(name, content, pluginUrl, imageUrl, version, jartime, type, price); + } + + @Override + public SearchResult showMoreSearchResult() { + return this.moreModelList; + } + + +} diff --git a/designer/src/com/fr/start/Designer.java b/designer/src/com/fr/start/Designer.java index 09b7fa76e..276c11b96 100644 --- a/designer/src/com/fr/start/Designer.java +++ b/designer/src/com/fr/start/Designer.java @@ -20,6 +20,7 @@ import com.fr.design.gui.imenu.UIMenuItem; import com.fr.design.gui.imenu.UIPopupMenu; import com.fr.design.gui.itoolbar.UILargeToolbar; import com.fr.design.mainframe.*; +import com.fr.design.mainframe.alphafine.component.AlphaFinePane; import com.fr.design.mainframe.bbs.UserInfoLabel; import com.fr.design.mainframe.bbs.UserInfoPane; import com.fr.design.mainframe.toolbar.ToolBarMenuDockPlus; @@ -338,7 +339,17 @@ public class Designer extends BaseDesigner { } return userInfoPane; } - + + /** + * 创建alphafine打开面板 + * + * @return 面板组件 + */ + public Component createAlphafinePane() { + return AlphaFinePane.createAlphaFinePane(); + } + + protected SplashPane createSplashPane() { return new ReportSplashPane(); } diff --git a/designer_base/src/com/fr/design/DesignerEnvManager.java b/designer_base/src/com/fr/design/DesignerEnvManager.java index f0dc742c0..109da0eef 100644 --- a/designer_base/src/com/fr/design/DesignerEnvManager.java +++ b/designer_base/src/com/fr/design/DesignerEnvManager.java @@ -3,11 +3,9 @@ */ package com.fr.design; -import com.fr.base.BaseXMLUtils; -import com.fr.base.Env; -import com.fr.base.FRContext; -import com.fr.base.Utils; +import com.fr.base.*; import com.fr.dav.LocalEnv; +import com.fr.design.actions.help.AlphaFine.AlphafineConfigManager; import com.fr.design.constants.UIConstants; import com.fr.env.RemoteEnv; import com.fr.env.SignIn; @@ -29,8 +27,6 @@ import java.util.Map.Entry; import java.util.logging.FileHandler; import java.util.logging.Handler; import java.util.logging.Level; -import java.util.logging.LogRecord; -import java.util.logging.SimpleFormatter; /** * The manager of Designer GUI. @@ -99,7 +95,7 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { private int bbsUid; //当前设计器用户的昵称显示(带消息) private String inShowBBsName; - //上一次登录弹窗的时间, 为了控制一天只弹一次窗口 + //上一次登录弹窗的时间, 为了控制一天只弹一次窗口 private String lastShowBBSTime; //上一次资讯弹窗时间, 为了控制一天只弹一次 private String lastShowBBSNewsTime; @@ -108,23 +104,28 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { //记录当前激活码的在线激活状态. private int activeKeyStatus = -1; private boolean joinProductImprove = true; - - + + /** + * alphafine + */ + private AlphafineConfigManager alphafineConfigManager = new AlphafineConfigManager(); + + public static final String CAS_CERTIFICATE_PATH = "certificatePath"; - + public static final String CAS_CERTIFICATE_PASSWORD = "certificatePass"; - + public static final String CAS_PARAS = "CASParas"; - + //https链接所需的证书路径 private String certificatePath = StringUtils.EMPTY; - + //https链接所需的证书密码 private String certificatePass = StringUtils.EMPTY; - + //是否启用https连接 private boolean isHttps = false; - + private static List mapWorkerList = new ArrayList(); /** @@ -228,7 +229,7 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { StableUtils.makesureFileExist(new java.io.File(fileName)); } Handler handler = new FileHandler(fileName, true); - + handler.setFormatter(new FRLogFormatter()); FRContext.getLogger().addLogHandler(handler); } catch (SecurityException e) { @@ -238,7 +239,7 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { } } } - + private File getDesignerEnvFile() { File envFile = getEnvFile(); // james:FineReportEnv.xml文件没有必要做兼容,里面保存的主要是界面布局以及设计器激活的信息 @@ -284,38 +285,38 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { } return envFile; } - + /** * 是否启用了https * @return 同上 */ public boolean isHttps() { - return isHttps; - } + return isHttps; + } - public void setHttps(boolean isHttps) { - this.isHttps = isHttps; - } + public void setHttps(boolean isHttps) { + this.isHttps = isHttps; + } - public String getCertificatePath() { - return certificatePath; - } + public String getCertificatePath() { + return certificatePath; + } - public void setCertificatePath(String certificatePath) { - this.certificatePath = certificatePath; - } + public void setCertificatePath(String certificatePath) { + this.certificatePath = certificatePath; + } - public String getCertificatePass() { - return certificatePass; - } - - public void setCertificatePass(String certificatePass){ - this.certificatePass = certificatePass; - } + public String getCertificatePass() { + return certificatePass; + } + + public void setCertificatePass(String certificatePass){ + this.certificatePass = certificatePass; + } /** * 返回上次打开的模板文件 @@ -532,40 +533,40 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { public void setReportLengthUnit(short reportLengthUnit) { this.reportLengthUnit = reportLengthUnit; } - + private void writeTempFile(File tempFile){ - try{ - OutputStream fout = new FileOutputStream(tempFile); - XMLTools.writeOutputStreamXML(this, fout); - fout.flush(); - fout.close(); - }catch (Exception e) { - FRContext.getLogger().error(e.getMessage()); - } - } - - /** - * 保存设计器的配置文件, 该文件不在env的resource目录下 - * 而是在Consts.getEnvHome() + File.separator + Consts.APP_NAME - * - * - * @date 2014-9-29-上午11:04:23 - * - */ + try{ + OutputStream fout = new FileOutputStream(tempFile); + XMLTools.writeOutputStreamXML(this, fout); + fout.flush(); + fout.close(); + }catch (Exception e) { + FRContext.getLogger().error(e.getMessage()); + } + } + + /** + * 保存设计器的配置文件, 该文件不在env的resource目录下 + * 而是在Consts.getEnvHome() + File.separator + Consts.APP_NAME + * + * + * @date 2014-9-29-上午11:04:23 + * + */ public void saveXMLFile() { - File xmlFile = this.getDesignerEnvFile(); - if (xmlFile == null) { - return; - } - if (!xmlFile.getParentFile().exists()) {//建立目录. - StableUtils.mkdirs(xmlFile.getParentFile()); - } - - String tempName = xmlFile.getName() + ProjectConstants.TEMP_SUFFIX; - File tempFile = new File(xmlFile.getParentFile(), tempName); - - writeTempFile(tempFile); - IOUtils.renameTo(tempFile, xmlFile); + File xmlFile = this.getDesignerEnvFile(); + if (xmlFile == null) { + return; + } + if (!xmlFile.getParentFile().exists()) {//建立目录. + StableUtils.mkdirs(xmlFile.getParentFile()); + } + + String tempName = xmlFile.getName() + ProjectConstants.TEMP_SUFFIX; + File tempFile = new File(xmlFile.getParentFile(), tempName); + + writeTempFile(tempFile); + IOUtils.renameTo(tempFile, xmlFile); } /** @@ -574,26 +575,26 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { public void setOracleSystemSpace(boolean displayOracleSystem) { this.useOracleSystemSpace = displayOracleSystem; } - - /** - * 是否加入产品改良 - * - * @return 是否加入产品改良 - * - */ - public boolean isJoinProductImprove() { - return joinProductImprove; - } - - /** - * 设置加入产品改良 - * - */ - public void setJoinProductImprove(boolean joinProductImprove) { - this.joinProductImprove = joinProductImprove; - } - - /** + + /** + * 是否加入产品改良 + * + * @return 是否加入产品改良 + * + */ + public boolean isJoinProductImprove() { + return joinProductImprove; + } + + /** + * 设置加入产品改良 + * + */ + public void setJoinProductImprove(boolean joinProductImprove) { + this.joinProductImprove = joinProductImprove; + } + + /** * 是否磁盘空间参数 * * @return 是则返回true @@ -1141,20 +1142,20 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { } public String getBBSName() { - return bbsName; - } + return bbsName; + } + + public void setBBSName(String bbsName) { + this.bbsName = bbsName; + } - public void setBBSName(String bbsName) { - this.bbsName = bbsName; - } - public String getBBSPassword() { - return bbsPassword; - } + return bbsPassword; + } - public void setBBSPassword(String bbsPassword) { - this.bbsPassword = bbsPassword; - } + public void setBBSPassword(String bbsPassword) { + this.bbsPassword = bbsPassword; + } public int getBbsUid() { return bbsUid; @@ -1171,115 +1172,115 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { public String getInShowBBsName() { return inShowBBsName; } - - public String getLastShowBBSTime() { - return lastShowBBSTime; - } - - public void setLastShowBBSTime(String lastShowBBSTime) { - this.lastShowBBSTime = lastShowBBSTime; - } - - public String getLastShowBBSNewsTime() { - return lastShowBBSNewsTime; - } - - public void setLastShowBBSNewsTime(String lastShowBBSNewsTime) { - this.lastShowBBSNewsTime = lastShowBBSNewsTime; - } - - private void readXMLVersion(XMLableReader reader){ - String tmpVal; + + public String getLastShowBBSTime() { + return lastShowBBSTime; + } + + public void setLastShowBBSTime(String lastShowBBSTime) { + this.lastShowBBSTime = lastShowBBSTime; + } + + public String getLastShowBBSNewsTime() { + return lastShowBBSNewsTime; + } + + public void setLastShowBBSNewsTime(String lastShowBBSNewsTime) { + this.lastShowBBSNewsTime = lastShowBBSNewsTime; + } + + private void readXMLVersion(XMLableReader reader){ + String tmpVal; if ((tmpVal = reader.getElementValue()) != null) { reader.setXmlVersionByString(tmpVal); } - } - - private void readActiveKey(XMLableReader reader){ - String tmpVal; + } + + private void readActiveKey(XMLableReader reader){ + String tmpVal; if ((tmpVal = reader.getElementValue()) != null) { this.setActivationKey(tmpVal); } - } - - private void readLogLocation(XMLableReader reader){ - String tmpVal; + } + + private void readLogLocation(XMLableReader reader){ + String tmpVal; if ((tmpVal = reader.getElementValue()) != null) { this.setLogLocation(tmpVal); } - } - - private void readLanguage(XMLableReader reader){ - String tmpVal; + } + + private void readLanguage(XMLableReader reader){ + String tmpVal; if ((tmpVal = reader.getElementValue()) != null) { this.setLanguage(Integer.parseInt(tmpVal)); } - } - - private void readJettyPort(XMLableReader reader){ - String tmpVal; + } + + private void readJettyPort(XMLableReader reader){ + String tmpVal; if ((tmpVal = reader.getElementValue()) != null) { this.setJettyServerPort(Integer.parseInt(tmpVal)); } - } - - private void readPageLengthUnit(XMLableReader reader){ - String tmpVal; + } + + private void readPageLengthUnit(XMLableReader reader){ + String tmpVal; if (StringUtils.isNotBlank(tmpVal = reader.getElementValue())) { this.pageLengthUnit = Short.parseShort(tmpVal); } - } - - private void readReportLengthUnit(XMLableReader reader){ - String tmpVal; + } + + private void readReportLengthUnit(XMLableReader reader){ + String tmpVal; if (StringUtils.isNotBlank(tmpVal = reader.getElementValue())) { this.reportLengthUnit = Short.parseShort(tmpVal); } - } - - private void readLastOpenFile(XMLableReader reader){ - String tmpVal; + } + + private void readLastOpenFile(XMLableReader reader){ + String tmpVal; if (StringUtils.isNotBlank(tmpVal = reader.getElementValue())) { this.lastOpenFilePath = tmpVal; } - } - - private void readEncrytionKey(XMLableReader reader){ - String tmpVal; + } + + private void readEncrytionKey(XMLableReader reader){ + String tmpVal; if (StringUtils.isNotBlank(tmpVal = reader.getElementValue())) { this.encryptionKey = tmpVal; } - } - - private void readBBSName(XMLableReader reader){ - String tmpVal; + } + + private void readBBSName(XMLableReader reader){ + String tmpVal; if (StringUtils.isNotBlank(tmpVal = reader.getElementValue())) { this.bbsName = tmpVal; } - } - - private void readBBSPassword(XMLableReader reader){ - String tmpVal; + } + + private void readBBSPassword(XMLableReader reader){ + String tmpVal; if (StringUtils.isNotBlank(tmpVal = reader.getElementValue())) { this.bbsPassword = CodeUtils.passwordDecode(tmpVal); } - } - - private void readLastBBSTime(XMLableReader reader){ - String tmpVal; - if (StringUtils.isNotBlank(tmpVal = reader.getElementValue())) { - this.lastShowBBSTime = tmpVal; - } - } - - private void readLastBBSNewsTime(XMLableReader reader){ - String tmpVal; - if (StringUtils.isNotBlank(tmpVal = reader.getElementValue())) { - this.lastShowBBSNewsTime = tmpVal; - } - } - - /** + } + + private void readLastBBSTime(XMLableReader reader){ + String tmpVal; + if (StringUtils.isNotBlank(tmpVal = reader.getElementValue())) { + this.lastShowBBSTime = tmpVal; + } + } + + private void readLastBBSNewsTime(XMLableReader reader){ + String tmpVal; + if (StringUtils.isNotBlank(tmpVal = reader.getElementValue())) { + this.lastShowBBSNewsTime = tmpVal; + } + } + + /** * Read XML.
* The method will be invoked when read data from XML file.
* May override the method to read the data that you saved. @@ -1291,7 +1292,7 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { if (reader.isChildNode()) { String name = reader.getTagName(); if (name.equals("XMLVersion")) {// 兼容09.12.30前把XMLVersion写在根目录下的第一个标签中 - readXMLVersion(reader); + readXMLVersion(reader); } else if (name.equals("Attributes")) { this.readAttributes(reader); } else if (name.equals("ReportPaneAttributions")) { @@ -1301,55 +1302,61 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { } else if ("Envs".equals(name) || name.equals("ReportServerMap")) { this.readCurEnv(reader); } else if (name.equals("ActivationKey")) { - readActiveKey(reader); + readActiveKey(reader); } else if ("LogLocation".equals(name)) { - readLogLocation(reader); + readLogLocation(reader); } else if ("LogLevel".equals(name)) { this.readLogLevel(reader); } else if ("Language".equals(name)) { - readLanguage(reader); + readLanguage(reader); } else if ("JettyServerPort".equals(name)) { - readJettyPort(reader); + readJettyPort(reader); } else if ("PLengthUnit".equals(name)) { - readPageLengthUnit(reader); + readPageLengthUnit(reader); } else if ("RLengthUnit".equals(name)) { - readReportLengthUnit(reader); + readReportLengthUnit(reader); } else if ("LastOpenFilePath".equals(name)) { - readLastOpenFile(reader); + readLastOpenFile(reader); } else if ("EncryptionKey".equals(name)) { - readEncrytionKey(reader); + readEncrytionKey(reader); } else if ("jdkHome".equals(name)) { this.jdkHome = reader.getElementValue(); } else if ("bbsName".equals(name)){ - readBBSName(reader); + readBBSName(reader); } else if ("bbsPassword".equals(name)){ - readBBSPassword(reader); + readBBSPassword(reader); } else if ("lastBBSTime".equals(name)){ - readLastBBSTime(reader); + readLastBBSTime(reader); } else if ("lastBBSNewsTime".equals(name)){ - readLastBBSNewsTime(reader); + readLastBBSNewsTime(reader); }else if ("uuid".equals(name)){ - readUUID(reader); + readUUID(reader); } else if ("status".equals(name)){ - readActiveStatus(reader); + readActiveStatus(reader); } else if (ComparatorUtils.equals(CAS_PARAS,name)){ - readHttpsParas(reader); - }else { + readHttpsParas(reader); + } else if (name.equals("AlphaFineConfigManager")) { + readAlphaFineAttr(reader); + } else { readLayout(reader, name); } } } - + + private void readAlphaFineAttr(XMLableReader reader) { + reader.readXMLObject(this.alphafineConfigManager = new AlphafineConfigManager()); + } + private void readHttpsParas(XMLableReader reader){ - String tempVal; - if((tempVal = reader.getAttrAsString(CAS_CERTIFICATE_PATH, null)) != null){ - this.setCertificatePath(tempVal); - } - if((tempVal = reader.getAttrAsString(CAS_CERTIFICATE_PASSWORD, null)) != null){ - this.setCertificatePass(tempVal); - } - - this.setHttps(reader.getAttrAsBoolean("enable", false)); + String tempVal; + if((tempVal = reader.getAttrAsString(CAS_CERTIFICATE_PATH, null)) != null){ + this.setCertificatePath(tempVal); + } + if((tempVal = reader.getAttrAsString(CAS_CERTIFICATE_PASSWORD, null)) != null){ + this.setCertificatePass(tempVal); + } + + this.setHttps(reader.getAttrAsBoolean("enable", false)); } @@ -1367,7 +1374,7 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { this.setLastEastRegionToolPaneY(Integer.parseInt(tmpVal)); } if ((tmpVal = reader.getAttrAsString("containerWidth", null)) != null) { - // bug33217,705是好的,不知道711里因为什么把这段代码注释了,现打开 + // bug33217,705是好的,不知道711里因为什么把这段代码注释了,现打开 this.setLastEastRegionContainerWidth(Integer.parseInt(tmpVal)); } } @@ -1512,11 +1519,11 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { private void readLogLevel(XMLableReader reader) { - String level; - if ((level = reader.getElementValue()) != null) { - this.setLogLevel(FRLevel.getByName(level).getLevel()); - } - } + String level; + if ((level = reader.getElementValue()) != null) { + this.setLogLevel(FRLevel.getByName(level).getLevel()); + } + } /** @@ -1539,52 +1546,59 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { writeUUID(writer); writeActiveStatus(writer); writeHttpsParas(writer); + writeAlphaFineAttr(writer); writer.end(); } - - public String getUUID() { - return StringUtils.isEmpty(uuid) ? UUID.randomUUID().toString() : uuid; - } - - public int getActiveKeyStatus() { - return activeKeyStatus; - } - public void setActiveKeyStatus(int activeKeyStatus) { - this.activeKeyStatus = activeKeyStatus; - } + private void writeAlphaFineAttr(XMLPrintWriter writer) { + if (this.alphafineConfigManager != null) { + this.alphafineConfigManager.writeXML(writer); + } + } + + public String getUUID() { + return StringUtils.isEmpty(uuid) ? UUID.randomUUID().toString() : uuid; + } + + public int getActiveKeyStatus() { + return activeKeyStatus; + } + + public void setActiveKeyStatus(int activeKeyStatus) { + this.activeKeyStatus = activeKeyStatus; + } - //写入uuid + //写入uuid private void writeUUID(XMLPrintWriter writer){ - writer.startTAG("uuid"); - writer.textNode(getUUID()); - writer.end(); + writer.startTAG("uuid"); + writer.textNode(getUUID()); + writer.end(); } //读取uuid - private void readUUID(XMLableReader reader){ - String tmpVal; - if (StringUtils.isNotBlank(tmpVal = reader.getElementValue())) { - this.uuid = tmpVal; - } - } - - //写入激活状态 - private void writeActiveStatus(XMLPrintWriter writer){ - if (this.activeKeyStatus == 0){ - writer.startTAG("status"); - writer.textNode(this.activeKeyStatus + ""); - writer.end(); - } - } - - //读取激活状态 - private void readActiveStatus(XMLableReader reader){ - String tmpVal; - if (StringUtils.isNotBlank(tmpVal = reader.getElementValue())) { - this.activeKeyStatus = Integer.parseInt(tmpVal); - } - } + private void readUUID(XMLableReader reader){ + String tmpVal; + if (StringUtils.isNotBlank(tmpVal = reader.getElementValue())) { + this.uuid = tmpVal; + } + } + + //写入激活状态 + private void writeActiveStatus(XMLPrintWriter writer){ + if (this.activeKeyStatus == 0){ + writer.startTAG("status"); + writer.textNode(this.activeKeyStatus + ""); + writer.end(); + } + } + + //读取激活状态 + private void readActiveStatus(XMLableReader reader){ + String tmpVal; + if (StringUtils.isNotBlank(tmpVal = reader.getElementValue())) { + this.activeKeyStatus = Integer.parseInt(tmpVal); + } + } private void writeRecentOpenFileAndEnvList(XMLPrintWriter writer) { checkRecentOpenedFileNum(); @@ -1633,7 +1647,7 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { writer.attr("useOracleSystemSpace", this.isOracleSystemSpace()); } if (!this.isJoinProductImprove()){ - writer.attr("joinProductImprove", this.isJoinProductImprove()); + writer.attr("joinProductImprove", this.isJoinProductImprove()); } if (!this.isAutoBackUp()) { writer.attr("autoBackUp", this.isAutoBackUp()); @@ -1689,7 +1703,7 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { if (this.level != null) { writer.startTAG("LogLevel"); - writer.textNode(FRLevel.getByLevel(this.level).getName()); + writer.textNode(FRLevel.getByLevel(this.level).getName()); writer.end(); } if (StringUtils.isNotBlank(jdkHome)) { @@ -1697,7 +1711,7 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { writer.textNode(jdkHome); writer.end(); } - + writeBBSRelated(writer); writer.startTAG("PLengthUnit"); @@ -1715,46 +1729,46 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { writer.startTAG("Language").textNode(String.valueOf(this.language)).end() .startTAG("JettyServerPort").textNode(String.valueOf(this.jettyServerPort)).end(); } - + //写论坛相关的两个属性 private void writeBBSRelated(XMLPrintWriter writer){ if (StringUtils.isNotBlank(bbsName)) { - writer.startTAG("bbsName"); - writer.textNode(bbsName); - writer.end(); + writer.startTAG("bbsName"); + writer.textNode(bbsName); + writer.end(); } - + if (StringUtils.isNotBlank(bbsPassword)){ - writer.startTAG("bbsPassword"); - writer.textNode(CodeUtils.passwordEncode(bbsPassword)); - writer.end(); + writer.startTAG("bbsPassword"); + writer.textNode(CodeUtils.passwordEncode(bbsPassword)); + writer.end(); } - + if (StringUtils.isNotEmpty(this.lastShowBBSTime)){ - writer.startTAG("lastBBSTime"); - writer.textNode(lastShowBBSTime); - writer.end(); + writer.startTAG("lastBBSTime"); + writer.textNode(lastShowBBSTime); + writer.end(); } - + if (StringUtils.isNotEmpty(this.lastShowBBSNewsTime)){ - writer.startTAG("lastBBSNewsTime"); - writer.textNode(lastShowBBSNewsTime); - writer.end(); + writer.startTAG("lastBBSNewsTime"); + writer.textNode(lastShowBBSNewsTime); + writer.end(); } } - + private void writeHttpsParas(XMLPrintWriter writer){ - writer.startTAG(CAS_PARAS); - if(StringUtils.isNotBlank(certificatePath)){ - writer.attr(CAS_CERTIFICATE_PATH, certificatePath); - } - if(StringUtils.isNotBlank(certificatePass)){ - writer.attr(CAS_CERTIFICATE_PASSWORD, certificatePass); - } - if(isHttps){ - writer.attr("enable", true); - } - writer.end(); + writer.startTAG(CAS_PARAS); + if(StringUtils.isNotBlank(certificatePath)){ + writer.attr(CAS_CERTIFICATE_PATH, certificatePath); + } + if(StringUtils.isNotBlank(certificatePass)){ + writer.attr(CAS_CERTIFICATE_PASSWORD, certificatePass); + } + if(isHttps){ + writer.attr("enable", true); + } + writer.end(); } private void writeReportPaneAttributions(XMLPrintWriter writer) { @@ -1815,4 +1829,12 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { return env; } + + public AlphafineConfigManager getAlphafineConfigManager() { + return alphafineConfigManager; + } + + public void setAlphafineConfigManager(AlphafineConfigManager alphafineConfigManager) { + this.alphafineConfigManager = alphafineConfigManager; + } } \ No newline at end of file diff --git a/designer_base/src/com/fr/design/actions/help/AlphaFine/AlphafineAction.java b/designer_base/src/com/fr/design/actions/help/AlphaFine/AlphafineAction.java new file mode 100644 index 000000000..b45c9e97d --- /dev/null +++ b/designer_base/src/com/fr/design/actions/help/AlphaFine/AlphafineAction.java @@ -0,0 +1,62 @@ +package com.fr.design.actions.help.AlphaFine; + +import com.fr.base.BaseUtils; +import com.fr.design.DesignerEnvManager; +import com.fr.design.actions.UpdateAction; +import com.fr.design.dialog.BasicDialog; +import com.fr.design.dialog.DialogActionAdapter; +import com.fr.design.dialog.DialogActionListener; +import com.fr.design.mainframe.DesignerContext; +import com.fr.design.mainframe.DesignerFrame; +import com.fr.design.menu.MenuKeySet; +import com.fr.general.Inter; + +import javax.swing.*; +import java.awt.event.ActionEvent; + +/** + * Created by XiaXiang on 2017/4/1. + */ +public class AlphafineAction extends UpdateAction { + public AlphafineAction() { + this.setMenuKeySet(ALPHAFINE); + this.setName(getMenuKeySet().getMenuName()); + this.setMnemonic(getMenuKeySet().getMnemonic()); + this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/mainframe/alphafine/images/smallsearch.png")); + } + + public static final MenuKeySet ALPHAFINE = new MenuKeySet() { + @Override + public char getMnemonic() { + return 'D'; + } + + + + @Override + public String getMenuName() { + return Inter.getLocText("AlphaFine"); + } + + @Override + public KeyStroke getKeyStroke() { + return null; + } + }; + + @Override + public void actionPerformed(ActionEvent e) { + final DesignerFrame designerFrame = DesignerContext.getDesignerFrame(); + + final AlphafineConfigPane alphafineConfigPane = new AlphafineConfigPane(); + alphafineConfigPane.populate(DesignerEnvManager.getEnvManager().getAlphafineConfigManager()); + DialogActionListener dialogActionListener = new DialogActionAdapter() { + public void doOk() { + alphafineConfigPane.update(); + designerFrame.refreshToolbar(); + } + }; + BasicDialog basicDialog = alphafineConfigPane.showMediumWindow(designerFrame, dialogActionListener); + basicDialog.setVisible(true); + } +} diff --git a/designer_base/src/com/fr/design/actions/help/AlphaFine/AlphafineConfigManager.java b/designer_base/src/com/fr/design/actions/help/AlphaFine/AlphafineConfigManager.java new file mode 100644 index 000000000..2600c1129 --- /dev/null +++ b/designer_base/src/com/fr/design/actions/help/AlphaFine/AlphafineConfigManager.java @@ -0,0 +1,204 @@ +package com.fr.design.actions.help.AlphaFine; + +import com.fr.stable.OperatingSystem; +import com.fr.stable.xml.XMLPrintWriter; +import com.fr.stable.xml.XMLable; +import com.fr.stable.xml.XMLableReader; + +import javax.swing.*; + +/** + * Created by XiaXiang on 2017/4/5. + */ +public class AlphafineConfigManager implements XMLable { + /** + * 是否开启alphafine + */ + private boolean isEnabled; + + /** + * 是否联网搜索 + */ + private boolean isSearchOnLine; + + /** + * 快捷键设置 + */ + private String shortcuts = "meta + F"; + + /** + * 搜索范围 + */ + + /** + * 猜您需要 + */ + private boolean isContainConclude; + + /** + * 设置 + */ + private boolean isContainAction; + + /** + * 帮助文档 + */ + private boolean isContainDocument; + + /** + * 模板 + */ + private boolean isContainTemplate; + + /** + * 模板内容 + */ + private boolean isContainFileContent; + + /** + * 应用中心 + */ + private boolean isContainPlugin; + + /** + * 快捷键 + */ + private KeyStroke shortCutKeyStore; + + + + + + private static AlphafineConfigManager alphafineConfigManager = new AlphafineConfigManager(); + + public static AlphafineConfigManager getInstance() { + return alphafineConfigManager; + } + + @Override + public Object clone() throws CloneNotSupportedException { + return super.clone(); + } + + @Override + public void readXML(XMLableReader reader) { + if (reader.isAttr()) { + this.setEnabled(reader.getAttrAsBoolean("isEnabled", true)); + this.setContainPlugin(reader.getAttrAsBoolean("isContainDocument", true)); + this.setContainDocument(reader.getAttrAsBoolean("isContainDocument", true)); + this.setContainConclude(reader.getAttrAsBoolean("isContainConclude", true)); + this.setContainAction(reader.getAttrAsBoolean("isContainAction", true)); + this.setContainTemplate(reader.getAttrAsBoolean("isContainTemplate", true)); + this.setContainFileContent(reader.getAttrAsBoolean("isContainFileContent", false)); + this.setShortcuts(reader.getAttrAsString("shortcuts", "meta + f")); + + } + + } + + @Override + public void writeXML(XMLPrintWriter writer) { + writer.startTAG("AlphaFineConfigManager"); + writer.attr("isEnabled", this.isEnabled()) + .attr("isSearchOnline", this.isSearchOnLine()) + .attr("shortcuts", this.getShortcuts()) + .attr("isContainConclude", this.isContainConclude()) + .attr("isContainAction", this.isContainAction()) + .attr("isContainDocument", this.isContainDocument()) + .attr("isContainTemplate", this.isContainTemplate()) + .attr("isContainPlugin", this.isContainPlugin()) + .attr("isContainFileContent", this.isContainFileContent()); + writer.end(); + } + + + + public boolean isSearchOnLine() { + return isSearchOnLine; + } + + public void setSearchOnLine(boolean searchOnLine) { + isSearchOnLine = searchOnLine; + } + + public String getShortcuts() { + return shortcuts; + } + + public void setShortcuts(String shortcuts) { + this.shortcuts = shortcuts; + this.shortCutKeyStore = convert2KeyStroke(this.shortcuts); + } + + + public boolean isContainAction() { + return isContainAction; + } + + public void setContainAction(boolean containAction) { + this.isContainAction = containAction; + } + + public boolean isContainDocument() { + return isContainDocument; + } + + public void setContainDocument(boolean containDocument) { + this.isContainDocument = containDocument; + } + + public boolean isContainTemplate() { + return isContainTemplate; + } + + public void setContainTemplate(boolean containTemplate) { + this.isContainTemplate = containTemplate; + } + + public boolean isContainPlugin() { + return isContainPlugin; + } + + public void setContainPlugin(boolean containPlugin) { + this.isContainPlugin = containPlugin; + } + + public boolean isContainConclude() { + return isContainConclude; + } + + public void setContainConclude(boolean containConclude) { + isContainConclude = containConclude; + } + + public boolean isEnabled() { + return isEnabled; + } + + public void setEnabled(boolean isEnabled) { + this.isEnabled = isEnabled; + } + + public KeyStroke getShortCutKeyStore() { + if (shortCutKeyStore == null) { + shortCutKeyStore = convert2KeyStroke(this.getShortcuts()); + } + return shortCutKeyStore; + } + + public void setShortCutKeyStore(KeyStroke shortCutKeyStore) { + this.shortCutKeyStore = shortCutKeyStore; + } + + private KeyStroke convert2KeyStroke(String ks) { + return KeyStroke.getKeyStroke(ks.replace("+", "pressed")); + } + + public boolean isContainFileContent() { + return isContainFileContent; + } + + public void setContainFileContent(boolean containFileContent) { + isContainFileContent = containFileContent; + } +} diff --git a/designer_base/src/com/fr/design/actions/help/AlphaFine/AlphafineConfigPane.java b/designer_base/src/com/fr/design/actions/help/AlphaFine/AlphafineConfigPane.java new file mode 100644 index 000000000..c0c8c6bd1 --- /dev/null +++ b/designer_base/src/com/fr/design/actions/help/AlphaFine/AlphafineConfigPane.java @@ -0,0 +1,216 @@ +package com.fr.design.actions.help.AlphaFine; + +import com.fr.design.DesignerEnvManager; +import com.fr.design.dialog.BasicPane; +import com.fr.design.gui.icheckbox.UICheckBox; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.gui.itextfield.UITextField; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.layout.TableLayoutHelper; +import com.fr.general.FRLogger; +import com.fr.general.Inter; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; + +/** + * Created by XiaXiang on 2017/4/6. + */ +public class AlphafineConfigPane extends BasicPane { + private static final String TYPE = "pressed"; + private static final String DISPLAY_TYPE = "+"; + private static final String BACK_SLASH = "BACK_SLASH"; + private static final String DISPLAY_BACK_SLASH = "\\"; + private static final String SLASH = "SLASH"; + private static final String DISPLAY_SLASH = "/"; + private static final String CONTROL = "CONTROL"; + private static final String DISPLAY_CONTROL = "ctrl"; + private static final String OPEN_BRACKET = "OPEN_BRACKET"; + private static final String DISPLAY_OPEN_BRACKET = "{"; + private static final String CLOSE_BRACKET = "CLOSE_BRACKET"; + private static final String DISPLAY_CLOSE_BRACKET = "}"; + private static final String COMMA = "COMMA"; + private static final String DISPLAY_COMMA = ","; + private static final String PERIOD = "PERIOD"; + private static final String DISPLAY_PERIOD = "."; + private static final String SEMICOLON = "SEMICOLON"; + private static final String DISPLAY_SEMICOLON = ";"; + private static final String QUOTE = "QUOTE"; + private static final String DISPLAY_QUOTE = "'"; + private static final String EQUALS = "EQUALS"; + private static final String DISPLAY_EQUALS = "+"; + private static final String MINUS = "MINUS"; + private static final String DISPLAY_MINUS = "-"; + private KeyStroke shortCutKeyStore = null; + private UICheckBox isEnabledCheckbox, isSearchOnlineCheckbox, isContainConcludeCheckbox, isContainActionCheckbox, isContainDocumentCheckbox, isContainTemplateCheckbox, isContainPluginCheckbox, isContainFileContentCheckbox; + private UITextField shortcutsField; + + public AlphafineConfigPane() { + this.initComponents(); + } + + private void initComponents() { + JPanel contentPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_L_Pane(); + createOpenPane(contentPane); + createOnlinePane(contentPane); + createShortcutsPane(contentPane); + createSearchConfigPane(contentPane); + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + this.add(contentPane, BorderLayout.NORTH); + + } + + private Component[][] initsearchRangeComponents() { + Component[][] components = new Component[][]{ + new Component[]{isContainConcludeCheckbox, isContainActionCheckbox, isContainDocumentCheckbox}, + new Component[]{isContainTemplateCheckbox, isContainPluginCheckbox, isContainFileContentCheckbox} + }; + return components; + } + + private void createSearchConfigPane(JPanel contentPane) { + double p = 25; + double d = 180; + double[] rowSize = {p, p}; + double[] columnSize = {d, d, d}; + + JPanel northPane = FRGUIPaneFactory.createTitledBorderPane("搜索范围"); + isContainConcludeCheckbox = new UICheckBox("猜您需要"); + isContainActionCheckbox = new UICheckBox("设置"); + isContainPluginCheckbox = new UICheckBox("应用中心"); + isContainDocumentCheckbox = new UICheckBox("帮助文档"); + isContainTemplateCheckbox = new UICheckBox("模板"); + isContainFileContentCheckbox = new UICheckBox("模板内容"); + JPanel searchConfigPane = TableLayoutHelper.createTableLayoutPane(initsearchRangeComponents(), rowSize, columnSize); + northPane.add(searchConfigPane); + contentPane.add(northPane); + } + + private void createShortcutsPane(JPanel contentPane) { + JPanel northPane = FRGUIPaneFactory.createTitledBorderPane("快捷键配置"); + shortcutsField = new UITextField(); + shortcutsField.setPreferredSize(new Dimension(100, 20)); + shortcutsField.addKeyListener(new KeyAdapter() { + @Override + public void keyReleased(KeyEvent e) { + int modifier = e.getModifiers(); + if (modifier == 0) { + return; + } + int keyCode = e.getKeyCode(); + shortCutKeyStore = KeyStroke.getKeyStroke(keyCode, modifier); + String str = shortCutKeyStore.toString(); + shortcutsField.setText(getDisplayShortCut(str)); + } + }); + northPane.add(new UILabel(Inter.getLocText("Open") + ":")); + northPane.add(shortcutsField); + contentPane.add(northPane); + } + + private void createOnlinePane(JPanel contentPane) { + JPanel northPane = FRGUIPaneFactory.createTitledBorderPane("联网"); + isSearchOnlineCheckbox = new UICheckBox("联网搜索"); + isSearchOnlineCheckbox.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + if (!isSearchOnlineCheckbox.isSelected()) { + isContainConcludeCheckbox.setEnabled(false); + isContainPluginCheckbox.setEnabled(false); + isContainDocumentCheckbox.setEnabled(false); + isContainConcludeCheckbox.setSelected(false); + isContainPluginCheckbox.setSelected(false); + isContainDocumentCheckbox.setSelected(false); + } else { + isContainConcludeCheckbox.setEnabled(true); + isContainPluginCheckbox.setEnabled(true); + isContainDocumentCheckbox.setEnabled(true); + } + } + }); + northPane.add(isSearchOnlineCheckbox); + contentPane.add(northPane); + } + + private void createOpenPane(JPanel contentPane) { + JPanel northPane = FRGUIPaneFactory.createTitledBorderPane("开启"); + isEnabledCheckbox = new UICheckBox("开启AlphaFine功能"); + northPane.add(isEnabledCheckbox); + contentPane.add(northPane); + } + + @Override + protected String title4PopupWindow() { + return "AlphaFine"; + } + + public void populate(AlphafineConfigManager alphafineConfigManager) { + this.isEnabledCheckbox.setSelected(alphafineConfigManager.isEnabled()); + this.isSearchOnlineCheckbox.setSelected(alphafineConfigManager.isSearchOnLine()); + this.isContainActionCheckbox.setSelected(alphafineConfigManager.isContainAction()); + this.isContainTemplateCheckbox.setSelected(alphafineConfigManager.isContainTemplate()); + this.isContainDocumentCheckbox.setSelected(alphafineConfigManager.isContainDocument() && alphafineConfigManager.isSearchOnLine()); + this.isContainDocumentCheckbox.setEnabled(alphafineConfigManager.isSearchOnLine()); + this.isContainPluginCheckbox.setSelected(alphafineConfigManager.isContainPlugin() && alphafineConfigManager.isSearchOnLine()); + this.isContainPluginCheckbox.setEnabled(alphafineConfigManager.isSearchOnLine()); + this.isContainConcludeCheckbox.setSelected(alphafineConfigManager.isContainConclude() && alphafineConfigManager.isSearchOnLine()); + this.isContainConcludeCheckbox.setEnabled(alphafineConfigManager.isSearchOnLine()); + this.shortcutsField.setText(alphafineConfigManager.getShortcuts()); + shortCutKeyStore = convert2KeyStroke(alphafineConfigManager.getShortcuts()); + } + + public void update() { + DesignerEnvManager designerEnvManager = DesignerEnvManager.getEnvManager(); + AlphafineConfigManager alphafineConfigManager = designerEnvManager.getAlphafineConfigManager(); + alphafineConfigManager.setContainPlugin(this.isContainPluginCheckbox.isSelected()); + alphafineConfigManager.setContainAction(this.isContainActionCheckbox.isSelected()); + alphafineConfigManager.setContainDocument(this.isContainActionCheckbox.isSelected()); + alphafineConfigManager.setContainConclude(this.isContainConcludeCheckbox.isSelected()); + alphafineConfigManager.setEnabled(this.isEnabledCheckbox.isSelected()); + alphafineConfigManager.setSearchOnLine(this.isSearchOnlineCheckbox.isSelected()); + alphafineConfigManager.setContainTemplate(this.isContainTemplateCheckbox.isSelected()); + alphafineConfigManager.setContainFileContent(this.isContainFileContentCheckbox.isSelected()); + alphafineConfigManager.setShortcuts(shortCutKeyStore != null? shortCutKeyStore.toString().replace(TYPE, DISPLAY_TYPE) : this.shortcutsField.getText()); + designerEnvManager.setAlphafineConfigManager(alphafineConfigManager); + try { + DesignerEnvManager.loadLogSetting(); + DesignerEnvManager.getEnvManager().saveXMLFile(); + } catch (Exception e) { + FRLogger.getLogger().error(e.getMessage()); + } + + + } + + private String getDisplayShortCut(String shotrCut) { + return shotrCut.replace(TYPE, DISPLAY_TYPE).replace(BACK_SLASH, DISPLAY_BACK_SLASH).replace(SLASH, DISPLAY_SLASH) + .replace(CONTROL, DISPLAY_CONTROL).replace(OPEN_BRACKET, DISPLAY_OPEN_BRACKET).replace(CLOSE_BRACKET, DISPLAY_CLOSE_BRACKET) + .replace(COMMA, DISPLAY_COMMA).replace(PERIOD, DISPLAY_PERIOD).replace(SEMICOLON, DISPLAY_SEMICOLON).replace(QUOTE, DISPLAY_QUOTE) + .replace(EQUALS, DISPLAY_EQUALS).replace(MINUS, DISPLAY_MINUS); + } + + + private KeyStroke convert2KeyStroke(String ks) { + return KeyStroke.getKeyStroke(ks.replace(DISPLAY_TYPE, TYPE)); + } + + public KeyStroke getShortCutKeyStore() { + return shortCutKeyStore; + } + + public void setShortCutKeyStore(KeyStroke shortCutKeyStore) { + this.shortCutKeyStore = shortCutKeyStore; + } + + public UICheckBox getIsContainFileContentCheckbox() { + return isContainFileContentCheckbox; + } + + public void setIsContainFileContentCheckbox(UICheckBox isContainFileContentCheckbox) { + this.isContainFileContentCheckbox = isContainFileContentCheckbox; + } +} diff --git a/designer_base/src/com/fr/design/mainframe/DesignerFrame.java b/designer_base/src/com/fr/design/mainframe/DesignerFrame.java index 298e5e996..f1c144d7c 100644 --- a/designer_base/src/com/fr/design/mainframe/DesignerFrame.java +++ b/designer_base/src/com/fr/design/mainframe/DesignerFrame.java @@ -197,6 +197,10 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta processor.hold(northEastPane, LogMessageBar.getInstance(), ad.createBBSLoginPane()); } }); + + if (DesignerEnvManager.getEnvManager().getAlphafineConfigManager().isEnabled()) { + northEastPane.add(ad.createAlphafinePane(), BorderLayout.CENTER); + } return northEastPane; } diff --git a/designer_base/src/com/fr/design/mainframe/hold/DefaultTitlePlace.java b/designer_base/src/com/fr/design/mainframe/hold/DefaultTitlePlace.java index d0fa8dde4..0dee1644c 100644 --- a/designer_base/src/com/fr/design/mainframe/hold/DefaultTitlePlace.java +++ b/designer_base/src/com/fr/design/mainframe/hold/DefaultTitlePlace.java @@ -8,7 +8,7 @@ public class DefaultTitlePlace extends AbstractTitleProcessor { @Override public void hold(Container container, Component loggerComponent, Component loginComponent) { - container.add(loggerComponent, BorderLayout.CENTER); + container.add(loggerComponent, BorderLayout.WEST); container.add(loginComponent, BorderLayout.EAST); } } \ No newline at end of file diff --git a/designer_base/src/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java b/designer_base/src/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java index 411337066..536f984eb 100644 --- a/designer_base/src/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java +++ b/designer_base/src/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java @@ -10,7 +10,10 @@ import com.fr.design.ExtraDesignClassManager; import com.fr.design.actions.UpdateAction; import com.fr.design.actions.community.*; import com.fr.design.actions.file.*; -import com.fr.design.actions.help.*; +import com.fr.design.actions.help.AboutAction; +import com.fr.design.actions.help.AlphaFine.AlphafineAction; +import com.fr.design.actions.help.TutorialAction; +import com.fr.design.actions.help.WebDemoAction; import com.fr.design.actions.server.*; import com.fr.design.file.NewTemplatePane; import com.fr.design.fun.MenuHandler; @@ -28,17 +31,14 @@ import com.fr.design.menu.ShortCut; import com.fr.design.menu.ToolBarDef; import com.fr.env.RemoteEnv; import com.fr.general.ComparatorUtils; -import com.fr.general.GeneralContext; import com.fr.general.Inter; import com.fr.stable.ArrayUtils; import com.fr.stable.ProductConstants; import javax.swing.*; import java.awt.*; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Locale; -import java.util.Set; +import java.util.*; +import java.util.List; /** * @author richer @@ -55,6 +55,7 @@ public abstract class ToolBarMenuDock { public static final int PANLE_HEIGNT = 26; private MenuDef[] menus; private ToolBarDef toolBarDef; + private ArrayList shortCuts; /** * 更新菜单 @@ -142,11 +143,36 @@ public abstract class ToolBarMenuDock { // 添加社区菜单 addCommunityMenuDef(menuList); - + + // 添加全部UpdateAction到actionmanager中 + getAllUpdateActions(menuList); + UpdateActionManager.getUpdateActionManager().setUpdateActions(shortCuts); + return menuList.toArray(new MenuDef[menuList.size()]); } - - public void addCommunityMenuDef(java.util.List menuList){ + + private List getAllUpdateActions(List menuList) { + shortCuts = new ArrayList<>(); + for (MenuDef menuDef : menuList) { + addUpdateActionToList(menuDef); + } + return shortCuts; + } + + private void addUpdateActionToList(MenuDef menuDef) { + if (menuDef instanceof OpenRecentReportMenuDef) { + return; + } + for (ShortCut shortCut : menuDef.getShortcutList()) { + if (shortCut instanceof UpdateAction) { + shortCuts.add((UpdateAction) shortCut); + } else if (shortCut instanceof MenuDef) { + addUpdateActionToList((MenuDef) shortCut); + } + } + } + + public void addCommunityMenuDef(java.util.List menuList){ Locale locale = FRContext.getLocale(); Locale [] locales =supportCommunityLocales(); for(int i = 0; i < locales.length; i++) { @@ -156,11 +182,12 @@ public abstract class ToolBarMenuDock { } } } - - public Locale[] supportCommunityLocales() { + + public Locale[] supportCommunityLocales() { return new Locale[]{ Locale.CHINA, Locale.TAIWAN, + Locale.US }; } @@ -264,6 +291,10 @@ public abstract class ToolBarMenuDock { return new UILabel(); } + public Component createAlphafinePane(){ + return new UILabel(); + } + protected MenuDef createServerMenuDef(ToolBarMenuDockPlus plus) { MenuDef menuDef = new MenuDef(Inter.getLocText("FR-Designer_M-Server"), 'S'); @@ -312,9 +343,10 @@ public abstract class ToolBarMenuDock { public ShortCut[] createHelpShortCuts() { java.util.List shortCuts = new ArrayList(); shortCuts.add(new WebDemoAction()); - // 英文,把 video 的链接放到 Help 下面 + // 英文,把 video 和帮助文档放到 Help 下面 if (FRContext.getLocale().equals(Locale.US)) { shortCuts.add(new VideoAction()); + shortCuts.add(new TutorialAction()); } shortCuts.add(SeparatorDef.DEFAULT); //shortCuts.add(new TutorialAction()); @@ -329,6 +361,8 @@ public abstract class ToolBarMenuDock { } shortCuts.add(SeparatorDef.DEFAULT); shortCuts.add(new AboutAction()); + shortCuts.add(SeparatorDef.DEFAULT); + shortCuts.add(new AlphafineAction()); return shortCuts.toArray(new ShortCut[shortCuts.size()]); } @@ -400,7 +434,7 @@ public abstract class ToolBarMenuDock { return toolBar; } else { - return polyToolBar(Inter.getLocText(new String[]{"Polybolck", "Edit"})); + return polyToolBar(Inter.getLocText("FR-Designer_Polyblock_Edit")); } } @@ -541,7 +575,7 @@ public abstract class ToolBarMenuDock { for (MenuHandler handler : target) { int insertPosition = handler.insertPosition(menuDef.getShortCutCount()); - if (insertPosition == MenuHandler.HIDE) { + if (insertPosition == MenuHandler.HIDE) { return; } ShortCut shortCut = action.methodAction(handler); diff --git a/designer_base/src/com/fr/design/mainframe/toolbar/UpdateActionManager.java b/designer_base/src/com/fr/design/mainframe/toolbar/UpdateActionManager.java new file mode 100644 index 000000000..05cad8d98 --- /dev/null +++ b/designer_base/src/com/fr/design/mainframe/toolbar/UpdateActionManager.java @@ -0,0 +1,28 @@ +package com.fr.design.mainframe.toolbar; + +import com.fr.design.actions.UpdateAction; + +import java.util.List; + +/** + * Created by XiaXiang on 2017/4/13. + */ +public class UpdateActionManager { + private static UpdateActionManager updateActionManager = null; + private List updateActions; + + public synchronized static UpdateActionManager getUpdateActionManager() { + if (updateActionManager == null) { + updateActionManager = new UpdateActionManager(); + } + return updateActionManager; + } + + public List getUpdateActions() { + return updateActions; + } + + public void setUpdateActions(List updateActions) { + this.updateActions = updateActions; + } +} diff --git a/designer_base/src/com/fr/design/menu/MenuDef.java b/designer_base/src/com/fr/design/menu/MenuDef.java index bf85652fd..9de4dba4e 100644 --- a/designer_base/src/com/fr/design/menu/MenuDef.java +++ b/designer_base/src/com/fr/design/menu/MenuDef.java @@ -33,7 +33,7 @@ public class MenuDef extends ShortCut { protected UIMenu createdJMenu; protected UIButton createdButton; protected JPopupMenu popupMenu; - private boolean hasScrollSubMenu; + private boolean hasScrollSubMenu; private String anchor; @@ -65,9 +65,9 @@ public class MenuDef extends ShortCut { this.mnemonic = mnemonic; } - public void setHasScrollSubMenu(boolean scrollSubMenu) { - this.hasScrollSubMenu = scrollSubMenu; - } + public void setHasScrollSubMenu(boolean scrollSubMenu) { + this.hasScrollSubMenu = scrollSubMenu; + } public String getIconPath() { return iconPath; @@ -93,38 +93,42 @@ public class MenuDef extends ShortCut { this.anchor = anchor; } + public List getShortcutList() { + return this.shortcutList; + } + /** * 插入菜单项 * @param index 插入的位置 * @param shortCut 菜单信息 */ public void insertShortCut(int index, ShortCut shortCut) { - int size = this.shortcutList.size(); - index = Math.min(index, size); + int size = this.shortcutList.size(); + index = Math.min(index, size); this.shortcutList.add(index, shortCut); } - /** - * 用可变参数,方便添加数组 - * @param shortcut 参数 存储菜单项信息 - */ + /** + * 用可变参数,方便添加数组 + * @param shortcut 参数 存储菜单项信息 + */ public void addShortCut(ShortCut... shortcut) { for (ShortCut i : shortcut) { this.shortcutList.add(i); } } - /** - * 清理 - */ - public void clearShortCuts() { + /** + * 清理 + */ + public void clearShortCuts() { this.shortcutList.clear(); } - /** - * 生成UIButton - * @return 菜单按钮 - */ + /** + * 生成UIButton + * @return 菜单按钮 + */ public UIButton createUIButton() { if (createdButton == null) { if (iconPath != null) { @@ -146,17 +150,17 @@ public class MenuDef extends ShortCut { this.tooltip = text; } - /** - * 生成JMenu - * @return 菜单 - */ + /** + * 生成JMenu + * @return 菜单 + */ public UIMenu createJMenu() { if (createdJMenu == null) { - if (hasScrollSubMenu) { - createdJMenu = new UIScrollMenu(this.getName()); - } else { - createdJMenu = new UIMenu(this.getName()); - } + if (hasScrollSubMenu) { + createdJMenu = new UIScrollMenu(this.getName()); + } else { + createdJMenu = new UIMenu(this.getName()); + } createdJMenu.setMnemonic(this.getMnemonic()); if (this.iconPath != null) { createdJMenu.setIcon(BaseUtils.readIcon(this.iconPath)); @@ -174,20 +178,20 @@ public class MenuDef extends ShortCut { protected ContainerListener getContainerListener() { return null; } - /** - * 生成 JPopupMenu - * @return 弹出菜单 - */ + /** + * 生成 JPopupMenu + * @return 弹出菜单 + */ public JPopupMenu createJPopupMenu() { UIMenu menu = createJMenu(); updateMenu(); return menu.getPopupMenu(); } - /** - * 设置是否可用 - * @param b 布尔型 - */ + /** + * 设置是否可用 + * @param b 布尔型 + */ @Override public void setEnabled(boolean b) { this.enabled = b; @@ -201,10 +205,10 @@ public class MenuDef extends ShortCut { } } - /** - * 按钮状态 - * @return 状态 - */ + /** + * 按钮状态 + * @return 状态 + */ @Override public boolean isEnabled() { return enabled; @@ -224,12 +228,12 @@ public class MenuDef extends ShortCut { } } - /** - * 更新菜单 - * @param popupMenu 菜单 - */ + /** + * 更新菜单 + * @param popupMenu 菜单 + */ protected void updatePopupMenu(JPopupMenu popupMenu) { - removeComponent(popupMenu); + removeComponent(popupMenu); this.popupMenu = popupMenu; // 一开始是不能插入分隔符的 boolean nec_seperator = false; @@ -256,32 +260,32 @@ public class MenuDef extends ShortCut { if (createdJMenu != null && createdJMenu.getPopupMenu() != null){ setEnabled(createdJMenu.getPopupMenu().getComponentCount() > 0 && enabled); - } - } - - /** - * 删除所有组件 除了滚动条 - * @param popupMenu 菜单 - */ - public void removeComponent(JPopupMenu popupMenu){ - UIScrollBar uiScrollBar = new UIScrollBar(); - if(hasScrollSubMenu){ - for(Component comp : popupMenu.getComponents()){ - if(comp instanceof UIScrollBar){ - uiScrollBar =(UIScrollBar) comp; - } - } - } - popupMenu.removeAll(); - if(hasScrollSubMenu){ - popupMenu.add(uiScrollBar); - } - } - - /** - * 添加菜单项 - * @param menu 菜单 - */ + } + } + + /** + * 删除所有组件 除了滚动条 + * @param popupMenu 菜单 + */ + public void removeComponent(JPopupMenu popupMenu){ + UIScrollBar uiScrollBar = new UIScrollBar(); + if(hasScrollSubMenu){ + for(Component comp : popupMenu.getComponents()){ + if(comp instanceof UIScrollBar){ + uiScrollBar =(UIScrollBar) comp; + } + } + } + popupMenu.removeAll(); + if(hasScrollSubMenu){ + popupMenu.add(uiScrollBar); + } + } + + /** + * 添加菜单项 + * @param menu 菜单 + */ @Override public void intoJPopupMenu(JPopupMenu menu) { updateMenu(); @@ -289,10 +293,10 @@ public class MenuDef extends ShortCut { menu.add(this.createJMenu()); } - /** - * 添加 - * @param toolBar 菜单条 - */ + /** + * 添加 + * @param toolBar 菜单条 + */ @Override public void intoJToolBar(JToolBar toolBar) { toolBar.add(this.createUIButton());