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
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()); |
|
} |
|
|
|
} |