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
284 lines
12 KiB
9 years ago
|
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());
|
||
|
}
|
||
|
|
||
|
}
|