帆软报表设计器源代码。
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

128 lines
4.6 KiB

package com.fr.design.mainframe.alphafine.search;
import com.fr.design.actions.help.alphafine.AlphaFineConstants;
import com.fr.design.mainframe.alphafine.AlphaFineHelper;
import com.fr.design.mainframe.alphafine.CellType;
import com.fr.design.mainframe.alphafine.component.AlphaFineFrame;
import com.fr.design.mainframe.alphafine.component.ProductNewsSearchResultPane;
import com.fr.design.mainframe.alphafine.model.ProductNews;
import com.fr.log.FineLoggerFactory;
import javax.swing.DefaultListModel;
import javax.swing.SwingWorker;
import java.util.List;
import java.util.function.Function;
/**
* @author hades
* @version 11.0
* Created by hades on 2022/4/22
*/
public class ProductNewsSearchWorkerManager implements SearchManager {
private final CellType cellType;
private SwingWorker<DefaultListModel<ProductNews>, Void> searchWorker;
private Function<SearchTextBean, List<ProductNews>> searchFunction;
private ProductNewsSearchResultPane searchResultPane;
private AlphaFineFrame alphaFineFrame;
private volatile boolean hasSearchResult = true;
private volatile boolean searchOver = false;
private volatile boolean networkError = false;
public ProductNewsSearchWorkerManager(CellType cellType, Function<SearchTextBean, List<ProductNews>> searchFunction, AlphaFineFrame alphaFineFrame) {
this.cellType = cellType;
this.searchFunction = searchFunction;
this.alphaFineFrame = alphaFineFrame;
}
@Override
public void doSearch(SearchTextBean searchTextBean) {
checkSearchWork();
searchOver = false;
networkError = false;
if (searchResultPane != null) {
alphaFineFrame.removeSearchResultPane(searchResultPane);
}
searchResultPane = new ProductNewsSearchResultPane(searchTextBean.getSegmentation());
alphaFineFrame.addResult(searchResultPane, cellType.getFlagStr4Result());
this.searchWorker = new SwingWorker<DefaultListModel<ProductNews>, Void>() {
@Override
protected DefaultListModel<ProductNews> doInBackground() throws Exception {
DefaultListModel<ProductNews> productNewsDefaultListModel = new DefaultListModel<>();
if (!AlphaFineHelper.isNetworkOk() && cellType.isNeedNetWork()) {
networkError = true;
FineLoggerFactory.getLogger().warn("alphaFine network error");
return productNewsDefaultListModel;
}
List<ProductNews> productNewsList = searchFunction.apply(searchTextBean);
for (ProductNews productNews : productNewsList) {
productNewsDefaultListModel.addElement(productNews);
}
return productNewsDefaultListModel;
}
@Override
protected void done() {
searchOver = true;
if (!isCancelled()) {
try {
if (networkError) {
alphaFineFrame.showResult(AlphaFineConstants.NETWORK_ERROR);
return;
}
DefaultListModel<ProductNews> productNewsDefaultListModel = get();
hasSearchResult = !productNewsDefaultListModel.isEmpty();
searchResultPane.getProductNewsList().setModel(get());
if (alphaFineFrame.getSelectedType() == cellType) {
if (!hasSearchResult) {
alphaFineFrame.showResult(CellType.NO_RESULT.getFlagStr4None());
return;
}
alphaFineFrame.showResult(cellType.getFlagStr4Result());
searchResultPane.getProductNewsList().setSelectedIndex(0);
}
} catch (Exception e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
}
}
}
};
this.searchWorker.execute();
}
public ProductNewsSearchResultPane getSearchResultPane() {
return searchResultPane;
}
@Override
public boolean hasSearchResult() {
return hasSearchResult;
}
@Override
public boolean isSearchOver() {
return searchOver;
}
private void checkSearchWork() {
if (this.searchWorker != null && !this.searchWorker.isDone()) {
this.searchWorker.cancel(true);
this.searchWorker = null;
}
}
@Override
public boolean isNetWorkError() {
return networkError;
}
}