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.
194 lines
4.5 KiB
194 lines
4.5 KiB
package com.fr.design.gui.frpane; |
|
|
|
import com.fr.design.dialog.BasicPane; |
|
import com.fr.design.event.GlobalNameListener; |
|
import com.fr.design.event.GlobalNameObserver; |
|
import com.fr.design.event.ComponentChangeListener; |
|
import com.fr.design.event.ComponentChangeObserver; |
|
import com.fr.design.event.UIObserver; |
|
import com.fr.design.event.UIObserverListener; |
|
import com.fr.stable.StringUtils; |
|
|
|
import javax.swing.*; |
|
import java.awt.*; |
|
|
|
|
|
/** |
|
* 用于属性表中的面板,主要是为了给包含于这个面板内部的众多UI控件加监听事件,在UI控件改变的时候,通知模板做相应的变化 |
|
*/ |
|
public abstract class AbstractAttrNoScrollPane extends BasicPane { |
|
private static final int DEFAULT_HEIGHT = 250; |
|
private static boolean hasChangeListener; |
|
|
|
protected JPanel leftContentPane; |
|
protected Color original; |
|
|
|
private AttributeChangeListener listener; |
|
private String globalName = ""; |
|
|
|
private boolean autoFireAttributesChanged = true; |
|
|
|
public boolean isAutoFireAttributesChanged() { |
|
return this.autoFireAttributesChanged; |
|
} |
|
|
|
public void setAutoFireAttributesChanged(boolean autoFireAttributesChanged) { |
|
this.autoFireAttributesChanged = autoFireAttributesChanged; |
|
} |
|
|
|
protected AbstractAttrNoScrollPane() { |
|
initAll(); |
|
} |
|
|
|
protected void initAll() { |
|
enableEvents(AWTEvent.MOUSE_WHEEL_EVENT_MASK); |
|
original = this.getBackground(); |
|
this.setLayout(new BorderLayout()); |
|
hasChangeListener = false; |
|
initContentPane(); |
|
initAllListeners(); |
|
} |
|
|
|
/** |
|
* 后台初始化所有事件. |
|
*/ |
|
public void initAllListeners() { |
|
initListener(AbstractAttrNoScrollPane.this); |
|
} |
|
|
|
protected void initContentPane() { |
|
leftContentPane = createContentPane(); |
|
if (leftContentPane != null) { |
|
leftContentPane.setBorder(BorderFactory.createMatteBorder(10, 10, 0, 0, original)); |
|
this.add(leftContentPane, BorderLayout.CENTER); |
|
} |
|
} |
|
|
|
protected abstract JPanel createContentPane(); |
|
|
|
/** |
|
* august:不容易啊 还要用笔画图立个方程才计算出来 |
|
*/ |
|
protected void adjustValues() { |
|
doLayout(); |
|
} |
|
|
|
protected void removeAttributeChangeListener() { |
|
this.listener = null; |
|
hasChangeListener = false; |
|
} |
|
|
|
|
|
public void initListener(Container parentComponent) { |
|
for (int i = 0; i < parentComponent.getComponentCount(); i++) { |
|
Component tmpComp = parentComponent.getComponent(i); |
|
|
|
if (tmpComp instanceof Container) { |
|
initListener((Container) tmpComp); |
|
} |
|
if (tmpComp instanceof GlobalNameObserver) { |
|
((GlobalNameObserver) tmpComp).registerNameListener(new GlobalNameListener() { |
|
public void setGlobalName(String name) { |
|
globalName = name; |
|
} |
|
|
|
public String getGlobalName() { |
|
return globalName; |
|
} |
|
}); |
|
} |
|
if (tmpComp instanceof UIObserver) { |
|
((UIObserver) tmpComp).registerChangeListener(new UIObserverListener() { |
|
@Override |
|
public void doChange() { |
|
attributeChanged(); |
|
} |
|
}); |
|
} |
|
if(tmpComp instanceof ComponentChangeObserver){ |
|
ComponentChangeObserver uiChangeableObserver = ((ComponentChangeObserver)tmpComp); |
|
uiChangeableObserver.registerChangeListener(new ComponentChangeListener() { |
|
@Override |
|
public void initListener(Container changedComponent) { |
|
AbstractAttrNoScrollPane.this.initListener(changedComponent); |
|
} |
|
}); |
|
} |
|
} |
|
} |
|
|
|
/** |
|
* 是否有改变监听 |
|
* @return 是则返回true |
|
*/ |
|
public static boolean isHasChangeListener() { |
|
return hasChangeListener; |
|
} |
|
|
|
/** |
|
* 返回预定义的大小. |
|
*/ |
|
public Dimension getPreferredSize() { |
|
return new Dimension(super.getPreferredSize().width, DEFAULT_HEIGHT); |
|
} |
|
|
|
|
|
/** |
|
* 返回绑定的属性事件. |
|
* @param listener 增加监听 |
|
*/ |
|
public void addAttributeChangeListener(AttributeChangeListener listener) { |
|
this.listener = listener; |
|
hasChangeListener = true; |
|
} |
|
|
|
/** |
|
* 响应属性事件. |
|
*/ |
|
public void attributeChanged() { |
|
synchronized (this) { |
|
if (listener != null) { |
|
if (autoFireAttributesChanged) { |
|
listener.attributeChange(); |
|
} |
|
} |
|
} |
|
} |
|
|
|
/** |
|
* 返回图标的路径 |
|
*/ |
|
public String getIconPath() { |
|
// 默认为空,子类有需要再重写 |
|
return StringUtils.EMPTY; |
|
} |
|
|
|
/** |
|
* 界面标题 |
|
* @return 标题 |
|
*/ |
|
public String title4PopupWindow() { |
|
// 默认为空,子类有需要再重写 |
|
return StringUtils.EMPTY; |
|
} |
|
|
|
/** |
|
* 设置选中的ID, 用于双击展示界面. |
|
*/ |
|
public void setSelectedByIds(int level, String... id) { |
|
|
|
} |
|
|
|
public String getGlobalName(){ |
|
return globalName; |
|
} |
|
|
|
/** |
|
* 主要用于图表设计器 |
|
* @return 是 |
|
*/ |
|
public boolean isNeedPresentPaneWhenFilterData(){ |
|
return true; |
|
} |
|
|
|
} |