|
|
|
package com.fr.design.mainframe;
|
|
|
|
|
|
|
|
import com.fr.design.actions.utils.ReportActionUtils;
|
|
|
|
import com.fr.design.dialog.BasicPane;
|
|
|
|
import com.fr.design.layout.FRGUIPaneFactory;
|
|
|
|
import com.fr.design.utils.gui.AdjustWorkBookDefaultStyleUtils;
|
|
|
|
import com.fr.design.mainframe.theme.utils.DefaultThemedTemplateCellElementCase;
|
|
|
|
import com.fr.design.widget.WidgetPane;
|
|
|
|
import com.fr.form.ui.NoneWidget;
|
|
|
|
import com.fr.form.ui.Widget;
|
|
|
|
import com.fr.grid.selection.CellSelection;
|
|
|
|
import com.fr.grid.selection.Selection;
|
|
|
|
import com.fr.log.FineLoggerFactory;
|
|
|
|
import com.fr.privilege.finegrain.WidgetPrivilegeControl;
|
|
|
|
import com.fr.report.cell.CellElement;
|
|
|
|
import com.fr.report.cell.TemplateCellElement;
|
|
|
|
import com.fr.report.elementcase.TemplateElementCase;
|
|
|
|
|
|
|
|
import java.awt.BorderLayout;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Created by ibm on 2017/7/20.
|
|
|
|
*/
|
|
|
|
public class CellWidgetPropertyPane extends BasicPane {
|
|
|
|
|
|
|
|
private static CellWidgetPropertyPane singleton;
|
|
|
|
//当前控件板对应的单元格
|
|
|
|
private TemplateCellElement cellElement;
|
|
|
|
//右侧控件板
|
|
|
|
private WidgetPane cellEditorDefPane;
|
|
|
|
//左侧单元格板
|
|
|
|
private ElementCasePane ePane;
|
|
|
|
|
|
|
|
public static CellWidgetPropertyPane getInstance() {
|
|
|
|
if (singleton == null) {
|
|
|
|
singleton = new CellWidgetPropertyPane();
|
|
|
|
}
|
|
|
|
return singleton;
|
|
|
|
}
|
|
|
|
|
|
|
|
public CellWidgetPropertyPane() {
|
|
|
|
this.setLayout(FRGUIPaneFactory.createBorderLayout());
|
|
|
|
}
|
|
|
|
|
|
|
|
public void clear() {
|
|
|
|
singleton = null;
|
|
|
|
}
|
|
|
|
|
|
|
|
public WidgetPane getCellEditorDefPane() {
|
|
|
|
return cellEditorDefPane;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void setCellEditorDefPane(WidgetPane cellEditorDefPane) {
|
|
|
|
this.cellEditorDefPane = cellEditorDefPane;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
protected String title4PopupWindow() {
|
|
|
|
return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Widget_Control_Setting");
|
|
|
|
}
|
|
|
|
|
|
|
|
public void populate(TemplateCellElement cellElement) {
|
|
|
|
if (cellElement == null) {// 利用默认的CellElement.
|
|
|
|
cellElement = DefaultThemedTemplateCellElementCase.createInstance(0, 0, null);
|
|
|
|
}
|
|
|
|
|
|
|
|
Widget cellWidget = cellElement.getWidget();
|
|
|
|
|
|
|
|
|
|
|
|
// 这里进行克隆的原因是为了保留原始的Widget以便和新的Widget做比较来判断是否发生了改变
|
|
|
|
if (cellWidget != null) {
|
|
|
|
try {
|
|
|
|
cellWidget = (Widget) cellWidget.clone();
|
|
|
|
} catch (CloneNotSupportedException e) {
|
|
|
|
FineLoggerFactory.getLogger().error(e.getMessage(), e);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
cellEditorDefPane.populate(cellWidget);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 重初始化。选中单元格会走到这
|
|
|
|
*
|
|
|
|
* @param ePane 单元格板
|
|
|
|
*/
|
|
|
|
public void reInit(ElementCasePane ePane) {
|
|
|
|
this.ePane = ePane;
|
|
|
|
cellEditorDefPane = new WidgetPane(ePane);
|
|
|
|
this.removeAll();
|
|
|
|
this.add(cellEditorDefPane, BorderLayout.CENTER);
|
|
|
|
|
|
|
|
CellSelection cs = (CellSelection) ePane.getSelection();
|
|
|
|
final TemplateElementCase tplEC = ePane.getEditingElementCase();
|
|
|
|
TemplateCellElement editCellElement = tplEC.getTemplateCellElement(cs.getColumn(), cs.getRow());
|
|
|
|
if (editCellElement == null) {
|
|
|
|
editCellElement = DefaultThemedTemplateCellElementCase.createInstance(cs.getColumn(), cs.getRow());
|
|
|
|
AdjustWorkBookDefaultStyleUtils.adjustCellElement(editCellElement);
|
|
|
|
}
|
|
|
|
this.cellElement = editCellElement;
|
|
|
|
this.populate(editCellElement);
|
|
|
|
}
|
|
|
|
|
|
|
|
public void populate(ElementCasePane ePane) {
|
|
|
|
Selection editingSelection = ePane.getSelection();
|
|
|
|
editingSelection.populateWidgetPropertyPane(ePane);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 将控件板中的内容更新到当前选择的单元格项中
|
|
|
|
*/
|
|
|
|
public void update() {
|
|
|
|
if (ePane == null) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
//当前单元格板选中的单元格
|
|
|
|
CellSelection finalCS = (CellSelection) ePane.getSelection();
|
|
|
|
if (cellElement == null || !cellEditorDefPane.isShouldFireSelectedEvent()) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
doUpdate(finalCS);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 将控件板中的内容更新到指定单元格项中
|
|
|
|
* (js事件的提交入库事件选择单元格时,ePane.getSelection()是左侧选择的单元格,不是右侧控件板对应的单元格。这时候假如走无参的方法就有问题)
|
|
|
|
*
|
|
|
|
* @param selection 当前选中项
|
|
|
|
*/
|
|
|
|
public void update(Selection selection) {
|
|
|
|
if (cellElement == null || !cellEditorDefPane.isShouldFireSelectedEvent()) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
CellSelection finalCS = (CellSelection) selection;
|
|
|
|
//假如指定单元格项和当前控件板对应的单元格不同,则跳过
|
|
|
|
if (finalCS.getColumn() != cellElement.getColumn() || finalCS.getRow() != cellElement.getRow()) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
doUpdate(finalCS);
|
|
|
|
}
|
|
|
|
|
|
|
|
private void doUpdate(CellSelection finalCS) {
|
|
|
|
final TemplateElementCase tplEC = ePane.getEditingElementCase();
|
|
|
|
final Widget cellWidget = cellEditorDefPane.update();
|
|
|
|
if (cellWidget == null) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (finalCS.isSelectedOneCell(ePane)) {
|
|
|
|
if (tplEC.getTemplateCellElement(cellElement.getColumn(), cellElement.getRow()) == null) {//cellElement未加入到report中时要添加进去
|
|
|
|
tplEC.addCellElement(cellElement);
|
|
|
|
} else {
|
|
|
|
TemplateCellElement newCellElement = tplEC.getTemplateCellElement(finalCS.getColumn(), finalCS.getRow());
|
|
|
|
if (newCellElement != null) {
|
|
|
|
cellElement = newCellElement;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
setCellWidget(cellWidget, cellElement);
|
|
|
|
} else {
|
|
|
|
ReportActionUtils.actionIterateWithCellSelection(finalCS, tplEC, new ReportActionUtils.IterAction() {
|
|
|
|
public void dealWith(CellElement editCellElement) {
|
|
|
|
// p:最后把这个cellEditorDef设置到CellGUIAttr.
|
|
|
|
TemplateCellElement templateCellElement = (TemplateCellElement) editCellElement;
|
|
|
|
try {
|
|
|
|
setCellWidget((Widget) cellWidget.clone(), templateCellElement);
|
|
|
|
} catch (CloneNotSupportedException e) {
|
|
|
|
FineLoggerFactory.getLogger().error("InternalError: " + e.getMessage());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
if (DesignerContext.getDesignerFrame().getSelectedJTemplate() != null) {
|
|
|
|
DesignerContext.getDesignerFrame().getSelectedJTemplate().fireTargetModified();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private void setCellWidget(Widget cellWidget, TemplateCellElement cellElement) {
|
|
|
|
if (cellWidget instanceof NoneWidget) {
|
|
|
|
cellElement.setWidget(null);
|
|
|
|
} else {
|
|
|
|
if (cellElement.getWidget() != null) {
|
|
|
|
cellWidget = upDateWidgetAuthority(cellElement, cellWidget);
|
|
|
|
}
|
|
|
|
cellElement.setWidget(cellWidget);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 刷新所有监听器
|
|
|
|
*/
|
|
|
|
public void reInitAllListener() {
|
|
|
|
cellEditorDefPane.registerListener();
|
|
|
|
}
|
|
|
|
|
|
|
|
private Widget upDateWidgetAuthority(TemplateCellElement cellElement, Widget newWidget) {
|
|
|
|
try {
|
|
|
|
Widget oldWidget = (Widget) cellElement.getWidget().clone();
|
|
|
|
if (newWidget.getClass() == oldWidget.getClass()) {
|
|
|
|
newWidget.setWidgetPrivilegeControl((WidgetPrivilegeControl) oldWidget.getWidgetPrivilegeControl().clone());
|
|
|
|
}
|
|
|
|
} catch (Exception e) {
|
|
|
|
FineLoggerFactory.getLogger().error(e.getMessage(), e);
|
|
|
|
}
|
|
|
|
return newWidget;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 检测是否有效
|
|
|
|
*
|
|
|
|
* @throws Exception e
|
|
|
|
*/
|
|
|
|
@Override
|
|
|
|
public void checkValid() throws Exception {
|
|
|
|
this.cellEditorDefPane.checkValid();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|