帆软报表设计器源代码。
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.
 
 
 
 

284 lines
12 KiB

package com.fr.grid.dnd;
import java.awt.Point;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetAdapter;
import java.awt.dnd.DropTargetContext;
import java.awt.dnd.DropTargetDragEvent;
import java.awt.dnd.DropTargetDropEvent;
import java.awt.event.ActionEvent;
import javax.swing.JOptionPane;
import javax.swing.JPopupMenu;
import com.fr.base.FRContext;
import com.fr.design.actions.ToggleButtonUpdateAction;
import com.fr.design.actions.UpdateAction;
import com.fr.design.gui.ibutton.UIToggleButton;
import com.fr.general.Inter;
import com.fr.general.data.TableDataColumn;
import com.fr.design.mainframe.ElementCasePane;
import com.fr.grid.Grid;
import com.fr.grid.GridUtils;
import com.fr.grid.selection.CellSelection;
import com.fr.grid.selection.Selection;
import com.fr.report.cell.CellElement;
import com.fr.report.cell.DefaultTemplateCellElement;
import com.fr.report.cell.TemplateCellElement;
import com.fr.report.cell.cellattr.CellExpandAttr;
import com.fr.report.cell.cellattr.core.group.DSColumn;
import com.fr.report.elementcase.TemplateElementCase;
import com.fr.report.poly.PolyECBlock;
import com.fr.report.worksheet.FormElementCase;
import com.fr.report.worksheet.WorkSheet;
import com.fr.stable.ArrayUtils;
import com.fr.stable.Constants;
import com.fr.design.utils.gui.GUICoreUtils;
/**
* the class used for drop an element to the grid
*
* @editor zhou 2012-3-22下午2:04:41
*/
public class ElementCasePaneDropTarget extends DropTargetAdapter {
private static final int LEFT_2_RIGHT = 0;
private static final int RIGHT_2_LEFT = 1;
private static final int TOP_2_BOTTOM = 2;
private static final int BOTTOM_2_TOP = 3;
private ElementCasePane ePane;
// AUGUST:notice 这个cs只是鼠标放下的那个去的那个单元格的副本
private CellSelection cs;
private String[][] doubleArray = null;
public ElementCasePaneDropTarget(ElementCasePane ePane) {
this.ePane = ePane;
new DropTarget(ePane.getGrid(), this);
}
@Override
public void drop(DropTargetDropEvent dtde) {
Point p = dtde.getLocation();
DropTargetContext dtc = dtde.getDropTargetContext();
Grid grid = (Grid) dtc.getComponent();
Selection selection = grid.getElementCasePane().getSelection();
TemplateElementCase report = grid.getElementCasePane().getEditingElementCase();
if (!(selection instanceof CellSelection) || report == null) {
dtde.rejectDrop();
return;
}
CellSelection cs = (CellSelection) selection;
try {
Transferable tr = dtde.getTransferable();
DataFlavor[] flavors = tr.getTransferDataFlavors();
for (int i = 0; i < flavors.length; i++) {
if (!tr.isDataFlavorSupported(flavors[i])) {
continue;
}
dtde.acceptDrop(dtde.getDropAction());
Object userObj = tr.getTransferData(flavors[i]);
if (userObj instanceof Class) {
Class cls = (Class) userObj;
grid.startCellEditingAt_DEC(cs.getColumn(), cs.getRow(), cls, false);
} else if (userObj instanceof String[][]) {
doubleArray = (String[][]) userObj;
// marks:当列数为一时候,不需要菜单
if (doubleArray.length > 1) {
JPopupMenu popMenu = new JPopupMenu();
GUICoreUtils.showPopupMenu(createPopupMenu(popMenu), ePane.getGrid(), (int) p.getX() + 1, (int) p.getY() + 1);
} else {
new SortAction(LEFT_2_RIGHT).sortCellElement();
}
}
dtde.dropComplete(true);
ePane.fireSelectionChangeListener();
}
dtde.rejectDrop();
} catch (Exception e) {
// dtde.rejectDrop();
FRContext.getLogger().error(e.getMessage(), e);
}
}
private JPopupMenu createPopupMenu(JPopupMenu popupMenu) {
popupMenu = new JPopupMenu();
popupMenu.add(new SortAction(LEFT_2_RIGHT).createMenuItem());
popupMenu.add(new SortAction(RIGHT_2_LEFT).createMenuItem());
popupMenu.add(new SortAction(TOP_2_BOTTOM).createMenuItem());
popupMenu.add(new SortAction(BOTTOM_2_TOP).createMenuItem());
return popupMenu;
}
private class SortAction extends UpdateAction implements ToggleButtonUpdateAction {
private int direction;
public SortAction(int i) {
direction = i;
if (i == LEFT_2_RIGHT) {
this.setName(Inter.getLocText("Utils-Left_to_Right_a"));
} else if (i == RIGHT_2_LEFT) {
this.setName(Inter.getLocText("Utils-Right_to_Left"));
} else if (i == TOP_2_BOTTOM) {
this.setName(Inter.getLocText("Utils-Top_to_Bottom_a"));
} else if (i == BOTTOM_2_TOP) {
this.setName(Inter.getLocText("Utils-Bottom_to_Top"));
}
this.setMnemonic('S');
}
@Override
public void actionPerformed(ActionEvent e) {
sortCellElement();
}
@Override
public UIToggleButton createToolBarComponent() {
return GUICoreUtils.createToolBarComponent(this);
}
private void sortCellElement() {
cs = (CellSelection) ePane.getSelection();
if (doubleArray == null) {
return;
}
if (!canMove()) {
return;
}
int columnCount = doubleArray.length;
for (int i = 0; i < columnCount; i++) {
if (i != 0) {
CellElement cellElement = null;
CellSelection cs = (CellSelection) ePane.getSelection();
if (direction == LEFT_2_RIGHT) {
cellElement = ePane.getEditingElementCase().getCellElement(cs.getColumn() + cs.getColumnSpan(), cs.getRow());
// marks:如果单元格为空,新建一个
if (cellElement == null) {
ePane.setSelection(new CellSelection(cs.getColumn() + cs.getColumnSpan(), cs.getRow(), 1, 1));
}
} else if (direction == RIGHT_2_LEFT) {
cellElement = ePane.getEditingElementCase().getCellElement(cs.getColumn() - cs.getColumnSpan(), cs.getRow());
// marks:如果单元格为空,新建一个
if (cellElement == null) {
ePane.setSelection(new CellSelection(cs.getColumn() - cs.getColumnSpan(), cs.getRow(), 1, 1));
}
} else if (direction == TOP_2_BOTTOM) {
cellElement = ePane.getEditingElementCase().getCellElement(cs.getColumn(), cs.getRow() + cs.getRowSpan());
// marks:如果单元格为空,新建一个
if (cellElement == null) {
ePane.setSelection(new CellSelection(cs.getColumn(), cs.getRow() + cs.getRowSpan(), 1, 1));
}
} else if (direction == BOTTOM_2_TOP) {
cellElement = ePane.getEditingElementCase().getCellElement(cs.getColumn(), cs.getRow() - cs.getRowSpan());
// marks:如果单元格为空,新建一个
if (cellElement == null) {
ePane.setSelection(new CellSelection(cs.getColumn(), cs.getRow() - cs.getRowSpan(), 1, 1));
}
}
if (cellElement != null) {
ePane.setSelection(new CellSelection(cellElement.getColumn(), cellElement.getRow(), cellElement.getColumnSpan(), cellElement.getRowSpan()));
}
}
paintDropCellElement(i);
}
}
private boolean canMove() {
int columnCount = doubleArray.length;
if (direction == RIGHT_2_LEFT) {
int k = cs.getColumn() - columnCount + 1;
if (k < 0) {
JOptionPane.showMessageDialog(ePane, Inter.getLocText("Utils-Beyond_the_left_side_of_Border"));
return false;
}
} else if (direction == BOTTOM_2_TOP) {
int k = cs.getRow() - columnCount + 1;
if (k < 0) {
JOptionPane.showMessageDialog(ePane, Inter.getLocText("Utils-Beyond_the_top_side_of_Border"));
return false;
}
}
if (ePane.mustInVisibleRange()) {
if (direction == LEFT_2_RIGHT) {
if (!GridUtils.canMove(ePane, cs.getColumn() + columnCount - 1, cs.getRow())) {
JOptionPane.showMessageDialog(ePane, Inter.getLocText("Utils-Beyond_the_right_side_of_Border"));
return false;
}
} else if (direction == TOP_2_BOTTOM) {
if (!GridUtils.canMove(ePane, cs.getRow(), cs.getColumn() + columnCount - 1)) {
JOptionPane.showMessageDialog(ePane, Inter.getLocText("Utils-Beyond_the_bottom_side_of_Border"));
return false;
}
}
}
return true;
}
}
private void paintDropCellElement(int i) {
TemplateElementCase report = ePane.getEditingElementCase();
TemplateCellElement curCellElement = new DefaultTemplateCellElement();
if (report instanceof WorkSheet || report instanceof PolyECBlock || report instanceof FormElementCase) {
String[] attribute = doubleArray[i];
if (ArrayUtils.isEmpty(attribute)) {
return;
}
Object newLinearDSColumn = null;
DSColumn dsColumn = new DSColumn();
dsColumn.setDSName(attribute[0]);
String ColumnName = attribute[1];
TableDataColumn column;
if (ColumnName.length() > 0 && ColumnName.charAt(0) == '#') {
int serialNumber = Integer.parseInt(ColumnName.substring(1));
column = TableDataColumn.createColumn(serialNumber);
} else {
column = TableDataColumn.createColumn(ColumnName);
}
dsColumn.setColumn(column);
newLinearDSColumn = dsColumn;
CellSelection cs = (CellSelection) ePane.getSelection();
curCellElement = report.getTemplateCellElement(cs.getColumn(), cs.getRow());
CellExpandAttr cellExPandAttr = new CellExpandAttr();
cellExPandAttr.setDirection(Constants.TOP_TO_BOTTOM);
if (curCellElement == null) {
curCellElement = new DefaultTemplateCellElement(cs.getColumn(), cs.getRow(), cs.getColumnSpan(), cs.getRowSpan(), newLinearDSColumn);
report.addCellElement(curCellElement);
} else {
// marks:直接覆盖值
curCellElement.setValue(newLinearDSColumn);
curCellElement.setCellExpandAttr(cellExPandAttr);
}
curCellElement.setCellExpandAttr(cellExPandAttr);
}
ePane.setSupportDefaultParentCalculate(true);
ePane.fireTargetModified();
ePane.setSupportDefaultParentCalculate(false);
}
@Override
public void dragEnter(DropTargetDragEvent dtde) {
dtde.acceptDrag(dtde.getDropAction());
}
@Override
public void dragOver(DropTargetDragEvent dtde) {
Point p = dtde.getLocation();
DropTargetContext dtc = dtde.getDropTargetContext();
Grid grid = (Grid) dtc.getComponent();
grid.doMousePress(p.getX(), p.getY());
dtde.acceptDrag(dtde.getDropAction());
}
}