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.
484 lines
16 KiB
484 lines
16 KiB
/** |
|
* |
|
*/ |
|
package com.fr.design.designer.creator.cardlayout; |
|
|
|
import com.fr.base.GraphHelper; |
|
import com.fr.base.ScreenResolution; |
|
import com.fr.design.designer.beans.AdapterBus; |
|
import com.fr.design.designer.beans.ComponentAdapter; |
|
import com.fr.design.designer.beans.LayoutAdapter; |
|
import com.fr.design.designer.beans.adapters.layout.FRWCardTagLayoutAdapter; |
|
import com.fr.design.designer.beans.models.ModelUtil; |
|
import com.fr.design.designer.beans.models.SelectionModel; |
|
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.XWHorizontalBoxLayout; |
|
import com.fr.design.designer.creator.XWidgetCreator; |
|
import com.fr.design.designer.properties.mobile.TabMobilePropertyUI; |
|
import com.fr.design.form.layout.FRFlowLayout; |
|
import com.fr.design.form.layout.FRHorizontalLayout; |
|
import com.fr.design.form.layout.FRVerticalLayout; |
|
import com.fr.design.fun.WidgetPropertyUIProvider; |
|
import com.fr.design.gui.ilable.UILabel; |
|
import com.fr.design.gui.imenu.UIPopupMenu; |
|
import com.fr.design.mainframe.EditingMouseListener; |
|
import com.fr.design.mainframe.FormDesigner; |
|
import com.fr.design.mainframe.FormHierarchyTreePane; |
|
import com.fr.design.mainframe.WidgetPropertyPane; |
|
import com.fr.design.utils.gui.LayoutUtils; |
|
import com.fr.form.ui.CardSwitchButton; |
|
import com.fr.form.ui.Widget; |
|
import com.fr.form.ui.container.WCardLayout; |
|
import com.fr.form.ui.container.WTabDisplayPosition; |
|
import com.fr.form.ui.container.cardlayout.WCardTagLayout; |
|
import com.fr.form.ui.container.cardlayout.WTabFitLayout; |
|
import com.fr.general.ComparatorUtils; |
|
import com.fr.general.FRFont; |
|
import com.fr.general.act.BorderPacker; |
|
import com.fr.general.cardtag.DefaultTemplateStyle; |
|
|
|
import javax.swing.border.Border; |
|
import java.awt.Dimension; |
|
import java.awt.FontMetrics; |
|
import java.awt.Rectangle; |
|
import java.awt.event.ContainerEvent; |
|
import java.awt.event.MouseEvent; |
|
import java.util.HashMap; |
|
import java.util.Map; |
|
|
|
/** |
|
* @date: 2014-11-25-下午3:11:14 |
|
*/ |
|
public class XWCardTagLayout extends XWHorizontalBoxLayout { |
|
|
|
private static final int MIN_SIZE = 1; |
|
|
|
private String tagName = "Tab"; |
|
|
|
private boolean switchingTab = false; |
|
|
|
//增加一个tabNameIndex防止tabFitLayout重名 |
|
private int tabFitIndex = 0; |
|
private CardSwitchButton currentCard; |
|
|
|
private static final int WIDTH_SIDE_OFFSET = 57; |
|
|
|
private static final int HEIGHT_SIDE_OFFSET = 20; |
|
|
|
private static final int DEFAULT_VERTICAL_SPACING = 3; |
|
|
|
public static final String DEFAULT_NAME = "tabpane"; |
|
|
|
public CardSwitchButton getCurrentCard() { |
|
return currentCard; |
|
} |
|
|
|
public void setCurrentCard(CardSwitchButton currentCard) { |
|
this.currentCard = currentCard; |
|
} |
|
|
|
public int getTabFitIndex() { |
|
return tabFitIndex; |
|
} |
|
|
|
public void setTabFitIndex(int tabFitIndex) { |
|
this.tabFitIndex = tabFitIndex; |
|
} |
|
|
|
public String getTagName() { |
|
return tagName; |
|
} |
|
|
|
public void setTagName(String tagName) { |
|
this.tagName = tagName; |
|
} |
|
|
|
public boolean isSwitchingTab() { |
|
return switchingTab; |
|
} |
|
|
|
public void setSwitchingTab(boolean switchingTab) { |
|
this.switchingTab = switchingTab; |
|
} |
|
|
|
private XWCardLayout cardLayout; |
|
|
|
public XWCardTagLayout(WCardTagLayout widget, Dimension initSize) { |
|
super(widget, initSize); |
|
initLayoutManager(); |
|
} |
|
|
|
/** |
|
* 构造函数 |
|
*/ |
|
public XWCardTagLayout(WCardTagLayout widget, Dimension initSize, XWCardLayout cardLayout) { |
|
this(widget, initSize); |
|
this.cardLayout = cardLayout; |
|
} |
|
|
|
/** |
|
* 添加组件的监听事件 |
|
* |
|
* @param e 事件 |
|
* @date 2014-11-25-下午6:20:10 |
|
*/ |
|
@Override |
|
public void componentAdded(ContainerEvent e) { |
|
super.componentAdded(e); |
|
|
|
if (isSwitchingTab()) { |
|
return; |
|
} |
|
|
|
if (this.cardLayout == null) { |
|
initCardLayout(); |
|
} |
|
|
|
int index = this.cardLayout.toData().getWidgetCount(); |
|
//新加一个card |
|
String widgetName = tagName + getTabNameIndex(); |
|
WTabFitLayout fitLayout = new WTabFitLayout(widgetName, tabFitIndex, currentCard); |
|
fitLayout.setTabNameIndex(getTabNameIndex()); |
|
XWTabFitLayout tabFitLayout = new XWTabFitLayout(fitLayout, new Dimension()); |
|
FormDesigner formDesigner = WidgetPropertyPane.getInstance().getEditingFormDesigner(); |
|
ModelUtil.renameWidgetName(formDesigner.getTarget(), tabFitLayout); |
|
WCardTagLayout layout = (WCardTagLayout) this.toData(); |
|
|
|
if(!ComparatorUtils.equals(layout.getTemplateStyle().getStyle(), DefaultTemplateStyle.DEFAULT_TEMPLATE_STYLE)){ |
|
fitLayout.setInitialBackground(layout.getTemplateStyle().getTabDefaultBackground()); |
|
fitLayout.setCustomStyle(true); |
|
} |
|
tabFitLayout.setxCardSwitchButton((XCardSwitchButton)this.getComponent(index)); |
|
tabFitLayout.checkButonType(); |
|
tabFitLayout.setBackupParent(cardLayout); |
|
cardLayout.add(tabFitLayout, widgetName); |
|
this.cardLayout.toData().setShowIndex(index); |
|
cardLayout.showCard(); |
|
} |
|
|
|
|
|
@Override |
|
protected String getIconName() { |
|
return "tabpane.png"; |
|
} |
|
|
|
private void initCardLayout() { |
|
XWCardTitleLayout titleLayout = (XWCardTitleLayout) this.getBackupParent(); |
|
XWCardMainBorderLayout borderLayout = (XWCardMainBorderLayout) titleLayout.getBackupParent(); |
|
|
|
this.cardLayout = borderLayout.getCardPart(); |
|
} |
|
/** |
|
* 将WLayout转换为XLayoutContainer |
|
*/ |
|
@Override |
|
public void convert() { |
|
isRefreshing = true; |
|
WCardTagLayout layout = (WCardTagLayout) this.toData(); |
|
this.removeAll(); |
|
for (int i = 0; i < layout.getWidgetCount(); i++) { |
|
Widget wgt = layout.getWidget(i); |
|
if (wgt != null) { |
|
initLayoutManager(); |
|
XWidgetCreator comp = (XWidgetCreator) XCreatorUtils.createXCreator(wgt, calculatePreferredSize(wgt)); |
|
this.add(comp, i); |
|
comp.setBackupParent(this); |
|
} |
|
} |
|
isRefreshing = false; |
|
} |
|
|
|
@Override |
|
public String createDefaultName() { |
|
return DEFAULT_NAME; |
|
} |
|
|
|
/** |
|
* 切换到非添加状态 |
|
* |
|
* @return designer 表单设计器 |
|
*/ |
|
@Override |
|
public void stopAddingState(FormDesigner designer) { |
|
designer.stopAddingState(); |
|
} |
|
|
|
//新增时去tabFitLayout名字中最大的Index+1,防止重名 |
|
private int getTabNameIndex() { |
|
int tabNameIndex = 0; |
|
WCardLayout layout = this.cardLayout.toData(); |
|
int size = layout.getWidgetCount(); |
|
if (size < MIN_SIZE) { |
|
return tabNameIndex; |
|
} |
|
for (int i = 0; i < size; i++) { |
|
WTabFitLayout fitLayout = (WTabFitLayout) layout.getWidget(i); |
|
int tempIndex = fitLayout.getTabNameIndex(); |
|
tabNameIndex = Math.max(tempIndex, tabNameIndex); |
|
} |
|
return ++tabNameIndex; |
|
} |
|
|
|
/** |
|
* 调整tab宽度 |
|
* <p> |
|
* void |
|
*/ |
|
public void adjustComponentWidth() { |
|
} |
|
|
|
|
|
/** |
|
* 该布局需要隐藏,无需对边框进行操作 |
|
* |
|
* @param |
|
*/ |
|
@Override |
|
public void setBorder(Border border) { |
|
|
|
} |
|
|
|
@Override |
|
/** |
|
* 该布局隐藏,点击该布局时选中相应的tab布局主体 |
|
* @param editingMouseListener 监听 |
|
* @param e 鼠标点击事件 |
|
* |
|
*/ |
|
public void respondClick(EditingMouseListener editingMouseListener, |
|
MouseEvent e) { |
|
FormDesigner designer = editingMouseListener.getDesigner(); |
|
SelectionModel selectionModel = editingMouseListener.getSelectionModel(); |
|
|
|
if (e.getClickCount() <= 1) { |
|
selectionModel.selectACreatorAtMouseEvent(e); |
|
} |
|
editingMouseListener.refreshTopXCreator(); |
|
if (editingMouseListener.stopEditing()) { |
|
if (this != designer.getRootComponent()) { |
|
ComponentAdapter adapter = AdapterBus.getComponentAdapter(designer, this); |
|
editingMouseListener.startEditing(this, adapter.getDesignerEditor(), adapter); |
|
} |
|
} |
|
} |
|
|
|
@Override |
|
public UIPopupMenu createPopupMenu(FormDesigner formDesigner) { |
|
return UIPopupMenu.EMPTY; // 不要菜单 |
|
} |
|
|
|
@Override |
|
public int[] getDirections() { |
|
return ((XCreator)getParent()).getDirections(); |
|
} |
|
|
|
@Override |
|
public Rectangle getBounds() { |
|
return this.getParent().getBounds(); |
|
} |
|
|
|
@Override |
|
public XLayoutContainer getTopLayout() { |
|
return this.getBackupParent().getTopLayout(); |
|
} |
|
|
|
|
|
@Override |
|
public int getIndexOfChild(Object child) { |
|
XLayoutContainer cardPart = ((XWCardMainBorderLayout)this.getTopLayout()).getCardPart(); |
|
return cardPart.getIndexOfChild(child); |
|
} |
|
|
|
@Override |
|
public boolean isSupportDrag(){ |
|
return false; |
|
} |
|
|
|
@Override |
|
public void doLayout() { |
|
setTabsAndAdjust(); |
|
//设置布局 |
|
super.doLayout(); |
|
} |
|
|
|
@Override |
|
protected void initLayoutManager() { |
|
FRFlowLayout frFlowLayout; |
|
if (isHori()) { |
|
frFlowLayout = new FRHorizontalLayout(((WCardTagLayout)toData()).getAlignment(), toData().getHgap(), toData().getVgap()); |
|
}else{ |
|
frFlowLayout = new FRVerticalLayout(((WCardTagLayout)toData()).getAlignment(), toData().getHgap(), toData().getVgap()); |
|
} |
|
this.setFrFlowLayout(frFlowLayout); |
|
this.setLayout(frFlowLayout); |
|
} |
|
|
|
|
|
@Override |
|
public LayoutAdapter getLayoutAdapter() { |
|
return new FRWCardTagLayoutAdapter(this); |
|
} |
|
|
|
private boolean isHori(){ |
|
WTabDisplayPosition displayPosition = ((WCardTagLayout)this.toData()).getDisplayPosition(); |
|
if(displayPosition == null){ |
|
displayPosition = WTabDisplayPosition.TOP_POSITION; |
|
} |
|
return ComparatorUtils.equals(displayPosition, WTabDisplayPosition.TOP_POSITION) || ComparatorUtils.equals(displayPosition, WTabDisplayPosition.BOTTOM_POSITION); |
|
} |
|
|
|
@Override |
|
public WidgetPropertyUIProvider[] getWidgetPropertyUIProviders() { |
|
return new WidgetPropertyUIProvider[]{ new TabMobilePropertyUI(this)}; |
|
} |
|
|
|
/** |
|
* data属性改变触发其他操作 |
|
* |
|
*/ |
|
@Override |
|
public void firePropertyChange() { |
|
WCardTagLayout wCardTagLayout = (WCardTagLayout) this.toData(); |
|
((XWCardMainBorderLayout) getTopLayout()).resetTabDisplayPosition(wCardTagLayout.getDisplayPosition()); |
|
//重置内部组件的大小和位置 |
|
initLayoutManager(); |
|
setTabsAndAdjust(); |
|
repaint(); |
|
} |
|
|
|
public void setTabsAndAdjust() { |
|
WCardTagLayout wCardTagLayout = (WCardTagLayout) this.toData(); |
|
int tabLength = this.getComponentCount(); |
|
Map<Integer, Integer> cardWidth = new HashMap<Integer, Integer>(); |
|
Map<Integer, Integer> cardHeight = new HashMap<Integer, Integer>(); |
|
XLayoutContainer parent = this.getBackupParent(); |
|
|
|
for (int i = 0; i < tabLength; i++) { |
|
XCardSwitchButton temp = (XCardSwitchButton) this.getComponent(i); |
|
CardSwitchButton tempCard = (CardSwitchButton) temp.toData(); |
|
String tempText = tempCard.getText(); |
|
if (this.cardLayout == null) { |
|
initCardLayout(); |
|
} |
|
BorderPacker borderStyle = this.cardLayout.toData().getBorderStyle(); |
|
FRFont f = borderStyle.getTitle().getFrFont(); |
|
FontMetrics fm = GraphHelper.getFontMetrics(f); |
|
|
|
switch (wCardTagLayout.getTextDirection()) { |
|
case TEXT_HORI_DERECTION: |
|
cardWidth.put(i, fm.stringWidth(tempText)); |
|
cardHeight.put(i, fm.getHeight()); |
|
break; |
|
case TEXT_VER_DIRECTION: |
|
int perHeight = fm.getHeight(); |
|
int wordCount = tempText.length(); |
|
if (tempText.length() != 0) { |
|
cardWidth.put(i, fm.stringWidth(tempText) / tempText.length()); |
|
} else { |
|
cardWidth.put(i, 0); |
|
} |
|
cardHeight.put(i, (perHeight + DEFAULT_VERTICAL_SPACING) * wordCount); |
|
break; |
|
default: |
|
break; |
|
} |
|
} |
|
if (isHori()) { |
|
adjustTabsH(parent, tabLength, cardWidth, cardHeight); |
|
} else { |
|
adjustTabsV(parent, tabLength, cardWidth, cardHeight); |
|
} |
|
fixTitleLayout(parent); |
|
} |
|
|
|
public void adjustTabsH(XLayoutContainer parent, int tabLength, Map<Integer, Integer> width, Map<Integer, Integer> height) { |
|
if (width == null) { |
|
return; |
|
} |
|
int tabPaneSize = parent.getHeight(); |
|
//调整XWCardTagLayout的高度 |
|
int tempX = 0; |
|
for (int i = 0; i < tabLength; i++) { |
|
Rectangle rectangle = this.getComponent(i).getBounds(); |
|
Integer cardWidth = width.get(i) + WIDTH_SIDE_OFFSET; |
|
Integer cardHeight = tabPaneSize; |
|
rectangle.setBounds(tempX, 0, cardWidth, cardHeight); |
|
tempX += cardWidth; |
|
XCardSwitchButton temp = (XCardSwitchButton) this.getComponent(i); |
|
setTabBtnSize(cardWidth, cardHeight, temp); |
|
} |
|
} |
|
|
|
public void setTabBtnSize(int cardWidth, int cardHeight, XCardSwitchButton temp){ |
|
Dimension dimension = new Dimension(); |
|
dimension.setSize(cardWidth, cardHeight); |
|
CardSwitchButton cardSwitchButton = (CardSwitchButton) temp.toData(); |
|
FRFont frFont = cardSwitchButton.getFont(); |
|
UILabel label = temp.getContentLabel(); |
|
label.setSize(dimension); |
|
label.setFont(frFont.applyResolutionNP(ScreenResolution.getScreenResolution())); |
|
label.setForeground(frFont.getForeground()); |
|
temp.setContentLabel(label); |
|
temp.setSize(dimension); |
|
temp.setPreferredSize(new Dimension(cardWidth, cardHeight)); |
|
} |
|
|
|
|
|
public void adjustTabsV(XLayoutContainer parent, int tabLength, Map<Integer, Integer> width, Map<Integer, Integer> height) { |
|
if (width == null) { |
|
return; |
|
} |
|
int tabPaneSize = parent.getWidth(); |
|
int tempY = 0; |
|
for (int i = 0; i < tabLength; i++) { |
|
Rectangle rectangle = this.getComponent(i).getBounds(); |
|
Integer cardWidth = tabPaneSize; |
|
//先用这边的固定高度 |
|
Integer cardHeight = height.get(i) + HEIGHT_SIDE_OFFSET; |
|
rectangle.setBounds(0, tempY, cardWidth, cardHeight); |
|
tempY += cardHeight; |
|
XCardSwitchButton temp = (XCardSwitchButton) this.getComponent(i); |
|
setTabBtnSize(cardWidth, cardHeight, temp); |
|
} |
|
|
|
} |
|
|
|
private void fixTitleLayout(XLayoutContainer parent) { |
|
FormDesigner formDesigner = WidgetPropertyPane.getInstance().getEditingFormDesigner(); |
|
LayoutAdapter layoutAdapter = AdapterBus.searchLayoutAdapter(formDesigner, parent); |
|
if (layoutAdapter != null) { |
|
parent.setBackupBound(parent.getBounds()); |
|
layoutAdapter.fix(parent); |
|
} |
|
} |
|
|
|
/** |
|
* <p> 对于tab组件,WCardMainBorderLayout里面有两个子容器: |
|
* <li> WCardTitleLayout,里面包含两个部分,一个是CardAddButton,另一个是WCardTagLayout - tabpane0 </li> |
|
* <li> WCardLayout,里面放的是WTabFitLayout - tab00、tab10</li> |
|
* <p> 在右侧组件树选择删除WCardTagLayout时(tabpane0),按照现在的产品逻辑,应该删除整个tab组件 |
|
* |
|
* @param creator 组件 |
|
* @param designer 表单设计器 |
|
*/ |
|
@Override |
|
public void deleteRelatedComponent(XCreator creator, FormDesigner designer) { |
|
XWCardTagLayout tagLayout = (XWCardTagLayout) creator; |
|
// 先删除所有tab按钮 |
|
tagLayout.removeAll(); |
|
//逐层回溯找出最外层的XWCardMainBorderLayout |
|
XWCardTitleLayout cardTitleLayout = (XWCardTitleLayout) tagLayout.getBackupParent(); |
|
XWCardMainBorderLayout mainLayout = (XWCardMainBorderLayout) cardTitleLayout.getBackupParent(); |
|
// 删除tab布局 |
|
SelectionModel selectionModel = designer.getSelectionModel(); |
|
if (mainLayout != null) { |
|
selectionModel.setSelectedCreator(mainLayout); |
|
selectionModel.deleteSelection(); |
|
} |
|
LayoutUtils.layoutRootContainer(designer.getRootComponent()); |
|
FormHierarchyTreePane.getInstance().refreshRoot(); |
|
selectionModel.setSelectedCreator(designer.getRootComponent()); |
|
} |
|
}
|
|
|