@ -5,24 +5,45 @@ import com.fr.design.designer.beans.LayoutAdapter;
import com.fr.design.designer.beans.adapters.layout.AbstractLayoutAdapter ;
import com.fr.design.designer.beans.adapters.layout.FRTabFitLayoutAdapter ;
import com.fr.design.designer.beans.events.DesignerEvent ;
import com.fr.design.designer.creator.* ;
import com.fr.design.designer.creator.XCreator ;
import com.fr.design.designer.creator.XCreatorUtils ;
import com.fr.design.designer.creator.XLayoutContainer ;
import com.fr.design.designer.creator.XWAbsoluteLayout ;
import com.fr.design.designer.creator.XWFitLayout ;
import com.fr.design.designer.creator.XWScaleLayout ;
import com.fr.design.designer.creator.XWTitleLayout ;
import com.fr.design.utils.ComponentUtils ;
import com.fr.form.ui.Widget ;
import com.fr.form.ui.container.WTitleLayout ;
import com.fr.general.ComparatorUtils ;
import com.fr.general.FRLogger ;
import com.fr.general.Inter ;
import java.awt.* ;
import java.awt.Component ;
import java.awt.Point ;
import java.awt.Rectangle ;
import java.awt.Toolkit ;
import java.util.ArrayList ;
import java.util.Arrays ;
import java.util.List ;
/ * *
* 表单选中工具类
*
* @author yaoh . wu
* @version 2017年11月15日13点51分
* @since 8 . 0
* /
public class FormSelectionUtils {
//组件复制时坐标偏移
/ * *
* 组件复制时坐标偏移
* /
private static final int DELAY_X_Y = 20 ;
//组件重命名后缀
/ * *
* 组件重命名后缀
* /
private static final String POSTFIX = "_c" ;
private FormSelectionUtils ( ) {
@ -47,6 +68,25 @@ public class FormSelectionUtils {
Toolkit . getDefaultToolkit ( ) . beep ( ) ;
}
public static void rebuildSelection ( FormDesigner designer ) {
ArrayList < XCreator > newSelection = new ArrayList < > ( ) ;
List < Widget > widgetList = new ArrayList < > ( ) ;
for ( XCreator comp : designer . getSelectionModel ( ) . getSelection ( ) . getSelectedCreators ( ) ) {
widgetList . add ( comp . toData ( ) ) ;
}
designer . getSelectionModel ( ) . setSelectedCreators (
rebuildSelection ( designer . getRootComponent ( ) , widgetList , newSelection ) ) ;
}
public static ArrayList < XCreator > rebuildSelection ( XCreator rootComponent , Widget [ ] selectWidgets ) {
List < Widget > selectionWidget = new ArrayList < > ( ) ;
if ( selectWidgets ! = null ) {
selectionWidget . addAll ( Arrays . asList ( selectWidgets ) ) ;
}
return FormSelectionUtils . rebuildSelection ( rootComponent , selectionWidget , new ArrayList < XCreator > ( ) ) ;
}
/ * *
* 绝对布局粘贴
* /
@ -92,26 +132,15 @@ public class FormSelectionUtils {
designer . getSelectionModel ( ) . getSelection ( ) . reset ( ) ;
for ( XCreator creator : clipboard . getSelectedCreators ( ) ) {
try {
Widget copied = copyWidget ( designer , creator ) ;
XCreator copiedCreator = XCreatorUtils . createXCreator ( copied , creator . getSize ( ) ) ;
if ( adapter . getClass ( ) . equals ( FRTabFitLayoutAdapter . class ) ) {
if ( ! adapter . accept ( copiedCreator , x - tabContainerRect . x , y - tabContainerRect . y ) ) {
designer . showMessageDialog ( Inter . getLocText ( "FR-Designer_Too_Small_To_Paste" ) ) ;
return ;
}
} else {
if ( ! adapter . accept ( copiedCreator , x , y ) ) {
designer . showMessageDialog ( Inter . getLocText ( "FR-Designer_Too_Small_To_Paste" ) ) ;
return ;
}
}
boolean addSuccess = adapter . addBean ( copiedCreator , x , y ) ;
if ( addSuccess ) {
designer . getSelectionModel ( ) . getSelection ( ) . addSelectedCreator ( copiedCreator ) ;
if ( creator instanceof XWScaleLayout ) {
//XWScaleLayout封装了在自适应布局中需要保持默认高度的控件,由于自适应粘贴时会再次包装,因此复制时要进行解包
Component [ ] innerComponents = creator . getComponents ( ) ;
for ( Component innerComponent : innerComponents ) {
XCreator innerXCreator = ( XCreator ) innerComponent ;
relativePasteXCreator ( designer , innerXCreator , adapter , tabContainerRect , x , y ) ;
}
} catch ( Clon eNotSupportedException e ) {
FRContext . getLogger ( ) . error ( e . getMessage ( ) , e ) ;
} else {
relativePasteXCreator ( designer , creator , adapter , tabContainerRect , x , y ) ;
}
}
rebuildSelection ( designer ) ;
@ -119,6 +148,31 @@ public class FormSelectionUtils {
designer . getSelectionModel ( ) . getSelection ( ) . getSelectedCreator ( ) , DesignerEvent . CREATOR_PASTED ) ;
}
private static void relativePasteXCreator ( FormDesigner designer , XCreator creator , LayoutAdapter adapter , Rectangle tabContainerRect , int x , int y ) {
try {
Widget copied = copyWidget ( designer , creator ) ;
XCreator copiedXCreator = XCreatorUtils . createXCreator ( copied , creator . getSize ( ) ) ;
if ( adapter . getClass ( ) . equals ( FRTabFitLayoutAdapter . class ) ) {
if ( ! adapter . accept ( copiedXCreator , x - tabContainerRect . x , y - tabContainerRect . y ) ) {
designer . showMessageDialog ( Inter . getLocText ( "FR-Designer_Too_Small_To_Paste" ) ) ;
return ;
}
} else {
if ( ! adapter . accept ( copiedXCreator , x , y ) ) {
designer . showMessageDialog ( Inter . getLocText ( "FR-Designer_Too_Small_To_Paste" ) ) ;
return ;
}
}
boolean addSuccess = adapter . addBean ( copiedXCreator , x , y ) ;
if ( addSuccess ) {
designer . getSelectionModel ( ) . getSelection ( ) . addSelectedCreator ( copiedXCreator ) ;
}
} catch ( CloneNotSupportedException e ) {
FRLogger . getLogger ( ) . error ( e . getMessage ( ) , e ) ;
}
}
/ * *
* 组件复用绝对布局获取粘贴组件位置
* /
@ -182,23 +236,6 @@ public class FormSelectionUtils {
return name . toString ( ) ;
}
public static void rebuildSelection ( FormDesigner designer ) {
ArrayList < XCreator > newSelection = new ArrayList < > ( ) ;
List < Widget > widgetList = new ArrayList < > ( ) ;
for ( XCreator comp : designer . getSelectionModel ( ) . getSelection ( ) . getSelectedCreators ( ) ) {
widgetList . add ( comp . toData ( ) ) ;
}
designer . getSelectionModel ( ) . setSelectedCreators (
rebuildSelection ( designer . getRootComponent ( ) , widgetList , newSelection ) ) ;
}
public static ArrayList < XCreator > rebuildSelection ( XCreator rootComponent , Widget [ ] selectWidgets ) {
List < Widget > selectionWidget = new ArrayList < > ( ) ;
if ( selectWidgets ! = null ) {
selectionWidget . addAll ( Arrays . asList ( selectWidgets ) ) ;
}
return FormSelectionUtils . rebuildSelection ( rootComponent , selectionWidget , new ArrayList < XCreator > ( ) ) ;
}
private static ArrayList < XCreator > rebuildSelection ( XCreator rootComponent , List < Widget > selectionWidget ,
ArrayList < XCreator > newSelection ) {