@ -38,6 +38,7 @@ import com.fr.design.designer.creator.XWBorderLayout;
import com.fr.design.designer.creator.XWFitLayout ;
import com.fr.design.designer.creator.XWParameterLayout ;
import com.fr.design.designer.creator.XWTitleLayout ;
import com.fr.design.designer.creator.cardlayout.XWTabFitLayout ;
import com.fr.design.designer.properties.FormWidgetAuthorityEditPane ;
import com.fr.design.dialog.FineJOptionPane ;
import com.fr.design.event.DesignerOpenedListener ;
@ -64,6 +65,7 @@ import com.fr.form.ui.Widget;
import com.fr.form.ui.WidgetValue ;
import com.fr.form.ui.container.WBorderLayout ;
import com.fr.form.ui.container.WFitLayout ;
import com.fr.form.ui.container.cardlayout.WCardMainBorderLayout ;
import com.fr.general.ComparatorUtils ;
import com.fr.general.FRLogger ;
import com.fr.log.FineLoggerFactory ;
@ -189,6 +191,7 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
this . switchAction = switchAction ;
topXCreators = new TopXCreators ( this ) ;
topXCreators . setVisible ( true ) ;
add ( topXCreators ) ;
// 必须刷新"参数/控件树"面板,否则,若最近一次打开模版为 cpt,重启设计器,打开 frm,控件树消失
@ -834,17 +837,22 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
/ * *
* 从已选择的组件中找x , y所在的组件
* /
private XCreator xCreatorAt ( int x , int y , XCreator [ ] xCreators ) {
private XCreator xCreatorAt ( int x , int y , XCreator root ) {
XCreator [ ] xCreators = selectionModel . getSelection ( ) . getSelectedCreators ( ) ;
for ( XCreator creator : xCreators ) {
if ( creator = = null | | ! creator . isVisible ( ) ) {
continue ;
}
if ( creator instanceof XWAbsoluteBodyLayout | | creator instanceof XWFitLayout | | creator instanceof XWParameterLayout ) {
boolean shouldContinue = creator = = null
| | ! creator . isVisible ( )
| | ! XCreatorUtils . containComponent ( root , creator )
| | creator instanceof XWAbsoluteBodyLayout
| | creator instanceof XWFitLayout
| | creator instanceof XWParameterLayout ;
if ( shouldContinue ) {
continue ;
}
x - = creator . getX ( ) ;
y - = creator . getY ( ) ;
Rectangle rect = ComponentUtils . computeVisibleRect ( creator ) ;
rect . y + = nestTabCount ( creator ) * WCardMainBorderLayout . TAB_HEIGHT ;
// 判断是否处于交叉区域
if ( ! isIntersectArea ( x , y , rect ) ) {
continue ;
@ -852,11 +860,24 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
if ( creator instanceof XWTitleLayout ) {
return creator . getEditingChildCreator ( ) ;
}
return creator ;
return xCreatorAt ( x , y , creator , null ) ;
}
return null ;
}
/ * *
* 计算嵌套的tab层数
* /
private int nestTabCount ( Container xCreator ) {
if ( xCreator = = null ) {
return 0 ;
}
if ( xCreator instanceof XWTabFitLayout ) {
return 1 + nestTabCount ( xCreator . getParent ( ) ) ;
}
return nestTabCount ( xCreator . getParent ( ) ) ;
}
/ * *
* 刷新顶层组件
* * /
@ -1056,7 +1077,7 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
}
int relativeX = x + ( int ) ( formArea . getHorizontalValue ( ) / scale ) - container . getX ( ) ;
int relativeY = y + ( int ) ( formArea . getVerticalValue ( ) / scale ) - container . getY ( ) ;
XCreator result = xCreatorAt ( relativeX , relativeY , selectionModel . getSelection ( ) . getSelectedCreators ( ) ) ;
XCreator result = xCreatorAt ( relativeX , relativeY , container ) ;
return result = = null ? getComponentAt ( x , y , null ) : result ;
}