forked from fanruan/design
Browse Source
# Conflicts: # designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStyleDefinePane.javafinal/10.0
jeo
5 years ago
131 changed files with 4166 additions and 1591 deletions
@ -0,0 +1,82 @@
|
||||
import org.gradle.plugins.ide.idea.model.IdeaLanguageLevel |
||||
|
||||
plugins { |
||||
id 'java' |
||||
id 'java-library' |
||||
id 'com.fr.common' version '1.0-SNAPSHOT' |
||||
} |
||||
|
||||
// 模块参数 |
||||
ext { |
||||
frVersion = "" |
||||
outputPath = "build" |
||||
ignoreTestFailureSetting = true |
||||
languageLevelSetting = 1.8 |
||||
} |
||||
|
||||
applyGlobalConfigPathIfExist() |
||||
|
||||
if (versions.frVersion) { |
||||
frVersion = versions.frVersion |
||||
} |
||||
def frDevVersion = "DEV" + frVersion |
||||
|
||||
dependencies { |
||||
api project(':designer-base') |
||||
api project(':designer-chart') |
||||
api project(':designer-form') |
||||
api project(':designer-realize') |
||||
} |
||||
|
||||
allprojects { |
||||
apply plugin: 'java' |
||||
apply plugin: 'java-library' |
||||
apply plugin: 'idea' |
||||
|
||||
group 'com.fr.design' |
||||
version frDevVersion |
||||
sourceCompatibility = languageLevelSetting |
||||
targetCompatibility = languageLevelSetting |
||||
|
||||
tasks.withType(JavaCompile) { |
||||
options.encoding = "UTF-8" |
||||
} |
||||
|
||||
repositories { |
||||
mavenLocal() |
||||
} |
||||
|
||||
idea { |
||||
module { |
||||
inheritOutputDirs = false |
||||
outputDir = file(outputPath +"/classes") |
||||
testOutputDir = file(outputPath +"/test-classes") |
||||
languageLevel = new IdeaLanguageLevel(sourceCompatibility) |
||||
targetBytecodeVersion = targetCompatibility |
||||
} |
||||
} |
||||
|
||||
dependencies { |
||||
implementation 'com.fr.third:jxbrowser:6.23' |
||||
implementation 'com.fr.third:jxbrowser-swing:6.23' |
||||
implementation 'com.fr.third:jxbrowser-mac:6.23' |
||||
implementation 'com.fr.third:jxbrowser-win64:6.23' |
||||
implementation 'com.fr.third.server:servlet-api:3.0' |
||||
implementation 'org.swingexplorer:swexpl:2.0.1' |
||||
implementation 'org.swingexplorer:swag:1.0' |
||||
implementation 'net.java.dev.jna:jna:5.4.0' |
||||
implementation 'org.apache.tomcat:tomcat-catalina:8.5.32' |
||||
implementation 'io.socket:socket.io-client:0.7.0' |
||||
implementation 'com.fr.third:fine-third:' + frVersion |
||||
implementation 'com.fr.core:fine-core:' + frDevVersion |
||||
implementation 'com.fr.activator:fine-activator:' + frVersion |
||||
implementation 'com.fr.datasource:fine-datasource:' + frVersion |
||||
implementation 'com.fr.decision:fine-decision:' + frVersion |
||||
implementation 'com.fr.schedule:fine-schedule:' + frVersion |
||||
implementation 'com.fr.report:fine-report-engine:' + frDevVersion |
||||
testImplementation 'org.easymock:easymock:3.5.1' |
||||
testImplementation 'org.powermock:powermock-module-junit4:1.7.1' |
||||
testImplementation 'org.powermock:powermock-api-easymock:1.7.1' |
||||
testImplementation 'junit:junit:4.12' |
||||
} |
||||
} |
@ -1,234 +0,0 @@
|
||||
package com.fr.design.extra; |
||||
|
||||
import com.fr.design.dialog.FineJOptionPane; |
||||
import com.fr.general.CloudCenter; |
||||
import com.fr.general.ComparatorUtils; |
||||
import com.fr.general.IOUtils; |
||||
import com.fr.log.FineLoggerFactory; |
||||
import javafx.application.Platform; |
||||
import javafx.beans.property.BooleanProperty; |
||||
import javafx.beans.property.SimpleBooleanProperty; |
||||
import javafx.beans.value.ChangeListener; |
||||
import javafx.beans.value.ObservableValue; |
||||
import javafx.concurrent.Worker; |
||||
import javafx.embed.swing.JFXPanel; |
||||
import javafx.event.ActionEvent; |
||||
import javafx.event.EventHandler; |
||||
import javafx.scene.Group; |
||||
import javafx.scene.Node; |
||||
import javafx.scene.Scene; |
||||
import javafx.scene.control.ButtonBuilder; |
||||
import javafx.scene.control.LabelBuilder; |
||||
import javafx.scene.input.MouseEvent; |
||||
import javafx.scene.layout.BorderPane; |
||||
import javafx.scene.layout.HBox; |
||||
import javafx.scene.layout.HBoxBuilder; |
||||
import javafx.scene.paint.Color; |
||||
import javafx.scene.web.WebEngine; |
||||
import javafx.scene.web.WebEvent; |
||||
import javafx.scene.web.WebView; |
||||
import javafx.stage.Modality; |
||||
import javafx.stage.Screen; |
||||
import javafx.stage.Stage; |
||||
import javafx.stage.StageStyle; |
||||
import javafx.stage.WindowEvent; |
||||
import javafx.util.Callback; |
||||
import netscape.javascript.JSObject; |
||||
|
||||
import javax.swing.JOptionPane; |
||||
import javax.swing.SwingUtilities; |
||||
import java.awt.Toolkit; |
||||
|
||||
/** |
||||
* Created by zhaohehe on 16/7/28. |
||||
*/ |
||||
public class QQLoginWebPane extends JFXPanel { |
||||
|
||||
private WebEngine webEngine; |
||||
private String url; |
||||
|
||||
private static JSObject window; |
||||
|
||||
private static int DEFAULT_PRIMARYSTAGE_WIDTH = 100; |
||||
private static int DEFAULT_PRIMARYSTAGE_HEIGHT = 100; |
||||
|
||||
private static int DEFAULT_CONFIRM_WIDTH = 450; |
||||
private static int DEFAULT_CONFIRM_HEIGHT = 160; |
||||
private static int DEFAULT_OFFEST = 20; |
||||
|
||||
class Delta { |
||||
double x, y; |
||||
} |
||||
|
||||
public QQLoginWebPane(final String installHome) { |
||||
Platform.setImplicitExit(false); |
||||
Platform.runLater(new Runnable() { |
||||
@Override |
||||
public void run() { |
||||
BorderPane root = new BorderPane(); |
||||
Scene scene = new Scene(root); |
||||
QQLoginWebPane.this.setScene(scene); |
||||
final WebView webView = new WebView(); |
||||
webEngine = webView.getEngine(); |
||||
url = "file:///" + installHome + "/scripts/qqLogin.html"; |
||||
webEngine.load(url); |
||||
|
||||
final Stage primaryStage = new Stage(); |
||||
|
||||
HBox layout = new HBox(); |
||||
try { |
||||
primaryStage.initStyle(StageStyle.TRANSPARENT); |
||||
primaryStage.setScene(new Scene(layout)); |
||||
webView.getScene().getStylesheets().add(IOUtils.getResource("modal-dialog.css", getClass()).toExternalForm()); |
||||
primaryStage.initStyle(StageStyle.UTILITY); |
||||
primaryStage.setScene(new Scene(new Group(), DEFAULT_PRIMARYSTAGE_WIDTH, DEFAULT_PRIMARYSTAGE_HEIGHT)); |
||||
primaryStage.setX(0); |
||||
primaryStage.setY(Screen.getPrimary().getBounds().getHeight() + DEFAULT_PRIMARYSTAGE_HEIGHT); |
||||
primaryStage.show(); |
||||
} catch (Exception e) { |
||||
FineLoggerFactory.getLogger().info(e.getMessage()); |
||||
} |
||||
webEngine.setConfirmHandler(new Callback<String, Boolean>() { |
||||
@Override |
||||
public Boolean call(String msg) { |
||||
Boolean confirmed = confirm(primaryStage, msg, webView); |
||||
return confirmed; |
||||
} |
||||
}); |
||||
configWebEngine(); |
||||
webView.setContextMenuEnabled(false);//屏蔽右键
|
||||
root.setCenter(webView); |
||||
} |
||||
}); |
||||
} |
||||
|
||||
private void configWebEngine() { |
||||
|
||||
webEngine.locationProperty().addListener(new ChangeListener<String>() { |
||||
@Override |
||||
public void changed(ObservableValue<? extends String> observable, final String oldValue, String newValue) { |
||||
disableLink(webEngine); |
||||
// webView好像默认以手机版显示网页,浏览器里过滤掉这个跳转
|
||||
if (ComparatorUtils.equals(newValue, url) || ComparatorUtils.equals(newValue, CloudCenter.getInstance().acquireUrlByKind("bbs.mobile"))) { |
||||
return; |
||||
} |
||||
LoginWebBridge.getHelper().openUrlAtLocalWebBrowser(webEngine, newValue); |
||||
} |
||||
}); |
||||
|
||||
webEngine.setOnAlert(new EventHandler<WebEvent<String>>() { |
||||
@Override |
||||
public void handle(WebEvent<String> event) { |
||||
showAlert(event.getData()); |
||||
} |
||||
}); |
||||
|
||||
webEngine.getLoadWorker().stateProperty().addListener( |
||||
new ChangeListener<Worker.State>() { |
||||
public void changed(ObservableValue ov, Worker.State oldState, Worker.State newState) { |
||||
if (newState == Worker.State.SUCCEEDED) { |
||||
window = (JSObject) webEngine.executeScript("window"); |
||||
window.setMember("QQLoginHelper", LoginWebBridge.getHelper()); |
||||
} |
||||
} |
||||
} |
||||
); |
||||
} |
||||
|
||||
private void showAlert(final String message) { |
||||
SwingUtilities.invokeLater(new Runnable() { |
||||
@Override |
||||
public void run() { |
||||
FineJOptionPane.showMessageDialog(QQLoginWebPane.this, message); |
||||
} |
||||
}); |
||||
} |
||||
|
||||
private void disableLink(final WebEngine eng) { |
||||
try { |
||||
// webView端不跳转 虽然webView可以指定本地浏览器打开某个链接,但是当本地浏览器跳转到指定链接的同时,webView也做了跳转,
|
||||
// 为了避免出现在一个600*400的资讯框里加载整个网页的情况,webView不跳转到新网页
|
||||
Platform.runLater(new Runnable() { |
||||
@Override |
||||
public void run() { |
||||
eng.executeScript("location.reload()"); |
||||
LoginWebBridge.getHelper().closeQQWindow(); |
||||
} |
||||
}); |
||||
} catch (Exception e) { |
||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||
} |
||||
} |
||||
|
||||
private Boolean confirm(final Stage parent, String msg, final WebView webView) { |
||||
final BooleanProperty confirmationResult = new SimpleBooleanProperty(); |
||||
// initialize the confirmation dialog
|
||||
final Stage dialog = new Stage(StageStyle.UTILITY); |
||||
dialog.setX(Toolkit.getDefaultToolkit().getScreenSize().getWidth() / 2 - DEFAULT_CONFIRM_WIDTH / 2.0D + DEFAULT_OFFEST); |
||||
dialog.setY(Toolkit.getDefaultToolkit().getScreenSize().getHeight() / 2 + DEFAULT_OFFEST); |
||||
dialog.setHeight(DEFAULT_CONFIRM_HEIGHT); |
||||
dialog.setWidth(DEFAULT_CONFIRM_WIDTH); |
||||
dialog.setIconified(false); |
||||
dialog.initOwner(parent); |
||||
dialog.initModality(Modality.WINDOW_MODAL); |
||||
dialog.setScene( |
||||
new Scene( |
||||
HBoxBuilder.create().styleClass("modal-dialog").children( |
||||
LabelBuilder.create().text(msg).build(), |
||||
ButtonBuilder.create().text(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_BBSLogin_Switch_Account")).defaultButton(true).onAction(new EventHandler<ActionEvent>() { |
||||
@Override |
||||
public void handle(ActionEvent actionEvent) { |
||||
// take action and close the dialog.
|
||||
confirmationResult.set(true); |
||||
webView.getEngine().reload(); |
||||
dialog.close(); |
||||
} |
||||
}).build(), |
||||
ButtonBuilder.create().text(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Engine_Cancel")).cancelButton(true).onAction(new EventHandler<ActionEvent>() { |
||||
@Override |
||||
public void handle(ActionEvent actionEvent) { |
||||
// abort action and close the dialog.
|
||||
confirmationResult.set(false); |
||||
dialog.close(); |
||||
} |
||||
}).build() |
||||
).build() |
||||
, Color.TRANSPARENT |
||||
) |
||||
); |
||||
configDrag(dialog); |
||||
// style and show the dialog.
|
||||
dialog.getScene().getStylesheets().add(IOUtils.getResource("modal-dialog.css", getClass()).toExternalForm()); |
||||
dialog.setOnCloseRequest(new EventHandler<WindowEvent>() { |
||||
@Override |
||||
public void handle(WindowEvent event) { |
||||
event.consume(); |
||||
dialog.close(); |
||||
} |
||||
}); |
||||
dialog.showAndWait(); |
||||
return confirmationResult.get(); |
||||
} |
||||
|
||||
private void configDrag(final Stage dialog) { |
||||
// allow the dialog to be dragged around.
|
||||
final Node root = dialog.getScene().getRoot(); |
||||
final Delta dragDelta = new Delta(); |
||||
|
||||
root.setOnMousePressed(new EventHandler<MouseEvent>() { |
||||
@Override |
||||
public void handle(MouseEvent mouseEvent) { |
||||
// record a delta distance for the drag and drop operation.
|
||||
dragDelta.x = dialog.getX() - mouseEvent.getScreenX(); |
||||
dragDelta.y = dialog.getY() - mouseEvent.getScreenY(); |
||||
} |
||||
}); |
||||
root.setOnMouseDragged(new EventHandler<MouseEvent>() { |
||||
@Override |
||||
public void handle(MouseEvent mouseEvent) { |
||||
dialog.setX(mouseEvent.getScreenX() + dragDelta.x); |
||||
dialog.setY(mouseEvent.getScreenY() + dragDelta.y); |
||||
} |
||||
}); |
||||
} |
||||
} |
@ -0,0 +1,14 @@
|
||||
package com.fr.design.fun; |
||||
|
||||
/** |
||||
* @author Bjorn |
||||
* @version 10.0 |
||||
* Created by Bjorn on 2020-06-12 |
||||
*/ |
||||
public interface ChartWidgetOptionProvider extends ParameterWidgetOptionProvider { |
||||
|
||||
String XML_TAG = "ChartWidgetOptionProvider"; |
||||
|
||||
//在图表区域的开头还是结尾插入
|
||||
boolean isBefore(); |
||||
} |
@ -0,0 +1,29 @@
|
||||
package com.fr.design.fun.impl; |
||||
|
||||
import com.fr.design.fun.ChartWidgetOptionProvider; |
||||
import com.fr.stable.fun.impl.AbstractProvider; |
||||
import com.fr.stable.fun.mark.API; |
||||
|
||||
/** |
||||
* @author Bjorn |
||||
* @version 10.0 |
||||
* Created by Bjorn on 2020-06-12 |
||||
*/ |
||||
@API(level = ChartWidgetOptionProvider.CURRENT_LEVEL) |
||||
public abstract class AbstractChartWidgetOptionProvider extends AbstractProvider implements ChartWidgetOptionProvider { |
||||
|
||||
public int currentAPILevel() { |
||||
return CURRENT_LEVEL; |
||||
} |
||||
|
||||
@Override |
||||
public String mark4Provider() { |
||||
return getClass().getName(); |
||||
} |
||||
|
||||
@Override |
||||
public boolean isBefore() { |
||||
return false; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,200 @@
|
||||
package com.fr.design.utils; |
||||
|
||||
import sun.awt.SunToolkit; |
||||
|
||||
import java.awt.*; |
||||
|
||||
/** |
||||
* 适配jdk10之后被移除的 com.sun.awt.AWTUtilities |
||||
* 参照 https://github.com/frohoff/jdk8u-dev-jdk/blob/master/src/share/classes/com/sun/awt/AWTUtilities.java中实现
|
||||
* |
||||
* @author hades |
||||
* @version 10.0 |
||||
* Created by hades on 2020/5/29 |
||||
*/ |
||||
public class AWTUtilities { |
||||
|
||||
/** |
||||
* @param window the window to set the shape to |
||||
* @param shape the shape to set to the window |
||||
* |
||||
*/ |
||||
public static void setWindowShape(Window window, Shape shape) { |
||||
if (window == null) { |
||||
throw new NullPointerException("The window argument should not be null."); |
||||
} |
||||
window.setShape(shape); |
||||
} |
||||
|
||||
/** |
||||
* |
||||
* |
||||
* @param window the window to set the shape to |
||||
* @param opaque whether the window must be opaque (true), |
||||
* or translucent (false) |
||||
* |
||||
*/ |
||||
public static void setWindowOpaque(Window window, boolean opaque) { |
||||
if (window == null) { |
||||
throw new NullPointerException("The window argument should not be null."); |
||||
} |
||||
if (!opaque && !isTranslucencySupported(Translucency.PERPIXEL_TRANSLUCENT)) { |
||||
throw new UnsupportedOperationException("The PERPIXEL_TRANSLUCENT translucency kind is not supported"); |
||||
} |
||||
Color color = window.getBackground(); |
||||
if (color == null) { |
||||
color = new Color(0, 0, 0, 0); |
||||
} |
||||
window.setBackground(new Color(color.getRed(), color.getGreen(), color.getBlue(), opaque ? 255 : 0)); |
||||
} |
||||
|
||||
|
||||
public static enum Translucency { |
||||
/** |
||||
* Represents support in the underlying system for windows each pixel |
||||
* of which is guaranteed to be either completely opaque, with |
||||
* an alpha value of 1.0, or completely transparent, with an alpha |
||||
* value of 0.0. |
||||
*/ |
||||
PERPIXEL_TRANSPARENT, |
||||
|
||||
/** |
||||
* Represents support in the underlying system for windows all of |
||||
* the pixels of which have the same alpha value between or including |
||||
* 0.0 and 1.0. |
||||
*/ |
||||
TRANSLUCENT, |
||||
|
||||
/** |
||||
* Represents support in the underlying system for windows that |
||||
* contain or might contain pixels with arbitrary alpha values |
||||
* between and including 0.0 and 1.0. |
||||
*/ |
||||
PERPIXEL_TRANSLUCENT; |
||||
} |
||||
|
||||
|
||||
/** |
||||
* Returns whether the given level of translucency is supported by |
||||
* the underlying system. |
||||
* |
||||
* Note that this method may sometimes return the value |
||||
* indicating that the particular level is supported, but |
||||
* the native windowing system may still not support the |
||||
* given level of translucency (due to the bugs in |
||||
* the windowing system). |
||||
* |
||||
* @param translucencyKind a kind of translucency support |
||||
* (either PERPIXEL_TRANSPARENT, |
||||
* TRANSLUCENT, or PERPIXEL_TRANSLUCENT) |
||||
* @return whether the given translucency kind is supported |
||||
*/ |
||||
private static boolean isTranslucencySupported(Translucency translucencyKind) { |
||||
switch (translucencyKind) { |
||||
case PERPIXEL_TRANSPARENT: |
||||
return isWindowShapingSupported(); |
||||
case TRANSLUCENT: |
||||
return isWindowOpacitySupported(); |
||||
case PERPIXEL_TRANSLUCENT: |
||||
return isWindowTranslucencySupported(); |
||||
} |
||||
return false; |
||||
} |
||||
|
||||
/** |
||||
* Returns whether the windowing system supports changing the opacity |
||||
* value of top-level windows. |
||||
* Note that this method may sometimes return true, but the native |
||||
* windowing system may still not support the concept of |
||||
* translucency (due to the bugs in the windowing system). |
||||
*/ |
||||
private static boolean isWindowOpacitySupported() { |
||||
Toolkit curToolkit = Toolkit.getDefaultToolkit(); |
||||
if (!(curToolkit instanceof SunToolkit)) { |
||||
return false; |
||||
} |
||||
return ((SunToolkit)curToolkit).isWindowOpacitySupported(); |
||||
} |
||||
|
||||
/** |
||||
* Returns whether the windowing system supports changing the shape |
||||
* of top-level windows. |
||||
* Note that this method may sometimes return true, but the native |
||||
* windowing system may still not support the concept of |
||||
* shaping (due to the bugs in the windowing system). |
||||
*/ |
||||
private static boolean isWindowShapingSupported() { |
||||
Toolkit curToolkit = Toolkit.getDefaultToolkit(); |
||||
if (!(curToolkit instanceof SunToolkit)) { |
||||
return false; |
||||
} |
||||
return ((SunToolkit)curToolkit).isWindowShapingSupported(); |
||||
} |
||||
|
||||
private static boolean isWindowTranslucencySupported() { |
||||
/* |
||||
* Per-pixel alpha is supported if all the conditions are TRUE: |
||||
* 1. The toolkit is a sort of SunToolkit |
||||
* 2. The toolkit supports translucency in general |
||||
* (isWindowTranslucencySupported()) |
||||
* 3. There's at least one translucency-capable |
||||
* GraphicsConfiguration |
||||
*/ |
||||
|
||||
Toolkit curToolkit = Toolkit.getDefaultToolkit(); |
||||
if (!(curToolkit instanceof SunToolkit)) { |
||||
return false; |
||||
} |
||||
|
||||
if (!((SunToolkit)curToolkit).isWindowTranslucencySupported()) { |
||||
return false; |
||||
} |
||||
|
||||
GraphicsEnvironment env = |
||||
GraphicsEnvironment.getLocalGraphicsEnvironment(); |
||||
|
||||
// If the default GC supports translucency return true.
|
||||
// It is important to optimize the verification this way,
|
||||
// see CR 6661196 for more details.
|
||||
if (isTranslucencyCapable(env.getDefaultScreenDevice() |
||||
.getDefaultConfiguration())) |
||||
{ |
||||
return true; |
||||
} |
||||
|
||||
// ... otherwise iterate through all the GCs.
|
||||
GraphicsDevice[] devices = env.getScreenDevices(); |
||||
|
||||
for (int i = 0; i < devices.length; i++) { |
||||
GraphicsConfiguration[] configs = devices[i].getConfigurations(); |
||||
for (int j = 0; j < configs.length; j++) { |
||||
if (isTranslucencyCapable(configs[j])) { |
||||
return true; |
||||
} |
||||
} |
||||
} |
||||
|
||||
return false; |
||||
} |
||||
|
||||
private static boolean isTranslucencyCapable(GraphicsConfiguration gc) { |
||||
if (gc == null) { |
||||
throw new NullPointerException("The gc argument should not be null"); |
||||
} |
||||
/* |
||||
return gc.isTranslucencyCapable(); |
||||
*/ |
||||
Toolkit curToolkit = Toolkit.getDefaultToolkit(); |
||||
if (!(curToolkit instanceof SunToolkit)) { |
||||
return false; |
||||
} |
||||
return ((SunToolkit)curToolkit).isTranslucencyCapable(gc); |
||||
} |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
} |
After Width: | Height: | Size: 423 B |
@ -0,0 +1,41 @@
|
||||
package com.fr.design.gui.icombocheckbox; |
||||
|
||||
import junit.framework.TestCase; |
||||
import org.junit.Assert; |
||||
import org.junit.Test; |
||||
|
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
import java.util.Map; |
||||
import java.util.TreeMap; |
||||
|
||||
/** |
||||
* @author hades |
||||
* @version 10.0 |
||||
* Created by hades on 2020/4/3 |
||||
*/ |
||||
public class UICheckListPopupTest extends TestCase { |
||||
|
||||
@Test |
||||
public void testGetSelectedValues() { |
||||
Object[] values = new Object[]{"a", "b", "c"}; |
||||
Map<Object, Boolean> map = new TreeMap<>(); |
||||
map.put("a", true); |
||||
map.put("b", false); |
||||
map.put("c", true); |
||||
List<Object> list = new ArrayList<>(); |
||||
for (Map.Entry<Object, Boolean> entry : map.entrySet()) { |
||||
if (entry.getValue()) { |
||||
list.add(entry.getKey()); |
||||
} |
||||
} |
||||
Object[] selectValues = list.toArray(); |
||||
UICheckListPopup uiCheckListPopup1 = new UICheckListPopup(values); |
||||
uiCheckListPopup1.setSelectedValue(map); |
||||
Assert.assertArrayEquals(selectValues, uiCheckListPopup1.getSelectedValues()); |
||||
UICheckListPopup uiCheckListPopup2 = new UICheckListPopup(values, false); |
||||
uiCheckListPopup2.setSelectedValue(map); |
||||
Assert.assertArrayEquals(selectValues, uiCheckListPopup2.getSelectedValues()); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,39 @@
|
||||
package com.fr.design.mainframe.mobile.ui; |
||||
|
||||
import com.fr.form.ui.container.cardlayout.WCardTagLayout; |
||||
import com.fr.general.cardtag.mobile.UniteStyle; |
||||
import com.fr.invoke.Reflect; |
||||
import junit.framework.TestCase; |
||||
import org.junit.Test; |
||||
|
||||
import java.awt.*; |
||||
|
||||
public class UniteStyleDefinePaneTest extends TestCase { |
||||
|
||||
@Test |
||||
public void testDefaultConfig() { |
||||
UniteStyleDefinePane definePane = new UniteStyleDefinePane(new WCardTagLayout()); |
||||
Reflect.on(definePane).call("initDefaultConfig"); |
||||
|
||||
double paddingTop = Reflect.on(definePane).field("paddingTopSpinner").call("getValue").get(); |
||||
assertEquals((int)paddingTop, UniteStyle.DEFAULT_PADDING_TOP); |
||||
double paddingBottom = Reflect.on(definePane).field("paddingBottomSpinner").call("getValue").get(); |
||||
assertEquals((int)paddingBottom, UniteStyle.DEFAULT_PADDING_BOTTOM); |
||||
double paddingLeft = Reflect.on(definePane).field("paddingLeftSpinner").call("getValue").get(); |
||||
assertEquals((int)paddingLeft, UniteStyle.DEFAULT_PADDING_LEFT); |
||||
double paddingRight = Reflect.on(definePane).field("paddingRightSpinner").call("getValue").get(); |
||||
assertEquals((int)paddingRight, UniteStyle.DEFAULT_PADDING_RIGHT); |
||||
|
||||
Color initialBackgroundColor = Reflect.on(definePane).field("initialBackgroundColorBox").call("getSelectObject").get(); |
||||
assertEquals(initialBackgroundColor, UniteStyle.DEFAULT_INITIAL_BACKGROUND_COLOR); |
||||
Color selectedBackgroundColor = Reflect.on(definePane).field("selectedBackgroundColorBox").call("getSelectObject").get(); |
||||
assertEquals(selectedBackgroundColor, UniteStyle.DEFAULT_SELECTED_BACKGROUND_COLOR); |
||||
|
||||
int lineStyle = Reflect.on(definePane).field("borderWidthComboBox").call("getSelectedLineStyle").get(); |
||||
assertEquals(lineStyle, UniteStyle.DEFAULT_BORDER_LINE.lineStyle); |
||||
Color borderColor = Reflect.on(definePane).field("borderColorBox").call("getSelectObject").get(); |
||||
assertEquals(borderColor, UniteStyle.DEFAULT_BORDER_LINE.color); |
||||
double borderRadius = Reflect.on(definePane).field("borderRadiusSpinner").call("getValue").get(); |
||||
assertEquals((int)borderRadius, UniteStyle.DEFAULT_BORDER_RADIUS); |
||||
} |
||||
} |
@ -0,0 +1,3 @@
|
||||
dependencies { |
||||
compile project(':designer-base') |
||||
} |
@ -0,0 +1,79 @@
|
||||
package com.fr.design.chart; |
||||
|
||||
import com.fr.base.chart.BaseChartCollection; |
||||
import com.fr.base.chart.chartdata.TopDefinitionProvider; |
||||
import com.fr.chart.chartattr.ChartCollection; |
||||
import com.fr.chartx.TwoTuple; |
||||
import com.fr.design.i18n.Toolkit; |
||||
import com.fr.plugin.chart.vanchart.VanChart; |
||||
|
||||
import java.awt.Component; |
||||
import java.awt.Dialog; |
||||
import java.awt.Frame; |
||||
import java.awt.event.ActionEvent; |
||||
import java.awt.event.ActionListener; |
||||
|
||||
/** |
||||
* @author Bjorn |
||||
* @version 10.0 |
||||
* Created by Bjorn on 2020-05-28 |
||||
*/ |
||||
public class AutoChartDialog extends ChartDialog { |
||||
|
||||
private AutoChartTypePane autoChartTypePane; |
||||
|
||||
public AutoChartDialog(Frame owner) { |
||||
super(owner); |
||||
} |
||||
|
||||
public AutoChartDialog(Dialog owner) { |
||||
super(owner); |
||||
} |
||||
|
||||
protected Component initCenterPane() { |
||||
autoChartTypePane = new AutoChartTypePane(); |
||||
|
||||
return autoChartTypePane; |
||||
} |
||||
|
||||
protected ActionListener getActionListener() { |
||||
return new ActionListener() { |
||||
public void actionPerformed(ActionEvent e) { |
||||
ChartCollection chartCollection = (ChartCollection) getChartCollection(); |
||||
autoChartTypePane.update(chartCollection); |
||||
if (chartCollection.getChartCount() > 0) { |
||||
doOK(); |
||||
} else { |
||||
doCancel(); |
||||
} |
||||
} |
||||
}; |
||||
} |
||||
|
||||
protected String getDialogTitle() { |
||||
return Toolkit.i18nText("Fine-Design_Chart_Auto_Recommended_Chart"); |
||||
} |
||||
|
||||
/** |
||||
* 更新新建的图表 ChartCollection |
||||
*/ |
||||
public void populate(BaseChartCollection cc) { |
||||
super.populate(cc); |
||||
ChartCollection chartCollection = (ChartCollection) getChartCollection(); |
||||
VanChart vanChart = chartCollection.getSelectedChartProvider(VanChart.class); |
||||
if (vanChart == null) { |
||||
return; |
||||
} |
||||
TopDefinitionProvider filterDefinition = vanChart.getFilterDefinition(); |
||||
if (filterDefinition == null) { |
||||
return; |
||||
} |
||||
TwoTuple<String, String[]> tableNameAndDataFields = filterDefinition.getTableNameAndDataFields(); |
||||
if (tableNameAndDataFields == null) { |
||||
return; |
||||
} |
||||
String tableName = tableNameAndDataFields.getFirst(); |
||||
String[] dataFields = tableNameAndDataFields.getSecond(); |
||||
autoChartTypePane.populate(tableName, dataFields); |
||||
} |
||||
} |
@ -0,0 +1,104 @@
|
||||
package com.fr.design.chart; |
||||
|
||||
import com.fr.base.chart.BaseChartPainter; |
||||
import com.fr.base.chart.chartdata.CallbackEvent; |
||||
import com.fr.base.chart.result.WebChartIDInfo; |
||||
import com.fr.chart.chartattr.Chart; |
||||
import com.fr.chart.chartattr.ChartCollection; |
||||
import com.fr.design.ChartTypeInterfaceManager; |
||||
import com.fr.design.file.HistoryTemplateListCache; |
||||
import com.fr.script.Calculator; |
||||
|
||||
import javax.swing.Icon; |
||||
import java.awt.Color; |
||||
import java.awt.Component; |
||||
import java.awt.Graphics; |
||||
import java.awt.Graphics2D; |
||||
import java.awt.Paint; |
||||
|
||||
/** |
||||
* @author Bjorn |
||||
* @version 10.0 |
||||
* Created by Bjorn on 2020-05-29 |
||||
*/ |
||||
public class AutoChartIcon implements Icon { |
||||
|
||||
private static final int WIDTH = 500; |
||||
private static final int HEIGHT = 281; |
||||
|
||||
private ChartCollection chartCollection; |
||||
private CallbackEvent callbackEvent; |
||||
|
||||
private String chartName; |
||||
|
||||
public AutoChartIcon(ChartCollection chartCollection) { |
||||
this.chartCollection = chartCollection; |
||||
initChartName(); |
||||
} |
||||
|
||||
public ChartCollection getChartCollection() { |
||||
return chartCollection; |
||||
} |
||||
|
||||
public String getChartName() { |
||||
return chartName; |
||||
} |
||||
|
||||
private void initChartName() { |
||||
Chart chart = chartCollection.getSelectedChart(Chart.class); |
||||
String[] subName = ChartTypeInterfaceManager.getInstance().getSubName(chart.getPlot().getPlotID()); |
||||
chartName = subName[0]; |
||||
} |
||||
|
||||
public void registerCallBackEvent(CallbackEvent callbackEvent) { |
||||
this.callbackEvent = callbackEvent; |
||||
} |
||||
|
||||
/** |
||||
* 画出缩略图Icon |
||||
* |
||||
* @param g 图形的上下文 |
||||
* @param c 所在的Component |
||||
* @param x 缩略图的起始坐标x |
||||
* @param y 缩略图的起始坐标y |
||||
*/ |
||||
@Override |
||||
public void paintIcon(Component c, Graphics g, int x, int y) { |
||||
|
||||
BaseChartPainter painter = chartCollection.createResultChartPainterWithOutDealFormula(Calculator.createCalculator(), |
||||
WebChartIDInfo.createEmptyDesignerInfo(), getIconWidth(), getIconHeight()); |
||||
|
||||
int resolution = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate().getJTemplateResolution(); |
||||
|
||||
Graphics2D g2d = (Graphics2D) g; |
||||
Paint oldPaint = g2d.getPaint(); |
||||
g.translate(x, y); |
||||
g2d.setPaint(Color.white); |
||||
g2d.fillRect(0, 0, getIconWidth(), getIconHeight()); |
||||
|
||||
painter.paint(g2d, getIconWidth(), getIconHeight(), resolution, null, callbackEvent); |
||||
|
||||
g.translate(-x, -y); |
||||
g2d.setPaint(oldPaint); |
||||
} |
||||
|
||||
/** |
||||
* 返回缩略图的宽度 |
||||
* |
||||
* @return int 缩略图宽度 |
||||
*/ |
||||
@Override |
||||
public int getIconWidth() { |
||||
return WIDTH; |
||||
} |
||||
|
||||
/** |
||||
* 返回缩略图的高度 |
||||
* |
||||
* @return int 缩略图高度 |
||||
*/ |
||||
@Override |
||||
public int getIconHeight() { |
||||
return HEIGHT; |
||||
} |
||||
} |
@ -0,0 +1,199 @@
|
||||
package com.fr.design.chart; |
||||
|
||||
import com.fr.base.chart.chartdata.CallbackEvent; |
||||
import com.fr.chart.chartattr.ChartCollection; |
||||
import com.fr.chartx.attr.ChartProvider; |
||||
import com.fr.design.data.DesignTableDataManager; |
||||
import com.fr.design.data.datapane.TableDataComboBox; |
||||
import com.fr.design.data.tabledata.wrapper.TableDataWrapper; |
||||
import com.fr.design.gui.ibutton.UIButton; |
||||
import com.fr.design.gui.icombocheckbox.UIComboCheckBox; |
||||
import com.fr.design.gui.ilable.UILabel; |
||||
import com.fr.design.i18n.Toolkit; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.design.utils.gui.GUICoreUtils; |
||||
|
||||
import javax.swing.BorderFactory; |
||||
import javax.swing.DefaultListCellRenderer; |
||||
import javax.swing.DefaultListModel; |
||||
import javax.swing.JList; |
||||
import javax.swing.JPanel; |
||||
import javax.swing.JScrollPane; |
||||
import javax.swing.JSplitPane; |
||||
import javax.swing.ListCellRenderer; |
||||
import java.util.HashMap; |
||||
import java.util.List; |
||||
import java.util.Map; |
||||
import java.awt.Color; |
||||
import java.awt.Component; |
||||
import java.awt.Dimension; |
||||
import java.awt.event.ActionEvent; |
||||
import java.awt.event.ActionListener; |
||||
import java.awt.event.ItemEvent; |
||||
import java.awt.event.ItemListener; |
||||
|
||||
/** |
||||
* @author Bjorn |
||||
* @version 10.0 |
||||
* Created by Bjorn on 2020-05-29 |
||||
*/ |
||||
public class AutoChartTypePane extends ChartWizardPane implements CallbackEvent { |
||||
|
||||
private JList chartViewList; |
||||
private DefaultListModel chartResultModel; |
||||
private UIButton refreshButton; |
||||
|
||||
private TableDataComboBox tableNameComboBox; |
||||
private UIComboCheckBox dataFieldBox; |
||||
|
||||
public AutoChartTypePane() { |
||||
this.setLayout(FRGUIPaneFactory.createBorderLayout()); |
||||
initButtonGroup(); |
||||
initRefreshLabel(); |
||||
initDataFiledBox(); |
||||
JPanel contentPane = createContentPane(); |
||||
|
||||
chartViewList = new JList(); |
||||
|
||||
chartResultModel = new DefaultListModel(); |
||||
chartViewList.setModel(chartResultModel); |
||||
chartViewList.setVisibleRowCount(0); |
||||
chartViewList.setLayoutOrientation(JList.HORIZONTAL_WRAP); |
||||
chartViewList.setCellRenderer(iconCellRenderer); |
||||
|
||||
JScrollPane subListPane = new JScrollPane(chartViewList); |
||||
|
||||
JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, true, contentPane, subListPane); |
||||
splitPane.setDividerLocation(60); |
||||
splitPane.setBorder(BorderFactory.createTitledBorder(Toolkit.i18nText("Fine-Design_Chart_M_Popup_Auto_Chart_Type"))); |
||||
this.add(splitPane); |
||||
} |
||||
|
||||
ListCellRenderer iconCellRenderer = new DefaultListCellRenderer() { |
||||
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { |
||||
super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); |
||||
this.setText(""); |
||||
|
||||
AutoChartIcon chartIcon = (AutoChartIcon) value; |
||||
this.setIcon(chartIcon); |
||||
setHorizontalAlignment(UILabel.CENTER); |
||||
if (isSelected) { |
||||
// 深蓝色.
|
||||
this.setBackground(new Color(57, 107, 181)); |
||||
this.setBorder(GUICoreUtils.createTitledBorder(chartIcon.getChartName(), Color.WHITE)); |
||||
} else { |
||||
this.setBorder(GUICoreUtils.createTitledBorder(chartIcon.getChartName())); |
||||
} |
||||
return this; |
||||
} |
||||
}; |
||||
|
||||
private JPanel createContentPane() { |
||||
JPanel panel = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); |
||||
|
||||
JPanel tableDataPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); |
||||
panel.add(tableDataPane); |
||||
tableDataPane.add(new UILabel(Toolkit.i18nText("Fine-Design_Chart_Table_Data") + ":")); |
||||
tableNameComboBox.setPreferredSize(new Dimension(96, 20)); |
||||
tableDataPane.add(tableNameComboBox); |
||||
|
||||
JPanel areaNamePane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); |
||||
panel.add(areaNamePane); |
||||
areaNamePane.add(new UILabel(Toolkit.i18nText("Fine-Design_Chart_Data_Field") + ":")); |
||||
areaNamePane.add(dataFieldBox); |
||||
panel.add(refreshButton); |
||||
return panel; |
||||
} |
||||
|
||||
private void initButtonGroup() { |
||||
dataFieldBox = new UIComboCheckBox(new Object[0]); |
||||
dataFieldBox.addActionListener(new ActionListener() { |
||||
@Override |
||||
public void actionPerformed(ActionEvent e) { |
||||
checkButtonState(); |
||||
} |
||||
}); |
||||
} |
||||
|
||||
private void initDataFiledBox() { |
||||
tableNameComboBox = new TableDataComboBox(DesignTableDataManager.getEditingTableDataSource()); |
||||
tableNameComboBox.addItemListener(new ItemListener() { |
||||
@Override |
||||
public void itemStateChanged(ItemEvent e) { |
||||
if (e.getStateChange() == ItemEvent.SELECTED) { |
||||
refreshBox(); |
||||
checkButtonState(); |
||||
} |
||||
} |
||||
}); |
||||
} |
||||
|
||||
private void checkButtonState() { |
||||
if (tableNameComboBox.getSelectedItem() != null && dataFieldBox.getSelectedValues().length > 0) { |
||||
refreshButton.setEnabled(true); |
||||
} else { |
||||
refreshButton.setEnabled(false); |
||||
} |
||||
} |
||||
|
||||
private void refreshBox() { |
||||
TableDataWrapper dataWrap = tableNameComboBox.getSelectedItem(); |
||||
|
||||
if (dataWrap == null) { |
||||
return; |
||||
} |
||||
dataFieldBox.clearText(); |
||||
|
||||
List<String> columnNameList = dataWrap.calculateColumnNameList(); |
||||
|
||||
dataFieldBox.refreshCombo(columnNameList.toArray()); |
||||
} |
||||
|
||||
private void initRefreshLabel() { |
||||
refreshButton = new UIButton(Toolkit.i18nText("Fine-Design_Chart_Recommend")); |
||||
refreshButton.addActionListener(new ActionListener() { |
||||
@Override |
||||
public void actionPerformed(ActionEvent e) { |
||||
calculateAutoChart(); |
||||
} |
||||
}); |
||||
refreshButton.setEnabled(false); |
||||
} |
||||
|
||||
private void calculateAutoChart() { |
||||
chartResultModel.clear(); |
||||
} |
||||
|
||||
@Override |
||||
public void populate(ChartCollection cc) { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void update(ChartCollection cc) { |
||||
if (chartViewList.getSelectedIndex() < 0) { |
||||
return; |
||||
} |
||||
AutoChartIcon chartIcon = (AutoChartIcon) chartViewList.getSelectedValue(); |
||||
ChartProvider chartProvider = chartIcon.getChartCollection().getSelectedChartProvider(ChartProvider.class); |
||||
if (cc.getChartCount() > 0) { |
||||
cc.setSelectChart(chartProvider); |
||||
} else { |
||||
cc.addChart(chartProvider); |
||||
} |
||||
} |
||||
|
||||
public void populate(String tableName, String[] dataFields) { |
||||
tableNameComboBox.setSelectedTableDataByName(tableName); |
||||
Map<Object, Boolean> map = new HashMap(); |
||||
for (String dataField : dataFields) { |
||||
map.put(dataField, true); |
||||
} |
||||
dataFieldBox.setSelectedValues(map); |
||||
} |
||||
|
||||
@Override |
||||
public void callback() { |
||||
this.repaint(); |
||||
} |
||||
} |
@ -0,0 +1,113 @@
|
||||
package com.fr.van.chart.designer.component; |
||||
|
||||
import com.fr.chart.base.GradientStyle; |
||||
import com.fr.design.i18n.Toolkit; |
||||
import com.fr.design.layout.TableLayout; |
||||
import com.fr.design.style.background.gradient.FixedGradientBar; |
||||
import com.fr.plugin.chart.type.GradientType; |
||||
import com.fr.van.chart.designer.TableLayout4VanChartHelper; |
||||
|
||||
import javax.swing.JPanel; |
||||
import java.awt.BorderLayout; |
||||
import java.awt.Component; |
||||
import java.awt.event.ActionEvent; |
||||
import java.awt.event.ActionListener; |
||||
|
||||
public class VanChartBeautyPaneWithGradientBar extends VanChartBeautyPane { |
||||
|
||||
private FixedGradientBar colorGradient; |
||||
private JPanel gradientBarPane; |
||||
|
||||
public VanChartBeautyPaneWithGradientBar() { |
||||
super(); |
||||
|
||||
this.add(initGradientBarPane(), BorderLayout.SOUTH); |
||||
|
||||
initListener(); |
||||
} |
||||
|
||||
private JPanel initGradientBarPane() { |
||||
colorGradient = new FixedGradientBar(4, 140); |
||||
|
||||
double p = TableLayout.PREFERRED; |
||||
double f = TableLayout.FILL; |
||||
double e = TableLayout4VanChartHelper.EDIT_AREA_WIDTH; |
||||
double[] columnSize = {f, e}; |
||||
double[] rowSize = {p, p}; |
||||
Component[][] components = new Component[][]{ |
||||
new Component[]{null, null}, |
||||
new Component[]{null, colorGradient}, |
||||
}; |
||||
|
||||
gradientBarPane = TableLayout4VanChartHelper.createGapTableLayoutPane(components, rowSize, columnSize); |
||||
|
||||
return gradientBarPane; |
||||
} |
||||
|
||||
private void initListener() { |
||||
getGradientTypeBox().addActionListener(new ActionListener() { |
||||
public void actionPerformed(ActionEvent e) { |
||||
checkGradientBarVisible(); |
||||
} |
||||
}); |
||||
} |
||||
|
||||
private void checkGradientBarVisible() { |
||||
if (colorGradient != null && gradientBarPane != null) { |
||||
gradientBarPane.setVisible(getGradientTypeBox().getSelectedIndex() == 1); |
||||
} |
||||
} |
||||
|
||||
protected String[] getNameArray() { |
||||
return new String[]{ |
||||
Toolkit.i18nText("Fine-Design_Chart_Auto"), |
||||
Toolkit.i18nText("Fine-Design_Chart_Custom"), |
||||
Toolkit.i18nText("Fine-Design_Chart_Off") |
||||
}; |
||||
} |
||||
|
||||
public void populateBean(GradientStyle gradientStyle) { |
||||
super.populateBean(gradientStyle); |
||||
|
||||
if (colorGradient != null) { |
||||
colorGradient.updateColor(gradientStyle.getStartColor(), gradientStyle.getEndColor()); |
||||
} |
||||
|
||||
checkGradientBarVisible(); |
||||
} |
||||
|
||||
@Override |
||||
public GradientStyle updateBean() { |
||||
GradientStyle gradientStyle = super.updateBean(); |
||||
|
||||
if (this.colorGradient != null && this.gradientBarPane != null) { |
||||
gradientStyle.setStartColor(colorGradient.getSelectColorPointBtnP1().getColorInner()); |
||||
gradientStyle.setEndColor(colorGradient.getSelectColorPointBtnP2().getColorInner()); |
||||
} |
||||
|
||||
return gradientStyle; |
||||
} |
||||
|
||||
protected int convertGradientTypeToIndex(GradientType gradientType) { |
||||
switch (gradientType) { |
||||
case CUSTOM: |
||||
return 1; |
||||
case NONE: |
||||
return 2; |
||||
default: |
||||
return 0; |
||||
} |
||||
} |
||||
|
||||
protected GradientType convertIndexToGradientType(int index) { |
||||
switch (index) { |
||||
case 1: |
||||
return GradientType.CUSTOM; |
||||
case 2: |
||||
return GradientType.NONE; |
||||
default: |
||||
return GradientType.AUTO; |
||||
} |
||||
} |
||||
|
||||
} |
@ -0,0 +1,153 @@
|
||||
package com.fr.van.chart.designer.other.condition.item; |
||||
|
||||
import com.fr.base.background.ColorBackground; |
||||
import com.fr.chart.base.AttrBackground; |
||||
import com.fr.chart.base.DataSeriesCondition; |
||||
import com.fr.design.condition.ConditionAttributesPane; |
||||
import com.fr.design.gui.ibutton.UIButtonGroup; |
||||
import com.fr.design.i18n.Toolkit; |
||||
import com.fr.design.layout.TableLayout; |
||||
import com.fr.design.style.background.gradient.FixedGradientBar; |
||||
import com.fr.design.style.color.ColorSelectBox; |
||||
import com.fr.plugin.chart.type.GradientType; |
||||
import com.fr.van.chart.designer.TableLayout4VanChartHelper; |
||||
|
||||
import javax.swing.JPanel; |
||||
import java.awt.BorderLayout; |
||||
import java.awt.Component; |
||||
import java.awt.event.ActionEvent; |
||||
import java.awt.event.ActionListener; |
||||
|
||||
public class VanChartColumnSeriesColorConditionPane extends AbstractNormalMultiLineConditionPane { |
||||
|
||||
private UIButtonGroup matchColorTypeBox; |
||||
|
||||
private ColorSelectBox colorSelectionBox; |
||||
private FixedGradientBar colorGradient; |
||||
|
||||
private JPanel colorSelectPane; |
||||
private JPanel colorGradientPane; |
||||
|
||||
public VanChartColumnSeriesColorConditionPane(ConditionAttributesPane conditionAttributesPane) { |
||||
super(conditionAttributesPane, null); |
||||
} |
||||
|
||||
protected String getItemLabelString() { |
||||
return nameForPopupMenuItem(); |
||||
} |
||||
|
||||
protected JPanel initContentPane() { |
||||
colorSelectionBox = new ColorSelectBox(80); |
||||
colorGradient = new FixedGradientBar(4, 150); |
||||
|
||||
colorSelectPane = createJPanelWithComponent(colorSelectionBox); |
||||
colorGradientPane = createJPanelWithComponent(colorGradient); |
||||
|
||||
JPanel panel = new JPanel(); |
||||
|
||||
panel.setLayout(new BorderLayout()); |
||||
|
||||
panel.add(initColorButtonPane(), BorderLayout.NORTH); |
||||
panel.add(colorSelectPane, BorderLayout.CENTER); |
||||
panel.add(colorGradientPane, BorderLayout.SOUTH); |
||||
|
||||
initListener(); |
||||
|
||||
return panel; |
||||
} |
||||
|
||||
private JPanel initColorButtonPane() { |
||||
String[] names = new String[]{ |
||||
Toolkit.i18nText("Fine-Design_Chart_Solid_Color"), |
||||
Toolkit.i18nText("Fine-Design_Chart_Style_TopDownShade") |
||||
}; |
||||
|
||||
matchColorTypeBox = new UIButtonGroup(names); |
||||
|
||||
double p = TableLayout.PREFERRED; |
||||
double e = TableLayout4VanChartHelper.EDIT_AREA_WIDTH; |
||||
|
||||
Component[][] components = new Component[][]{new Component[]{matchColorTypeBox}}; |
||||
|
||||
return TableLayout4VanChartHelper.createGapTableLayoutPane(components, new double[]{p}, new double[]{e}); |
||||
} |
||||
|
||||
private void initListener() { |
||||
matchColorTypeBox.addActionListener(new ActionListener() { |
||||
public void actionPerformed(ActionEvent e) { |
||||
checkColorPaneVisible(); |
||||
} |
||||
}); |
||||
} |
||||
|
||||
private void checkColorPaneVisible() { |
||||
if (colorSelectPane != null) { |
||||
colorSelectPane.setVisible(matchColorTypeBox.getSelectedIndex() == 0); |
||||
} |
||||
if (colorGradientPane != null) { |
||||
colorGradientPane.setVisible(matchColorTypeBox.getSelectedIndex() == 1); |
||||
} |
||||
} |
||||
|
||||
public String nameForPopupMenuItem() { |
||||
return Toolkit.i18nText("Fine-Design_Chart_Match_Color"); |
||||
} |
||||
|
||||
protected String title4PopupWindow() { |
||||
return Toolkit.i18nText("Fine-Design_Chart_Match_Color"); |
||||
} |
||||
|
||||
public void populate(DataSeriesCondition condition) { |
||||
if (condition instanceof AttrBackground) { |
||||
AttrBackground matchColor = (AttrBackground) condition; |
||||
|
||||
if (matchColor.getGradient() == GradientType.NONE) { |
||||
this.matchColorTypeBox.setSelectedIndex(0); |
||||
} else { |
||||
this.matchColorTypeBox.setSelectedIndex(1); |
||||
} |
||||
|
||||
ColorBackground seriesColor = (ColorBackground) matchColor.getSeriesBackground(); |
||||
|
||||
if (seriesColor != null) { |
||||
this.colorSelectionBox.setSelectObject(seriesColor.getColor()); |
||||
} |
||||
|
||||
this.colorGradient.updateColor(matchColor.getGradientStartColor(), matchColor.getGradientEndColor()); |
||||
} |
||||
|
||||
checkColorPaneVisible(); |
||||
} |
||||
|
||||
public DataSeriesCondition update() { |
||||
AttrBackground matchColor = new AttrBackground(); |
||||
|
||||
if (this.matchColorTypeBox.getSelectedIndex() == 0) { |
||||
matchColor.setGradient(GradientType.NONE); |
||||
} else { |
||||
matchColor.setGradient(GradientType.CUSTOM); |
||||
} |
||||
|
||||
matchColor.setSeriesBackground(ColorBackground.getInstance(this.colorSelectionBox.getSelectObject())); |
||||
matchColor.setGradientStartColor(this.colorGradient.getSelectColorPointBtnP1().getColorInner()); |
||||
matchColor.setGradientEndColor(this.colorGradient.getSelectColorPointBtnP2().getColorInner()); |
||||
|
||||
return matchColor; |
||||
} |
||||
|
||||
public void setDefault() { |
||||
this.populate(new AttrBackground()); |
||||
} |
||||
|
||||
private JPanel createJPanelWithComponent(Component component) { |
||||
double p = TableLayout.PREFERRED; |
||||
double e = TableLayout4VanChartHelper.EDIT_AREA_WIDTH; |
||||
|
||||
Component[][] components = new Component[][]{ |
||||
new Component[]{null}, |
||||
new Component[]{component} |
||||
}; |
||||
|
||||
return TableLayout4VanChartHelper.createGapTableLayoutPane(components, new double[]{p, p}, new double[]{e}); |
||||
} |
||||
} |
After Width: | Height: | Size: 179 B |
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 21 KiB |
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 25 KiB |
@ -0,0 +1,3 @@
|
||||
dependencies { |
||||
compile project(':designer-base') |
||||
} |
@ -0,0 +1,58 @@
|
||||
package com.fr.design.designer.beans.models; |
||||
|
||||
import com.fr.design.designer.creator.XCreator; |
||||
import com.fr.design.designer.creator.XWParameterLayout; |
||||
import com.fr.form.main.Form; |
||||
import com.fr.form.ui.Widget; |
||||
import com.fr.stable.StringUtils; |
||||
|
||||
import java.util.HashSet; |
||||
import java.util.Set; |
||||
|
||||
/** |
||||
* created by Harrison on 2020/06/05 |
||||
**/ |
||||
abstract class ModelUtil { |
||||
|
||||
public static void renameWidgetName(Form form, XCreator xCreator) { |
||||
|
||||
Set<String> duplicated = new HashSet<>(); |
||||
recursiveRenameWidgetName(form, xCreator, duplicated); |
||||
} |
||||
|
||||
private static void recursiveRenameWidgetName(Form form, XCreator xCreator, Set<String> duplicated) { |
||||
|
||||
Set<XCreator> nameRelatedCreators = new HashSet<>(); |
||||
//直接遍历出来目标值,然后按需处理
|
||||
xCreator.traversalNameRelatedXCreators(nameRelatedCreators); |
||||
for (XCreator target : nameRelatedCreators) { |
||||
String uniqueName = uniqueName(form, target, duplicated); |
||||
target.resetCreatorName(uniqueName); |
||||
} |
||||
} |
||||
|
||||
private static String uniqueName(Form form, XCreator xCreator, Set<String> duplicated) { |
||||
|
||||
if (xCreator.acceptType(XWParameterLayout.class)) { |
||||
return xCreator.createDefaultName(); |
||||
} |
||||
Widget widget = xCreator.toData(); |
||||
String widgetName = widget.getWidgetName(); |
||||
if (StringUtils.isEmpty(widgetName)) { |
||||
widgetName = xCreator.createDefaultName(); |
||||
} |
||||
//先保存默认名字
|
||||
String raw = widgetName; |
||||
int i = 0; |
||||
//先初始化加上索引。
|
||||
widgetName = widgetName + i; |
||||
while (form.isNameExist(widgetName) || duplicated.contains(widgetName)) { |
||||
i++; |
||||
widgetName = raw + i; |
||||
} |
||||
//将名字加入重复集合中
|
||||
duplicated.add(widgetName); |
||||
return widgetName; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,121 @@
|
||||
package com.fr.design.designer.creator; |
||||
|
||||
import com.fr.base.GraphHelper; |
||||
import com.fr.base.chart.BaseChartCollection; |
||||
import com.fr.common.annotations.Open; |
||||
import com.fr.design.dialog.DialogActionAdapter; |
||||
import com.fr.design.gui.chart.MiddleChartComponent; |
||||
import com.fr.design.gui.chart.MiddleChartDialog; |
||||
import com.fr.design.mainframe.BaseJForm; |
||||
import com.fr.design.mainframe.DesignerContext; |
||||
import com.fr.design.mainframe.EditingMouseListener; |
||||
import com.fr.design.mainframe.FormDesigner; |
||||
import com.fr.design.module.DesignModuleFactory; |
||||
import com.fr.form.ui.ChartAutoEditor; |
||||
import com.fr.general.IOUtils; |
||||
import com.fr.stable.Constants; |
||||
import com.fr.stable.bridge.StableFactory; |
||||
|
||||
import javax.swing.JComponent; |
||||
import javax.swing.JPanel; |
||||
import java.awt.Dimension; |
||||
import java.awt.Graphics; |
||||
import java.awt.event.MouseEvent; |
||||
import java.awt.image.BufferedImage; |
||||
|
||||
/** |
||||
* @author Bjorn |
||||
* @version 10.0 |
||||
* Created by Bjorn on 2020-05-26 |
||||
*/ |
||||
@Open |
||||
public class XAutoChartCreator extends XChartEditor { |
||||
|
||||
private MiddleChartDialog autoChartDialog; |
||||
|
||||
private EditingMouseListener editingMouseListener; |
||||
|
||||
public XAutoChartCreator(ChartAutoEditor editor, Dimension size) { |
||||
super(editor, size); |
||||
} |
||||
|
||||
/** |
||||
* 返回组件默认名 |
||||
* |
||||
* @return 组件类名(小写) |
||||
*/ |
||||
public String createDefaultName() { |
||||
return "auto_chart"; |
||||
} |
||||
|
||||
@Override |
||||
public ChartAutoEditor toData() { |
||||
return (ChartAutoEditor) data; |
||||
} |
||||
|
||||
|
||||
/** |
||||
* 点击选中的时候, 刷新界面 |
||||
* 右键 reset之后, 触发事件 populate此方法 |
||||
* |
||||
* @param jform 表单 |
||||
* @param formDesigner 表单设计器 |
||||
* @return 控件. |
||||
*/ |
||||
public JComponent createToolPane(final BaseJForm jform, final FormDesigner formDesigner) { |
||||
if (toData().isChartSelect()) { |
||||
return super.createToolPane(jform, formDesigner); |
||||
} |
||||
if (isEditing) { |
||||
if (autoChartDialog != null && autoChartDialog.isVisible()) { |
||||
return new JPanel(); |
||||
} |
||||
final BaseChartCollection chartCollection = (BaseChartCollection) StableFactory.createXmlObject(BaseChartCollection.XML_TAG); |
||||
autoChartDialog = DesignModuleFactory.getAutoChartDialog(DesignerContext.getDesignerFrame()); |
||||
autoChartDialog.populate(chartCollection); |
||||
autoChartDialog.addDialogActionListener(new DialogActionAdapter() { |
||||
@Override |
||||
public void doOk() { |
||||
initChart(autoChartDialog.getChartCollection()); |
||||
formDesigner.fireTargetModified(); |
||||
} |
||||
|
||||
@Override |
||||
public void doCancel() { |
||||
editingMouseListener.stopEditing(); |
||||
} |
||||
}); |
||||
autoChartDialog.setVisible(true); |
||||
} |
||||
return toData().isChartSelect() ? super.createToolPane(jform, formDesigner) : new JPanel(); |
||||
} |
||||
|
||||
/** |
||||
* 响应点击事件 |
||||
* |
||||
* @param editingMouseListener 鼠标点击,位置处理器 |
||||
* @param e 鼠标点击事件 |
||||
*/ |
||||
public void respondClick(EditingMouseListener editingMouseListener, MouseEvent e) { |
||||
this.editingMouseListener = editingMouseListener; |
||||
super.respondClick(editingMouseListener, e); |
||||
} |
||||
|
||||
|
||||
public void paint(Graphics g) { |
||||
BufferedImage bufferedImage = IOUtils.readImage("com/fr/design/form/images/auto_chart_preview.png"); |
||||
GraphHelper.paintImage( |
||||
g, this.getWidth(), this.getHeight(), bufferedImage, |
||||
Constants.IMAGE_ADJUST, |
||||
0, |
||||
0, -1, -1 |
||||
); |
||||
super.paint(g); |
||||
} |
||||
|
||||
private void initChart(BaseChartCollection chartCollection) { |
||||
((MiddleChartComponent) getDesignerEditor().getEditorTarget()).populate(chartCollection); |
||||
this.toData().resetChangeChartCollection(chartCollection); |
||||
this.toData().setChartSelect(true); |
||||
} |
||||
} |
@ -0,0 +1,32 @@
|
||||
package com.fr.design.designer.properties.mobile; |
||||
|
||||
import com.fr.design.designer.creator.XCreator; |
||||
import com.fr.design.designer.creator.XFieldEditor; |
||||
import com.fr.design.dialog.BasicPane; |
||||
import com.fr.design.fun.impl.AbstractWidgetPropertyUIProvider; |
||||
import com.fr.design.gui.itable.AbstractPropertyTable; |
||||
import com.fr.design.widget.ui.designer.mobile.ButtonGroupDefinePane; |
||||
|
||||
public class ButtonGroupPropertyUI extends AbstractWidgetPropertyUIProvider { |
||||
|
||||
private XCreator xCreator; |
||||
|
||||
public ButtonGroupPropertyUI(XFieldEditor xButtonGroupEditor) { |
||||
this.xCreator = xButtonGroupEditor; |
||||
} |
||||
|
||||
@Override |
||||
public AbstractPropertyTable createWidgetAttrTable() { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public BasicPane createWidgetAttrPane() { |
||||
return new ButtonGroupDefinePane(xCreator); |
||||
} |
||||
|
||||
@Override |
||||
public String tableTitle() { |
||||
return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Mobile_Attr"); |
||||
} |
||||
} |
@ -0,0 +1,83 @@
|
||||
package com.fr.design.widget.ui.designer.mobile; |
||||
|
||||
import com.fr.design.constants.LayoutConstants; |
||||
import com.fr.design.designer.creator.XCreator; |
||||
import com.fr.design.foldablepane.UIExpandablePane; |
||||
import com.fr.design.gui.frpane.AttributeChangeListener; |
||||
import com.fr.design.gui.ilable.UILabel; |
||||
import com.fr.design.gui.ispinner.UISpinner; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.design.layout.TableLayout; |
||||
import com.fr.design.layout.TableLayoutHelper; |
||||
import com.fr.design.mainframe.DesignerContext; |
||||
import com.fr.design.mainframe.FormDesigner; |
||||
import com.fr.form.ui.ButtonGroup; |
||||
|
||||
import javax.swing.*; |
||||
import java.awt.*; |
||||
|
||||
|
||||
public class ButtonGroupDefinePane extends MobileWidgetDefinePane { |
||||
|
||||
private XCreator xCreator; // 当前选中控件的xCreator
|
||||
private UISpinner maxShowRowsSpinner; |
||||
|
||||
public ButtonGroupDefinePane(XCreator xCreator) { |
||||
this.xCreator = xCreator; |
||||
} |
||||
|
||||
@Override |
||||
public void initPropertyGroups(Object source) { |
||||
this.setLayout(FRGUIPaneFactory.createBorderLayout()); |
||||
UILabel maxShowRowsLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design-Mobile_Max_Show_Rows"), SwingConstants.LEFT); |
||||
this.maxShowRowsSpinner = new UISpinner(0, Integer.MAX_VALUE, 1, 5); |
||||
Component[][] components = new Component[][]{ |
||||
new Component[] {maxShowRowsLabel, maxShowRowsSpinner} |
||||
}; |
||||
double f = TableLayout.FILL; |
||||
double p = TableLayout.PREFERRED; |
||||
double[] rowSize = {p}; |
||||
double[] columnSize = {p,f}; |
||||
int[][] rowCount = {{1, 1}}; |
||||
final JPanel panel = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, 30, LayoutConstants.VGAP_LARGE); |
||||
panel.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0)); |
||||
final JPanel panelWrapper = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||
panelWrapper.add(panel, BorderLayout.NORTH); |
||||
UIExpandablePane folderPane = new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Advanced"), 280, 20, panelWrapper); |
||||
this.add(folderPane, BorderLayout.NORTH); |
||||
this.repaint(); |
||||
} |
||||
|
||||
private void bindListeners2Widgets() { |
||||
reInitAllListeners(); |
||||
AttributeChangeListener changeListener = new AttributeChangeListener() { |
||||
@Override |
||||
public void attributeChange() { |
||||
update(); |
||||
} |
||||
}; |
||||
this.addAttributeChangeListener(changeListener); |
||||
} |
||||
|
||||
/** |
||||
* 后台初始化所有事件. |
||||
*/ |
||||
private void reInitAllListeners() { |
||||
initListener(this); |
||||
} |
||||
|
||||
@Override |
||||
public void populate(FormDesigner designer) { |
||||
ButtonGroup buttonGroup = (ButtonGroup)xCreator.toData(); |
||||
this.maxShowRowsSpinner.setValue(buttonGroup.getMaxShowRows()); |
||||
// 数据 populate 完成后,再设置监听
|
||||
this.bindListeners2Widgets(); |
||||
} |
||||
|
||||
@Override |
||||
public void update() { |
||||
ButtonGroup buttonGroup = (ButtonGroup)xCreator.toData(); |
||||
buttonGroup.setMaxShowRows((int) maxShowRowsSpinner.getValue()); |
||||
DesignerContext.getDesignerFrame().getSelectedJTemplate().fireTargetModified(); // 触发设计器保存按钮亮起来
|
||||
} |
||||
} |
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue