package com.fr.grid.selection; import com.fr.base.FRContext; import com.fr.design.ExtraDesignClassManager; import com.fr.design.cell.clipboard.CellElementsClip; import com.fr.design.cell.clipboard.ElementsTransferable; import com.fr.design.cell.clipboard.FloatElementsClip; import com.fr.design.fun.RightSelectionHandlerProvider; import com.fr.design.gui.imenu.UIPopupMenu; import com.fr.design.mainframe.ElementCasePane; import com.fr.design.selection.SelectableElement; import com.fr.report.elementcase.TemplateElementCase; import com.fr.stable.ColumnRow; import com.fr.stable.FCloneable; import javax.swing.JPopupMenu; import java.io.Serializable; import java.util.Set; /* * TODO ALEX_SEP Selection是跟ElementCasePane绑定的,能不能把ElementCasePane保存在Selection里面呢? * * 这样,与Selection相关的几个主要函数也就不用传ElementCasePane了 * * 但是,不知道持久化会不会有问题(咦?Selection在哪里会需要持久化? redo & undo?) */ public abstract class Selection implements FCloneable, Serializable , SelectableElement { public abstract boolean isSelectedOneCell(ElementCasePane ePane); public abstract void asTransferable(ElementsTransferable transferable, ElementCasePane ePane); public boolean pasteFloatElementClip(FloatElementsClip feClip, ElementCasePane ePane) { FloatElementsClip floatElementClip; try { floatElementClip = (FloatElementsClip) (feClip).clone(); } catch (CloneNotSupportedException e) { FRContext.getLogger().error(e.getMessage(), e); return false; } TemplateElementCase ec = ePane.getEditingElementCase(); FloatSelection fs = floatElementClip.pasteAt(ec); if (fs != null) { ePane.setSelection(fs); } return true; } public abstract boolean pasteCellElementsClip(CellElementsClip ceClip, ElementCasePane ePane); public abstract boolean pasteString(String str, ElementCasePane ePane); public abstract boolean pasteOtherType(Object ob, ElementCasePane ePane); public abstract boolean canMergeCells(ElementCasePane ePane); public abstract boolean mergeCells(ElementCasePane ePane); public abstract boolean canUnMergeCells(ElementCasePane ePane); public abstract boolean unMergeCells(ElementCasePane ePane); public abstract JPopupMenu createPopupMenu(ElementCasePane ePane); /** * 添加插件菜单(增删改都可以) * @param ePane * @param popupMenu */ public void addExtraMenu(ElementCasePane ePane, UIPopupMenu popupMenu) { Set selectionHandlerProviders = ExtraDesignClassManager.getInstance().getArray(RightSelectionHandlerProvider.XML_TAG); for (RightSelectionHandlerProvider handler : selectionHandlerProviders) { if (handler.accept(this)) { handler.dmlMenu(ePane, popupMenu); } } } public abstract boolean clear(ElementCasePane.Clear type, ElementCasePane ePane); public abstract int[] getSelectedRows(); public abstract int[] getSelectedColumns(); public abstract void moveLeft(ElementCasePane ePane); public abstract void moveRight(ElementCasePane ePane); public abstract void moveUp(ElementCasePane ePane); public abstract void moveDown(ElementCasePane ePane); public abstract boolean triggerDeleteAction(ElementCasePane ePane); public abstract boolean containsColumnRow(ColumnRow cr); public abstract void populatePropertyPane(ElementCasePane ePane); public abstract void populateWidgetPropertyPane(ElementCasePane ePane); @Override public Selection clone() throws CloneNotSupportedException { return (Selection)super.clone(); } }