package com.fr.grid.selection; import com.fr.base.vcs.DesignerMode; import com.fr.design.actions.cell.CleanAuthorityAction; import com.fr.design.actions.cell.FloatStyleAction; import com.fr.design.actions.core.ActionFactory; import com.fr.design.actions.edit.CopyAction; import com.fr.design.actions.edit.CutAction; import com.fr.design.actions.edit.DeleteAction; import com.fr.design.actions.edit.EditFloatElementNameAction; import com.fr.design.actions.edit.HyperlinkAction; import com.fr.design.actions.edit.PasteAction; import com.fr.design.actions.edit.order.BringFloatElementForwardAction; import com.fr.design.actions.edit.order.BringFloatElementToFrontAction; import com.fr.design.actions.edit.order.SendFloatElementBackwardAction; import com.fr.design.actions.edit.order.SendFloatElementToBackAction; 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.designer.TargetComponent; import com.fr.design.gui.imenu.UIPopupMenu; import com.fr.design.mainframe.CellElementPropertyPane; import com.fr.design.mainframe.ElementCasePane; import com.fr.design.mainframe.ElementCasePane.Clear; import com.fr.design.selection.QuickEditor; import com.fr.design.utils.DesignUtils; import com.fr.general.ComparatorUtils; import com.fr.log.FineLoggerFactory; import com.fr.report.cell.FloatElement; import com.fr.report.elementcase.TemplateElementCase; import com.fr.stable.ColumnRow; import com.fr.stable.unit.FU; import com.fr.stable.unit.OLDPIX; import javax.swing.JPopupMenu; import java.awt.Toolkit; /** * the float selection * * @editor zhou * 2012-3-22下午2:09:20 */ public class FloatSelection extends Selection { private String selectedFloatName; public FloatSelection(String selectedFloatName) { setFloatName(selectedFloatName); } public final void setFloatName(String selectedFloatName) { this.selectedFloatName = selectedFloatName; } public String getSelectedFloatName() { return selectedFloatName; } @Override public void asTransferable(ElementsTransferable transferable, ElementCasePane ePane) { TemplateElementCase ec = ePane.getEditingElementCase(); FloatElement fe = ec.getFloatElement(selectedFloatName); if (fe != null) { FloatElement transEl; try { transEl = (FloatElement) fe.clone(); transferable.addObject(new FloatElementsClip(transEl)); } catch (CloneNotSupportedException e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); } } } @Override public boolean pasteCellElementsClip(CellElementsClip ceClip, ElementCasePane ePane) { Toolkit.getDefaultToolkit().beep(); DesignUtils.errorMessage(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Paste_Cell_Tips")); return false; } @Override public boolean pasteString(String str, ElementCasePane ePane) { Toolkit.getDefaultToolkit().beep(); DesignUtils.errorMessage(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Paste_Character_Tips")); // return pasteOtherType(str, ePane); return false; } @Override public boolean pasteOtherType(Object ob, ElementCasePane ePane) { TemplateElementCase ec = ePane.getEditingElementCase(); FloatElement selectedEl = ec.getFloatElement(this.selectedFloatName); if (selectedEl != null) { selectedEl.setValue(ob); } return true; } @Override public boolean canMergeCells(ElementCasePane ePane) { return false; } @Override public boolean mergeCells(ElementCasePane ePane) { throw new UnsupportedOperationException(); } @Override public boolean canUnMergeCells(ElementCasePane ePane) { return false; } @Override public boolean unMergeCells(ElementCasePane ePane) { throw new UnsupportedOperationException(); } @Override public JPopupMenu createPopupMenu(ElementCasePane ePane) { UIPopupMenu popup = new UIPopupMenu(); if (DesignerMode.isAuthorityEditing()) { popup.add(new CleanAuthorityAction(ePane).createMenuItem()); return popup; } popup.add(new FloatStyleAction(ePane).createMenuItem()); popup.add(new HyperlinkAction().createMenuItem()); // cut, copy and paste popup.addSeparator(); popup.add(new CutAction(ePane).createMenuItem()); popup.add(new CopyAction(ePane).createMenuItem()); popup.add(new PasteAction(ePane).createMenuItem()); popup.add(new DeleteAction(ePane).createMenuItem()); popup.addSeparator(); popup.add(new BringFloatElementToFrontAction(ePane).createMenuItem()); popup.add(new SendFloatElementToBackAction(ePane).createMenuItem()); popup.add(new BringFloatElementForwardAction(ePane).createMenuItem()); popup.add(new SendFloatElementBackwardAction(ePane).createMenuItem()); popup.addSeparator(); popup.add(new EditFloatElementNameAction(ePane).createMenuItem()); popup.addSeparator(); addExtraMenu(ePane, popup); return popup; } @Override public boolean clear(Clear type, ElementCasePane ePane) { TemplateElementCase ec = ePane.getEditingElementCase(); FloatElement fe = ec.getFloatElement(selectedFloatName); if (fe != null) { // REPORT-5955 [Report]删除悬浮元素后,设计器卡死;之前wu做了释放内存,删除悬浮元素会报npe;删除悬浮元素逻辑改为先setSelection 再 remove ePane.setSelection(new CellSelection(0, 0, 1, 1)); ec.removeFloatElement(fe); return true; } return false; } @Override public int[] getSelectedColumns() { return new int[0]; } @Override public int[] getSelectedRows() { return new int[0]; } @Override public void moveLeft(ElementCasePane ePane) { FloatElement selectedFloatElement = ePane.getEditingElementCase().getFloatElement(selectedFloatName); if (selectedFloatElement.getLeftDistance().less_than_or_equal_zero()) { selectedFloatElement.setLeftDistance(FU.getInstance(0)); } else { selectedFloatElement.setLeftDistance(FU.getInstance(selectedFloatElement.getLeftDistance().toFU() - new OLDPIX(1).toFU())); } } @Override public void moveRight(ElementCasePane ePane) { FloatElement selectedFloatElement = ePane.getEditingElementCase().getFloatElement(selectedFloatName); selectedFloatElement.setLeftDistance(FU.getInstance(selectedFloatElement.getLeftDistance().toFU() + new OLDPIX(1).toFU())); } @Override public void moveUp(ElementCasePane ePane) { FloatElement selectedFloatElement = ePane.getEditingElementCase().getFloatElement(selectedFloatName); if (selectedFloatElement.getTopDistance().less_than_or_equal_zero()) { selectedFloatElement.setTopDistance(FU.getInstance(0)); } else { selectedFloatElement.setTopDistance(FU.getInstance(selectedFloatElement.getTopDistance().toFU() - new OLDPIX(1).toFU())); } } @Override public void moveDown(ElementCasePane ePane) { FloatElement selectedFloatElement = ePane.getEditingElementCase().getFloatElement(selectedFloatName); selectedFloatElement.setTopDistance(FU.getInstance(selectedFloatElement.getTopDistance().toFU() + new OLDPIX(1).toFU())); } @Override public boolean triggerDeleteAction(ElementCasePane ePane) { return ePane.clearAll(); } @Override public boolean containsColumnRow(ColumnRow cr) { return false; } @Override public boolean isSelectedOneCell(ElementCasePane ePane) { return false; } //TODO:august 这儿不比较FloatElement会不会有问题啊 @Override public boolean equals(Object obj) { return obj instanceof FloatSelection && ComparatorUtils.equals(this.getSelectedFloatName(), ((FloatSelection) obj).getSelectedFloatName()); } @Override public QuickEditor getQuickEditor(TargetComponent tc) { QuickEditor editor = getQuickEditorWithoutPopulate(tc); if (editor == null) return null; editor.populate(tc); return editor; } @Override public QuickEditor getQuickEditorWithoutPopulate(TargetComponent tc) { ElementCasePane ePane = (ElementCasePane) tc; FloatElement selectedFloat = ePane.getEditingElementCase().getFloatElement(selectedFloatName); Object value = null; //处理撤销时npe if (selectedFloat != null) { value = selectedFloat.getValue(); } value = value == null ? "" : value; value = value instanceof Number ? value.toString() : value; QuickEditor editor = ActionFactory.getFloatEditor(value.getClass()); return editor; } @Override public void populatePropertyPane(ElementCasePane ePane) { CellElementPropertyPane.getInstance().removeAll(); } public void populateWidgetPropertyPane(ElementCasePane ePane) { } }