Browse Source
* commit 'a27d9aee82407834f412b35e8daba7c3e01cb72c': (41 commits) 1 1 1 冲突 冲突 old plugin level api level rt 无窗口设计 數據配置界面 catch更改 1、删除插件返回一个成功消息,供界面显示 2、更新过期插件弹出两个对话框的问题 d d 这个入口删掉,不需要做模板数据集分组 web属性界面打不开 给决策平台修改密码和认证等加一个事件监听,剩下的什么删除用户等还没有加 分组插件需要把action开出去 加个参数 地图数据配置界面 ...master
superman
9 years ago
84 changed files with 4293 additions and 3532 deletions
File diff suppressed because one or more lines are too long
@ -0,0 +1,62 @@
|
||||
package com.fr.design.data.datapane; |
||||
|
||||
import com.fr.data.TableDataSource; |
||||
import com.fr.file.DatasourceManagerProvider; |
||||
|
||||
import javax.swing.*; |
||||
import java.util.Map; |
||||
|
||||
/** |
||||
* Coder: zack |
||||
* Date: 2016/5/18 |
||||
* Time: 10:13 |
||||
*/ |
||||
public interface TableDataPaneController { |
||||
/** |
||||
* 获取数据集名字变更集合 |
||||
* |
||||
* @return |
||||
*/ |
||||
Map<String, String> getDsNameChangedMap(); |
||||
|
||||
/** |
||||
* 数据集重命名 |
||||
* |
||||
* @param oldName |
||||
* @param newName |
||||
*/ |
||||
void rename(String oldName, String newName); |
||||
|
||||
/** |
||||
* 是否合法 |
||||
* @throws Exception |
||||
*/ |
||||
void checkValid() throws Exception; |
||||
|
||||
/** |
||||
* 名字是否允许 |
||||
* @return |
||||
*/ |
||||
boolean isNamePermitted(); |
||||
|
||||
void populate(DatasourceManagerProvider datasourceManagerProvider); |
||||
|
||||
void update(DatasourceManagerProvider datasourceManagerProvider); |
||||
|
||||
void populate(TableDataSource datasourceManagerProvider); |
||||
|
||||
void update(TableDataSource datasourceManagerProvider); |
||||
|
||||
/** |
||||
* 设置选中项 |
||||
* @param index |
||||
*/ |
||||
void setSelectedIndex(int index); |
||||
|
||||
/** |
||||
* 返回当前数据集面板 |
||||
* @return |
||||
*/ |
||||
JPanel getPanel(); |
||||
|
||||
} |
@ -0,0 +1,35 @@
|
||||
package com.fr.design.extra.exe; |
||||
|
||||
import com.fr.design.extra.Process; |
||||
import com.fr.general.SiteCenter; |
||||
import com.fr.general.http.HttpClient; |
||||
|
||||
/** |
||||
* Created by vito on 16/5/16. |
||||
*/ |
||||
public class GetPluginCategoriesExecutor implements Executor { |
||||
private String result = "[]"; |
||||
|
||||
@Override |
||||
public String getTaskFinishMessage() { |
||||
return result; |
||||
} |
||||
|
||||
@Override |
||||
public Command[] getCommands() { |
||||
return new Command[]{ |
||||
new Command() { |
||||
@Override |
||||
public String getExecuteMessage() { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public void run(Process<String> process) { |
||||
HttpClient httpClient = new HttpClient(SiteCenter.getInstance().acquireUrlByKind("plugin.category")); |
||||
result = httpClient.getResponseText(); |
||||
} |
||||
} |
||||
}; |
||||
} |
||||
} |
@ -0,0 +1,22 @@
|
||||
package com.fr.design.fun; |
||||
|
||||
import com.fr.design.mainframe.backgroundpane.BackgroundQuickPane; |
||||
import com.fr.stable.fun.Level; |
||||
import com.fr.stable.fun.Provider; |
||||
|
||||
/** |
||||
* Created by richie on 16/5/18. |
||||
* 背景设置界面接口,用于扩展设置更多类型的背景 |
||||
*/ |
||||
public interface BackgroundQuickUIProvider extends Level, Provider { |
||||
|
||||
String MARK_STRING = "BackgroundQuickUIProvider"; |
||||
|
||||
int CURRENT_LEVEL = 1; |
||||
|
||||
/** |
||||
* 背景设置界面 |
||||
* @return 设置界面 |
||||
*/ |
||||
BackgroundQuickPane appearanceForBackground(); |
||||
} |
@ -0,0 +1,34 @@
|
||||
package com.fr.design.fun; |
||||
|
||||
import com.fr.design.style.background.BackgroundDetailPane; |
||||
import com.fr.general.Background; |
||||
import com.fr.stable.fun.Level; |
||||
import com.fr.stable.fun.Provider; |
||||
|
||||
/** |
||||
* Created by richie on 16/5/18. |
||||
*/ |
||||
public interface BackgroundUIProvider extends Level, Provider { |
||||
|
||||
String MARK_STRING = "BackgroundUIProvider"; |
||||
|
||||
int CURRENT_LEVEL = 1; |
||||
|
||||
/** |
||||
* 对应的背景具体类型 |
||||
* @return 背景 |
||||
*/ |
||||
Class<? extends Background> targetClass(); |
||||
|
||||
/** |
||||
* 背景设置界面 |
||||
* @return 界面 |
||||
*/ |
||||
Class<? extends BackgroundDetailPane> targetUIClass(); |
||||
|
||||
/** |
||||
* 标题 |
||||
* @return 在设计界面上这个选项的显示标题 |
||||
*/ |
||||
String targetTitle(); |
||||
} |
@ -0,0 +1,36 @@
|
||||
package com.fr.design.fun; |
||||
|
||||
import com.fr.design.DesignModelAdapter; |
||||
import com.fr.design.data.BasicTableDataTreePane; |
||||
import com.fr.design.data.datapane.TableDataPaneController; |
||||
import com.fr.design.menu.ShortCut; |
||||
import com.fr.stable.fun.Level; |
||||
|
||||
/** |
||||
* 自定义的模板(服务器)数据集的树样式接口 el:分组样式 |
||||
* Coder: zack |
||||
* Date: 2016/4/18 |
||||
* Time: 9:04 |
||||
*/ |
||||
public interface TableDataPaneProcessor extends Level { |
||||
String XML_TAG = "TableDataPaneProcessor"; |
||||
|
||||
int CURRENT_LEVEL = 1; |
||||
/** |
||||
* 创建数据集面板 |
||||
* @return 数据集面板 |
||||
*/ |
||||
BasicTableDataTreePane createTableDataTreePane(DesignModelAdapter<?, ?> tc); |
||||
|
||||
/** |
||||
* 服务器数据集面板(模板数据集面板) |
||||
* @return 服务器数据集面板 |
||||
*/ |
||||
TableDataPaneController createServerTableDataPane(DesignModelAdapter<?, ?> tc); |
||||
|
||||
/** |
||||
* 自定义服务器数据集菜单项 |
||||
* @return |
||||
*/ |
||||
ShortCut createServerTDAction(); |
||||
} |
@ -1,23 +0,0 @@
|
||||
package com.fr.design.fun; |
||||
|
||||
import com.fr.design.DesignModelAdapter; |
||||
import com.fr.design.data.BasicTableDataTreePane; |
||||
import com.fr.stable.fun.Level; |
||||
|
||||
/** |
||||
* 自定义的模板(服务器)数据集的树样式接口 el:分组样式 |
||||
* Coder: zack |
||||
* Date: 2016/4/18 |
||||
* Time: 9:04 |
||||
*/ |
||||
public interface TableDataTreePaneProcessor extends Level { |
||||
String XML_TAG = "TableDataTreePaneProcessor"; |
||||
|
||||
int CURRENT_LEVEL = 1; |
||||
/** |
||||
* 创建数据集面板 |
||||
* @return 数据集面板 |
||||
*/ |
||||
BasicTableDataTreePane createTableDataTreePane(DesignModelAdapter<?, ?> tc); |
||||
|
||||
} |
@ -0,0 +1,20 @@
|
||||
package com.fr.design.fun.impl; |
||||
|
||||
import com.fr.design.fun.BackgroundQuickUIProvider; |
||||
import com.fr.stable.fun.impl.AbstractProvider; |
||||
|
||||
/** |
||||
* Created by richie on 16/5/18. |
||||
*/ |
||||
public abstract class AbstractBackgroundQuickUIProvider extends AbstractProvider implements BackgroundQuickUIProvider { |
||||
|
||||
@Override |
||||
public int currentAPILevel() { |
||||
return CURRENT_LEVEL; |
||||
} |
||||
|
||||
@Override |
||||
public String mark4Provider() { |
||||
return getClass().getName(); |
||||
} |
||||
} |
@ -0,0 +1,20 @@
|
||||
package com.fr.design.fun.impl; |
||||
|
||||
import com.fr.design.fun.BackgroundUIProvider; |
||||
import com.fr.stable.fun.impl.AbstractProvider; |
||||
|
||||
/** |
||||
* Created by richie on 16/5/18. |
||||
*/ |
||||
public abstract class AbstractBackgroundUIProvider extends AbstractProvider implements BackgroundUIProvider { |
||||
|
||||
@Override |
||||
public int currentAPILevel() { |
||||
return CURRENT_LEVEL; |
||||
} |
||||
|
||||
@Override |
||||
public String mark4Provider() { |
||||
return getClass().getName(); |
||||
} |
||||
} |
@ -1,13 +1,13 @@
|
||||
package com.fr.design.fun.impl; |
||||
|
||||
import com.fr.design.fun.TableDataTreePaneProcessor; |
||||
import com.fr.design.fun.TableDataPaneProcessor; |
||||
|
||||
/** |
||||
* Coder: zack |
||||
* Date: 2016/4/18 |
||||
* Time: 10:30 |
||||
*/ |
||||
public abstract class AbstractTDTreePaneProcessor implements TableDataTreePaneProcessor { |
||||
public abstract class AbstractTDPaneProcessor implements TableDataPaneProcessor { |
||||
@Override |
||||
public int currentAPILevel() { |
||||
return CURRENT_LEVEL; |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,966 @@
|
||||
package com.fr.design.gui.controlpane; |
||||
|
||||
import com.fr.base.BaseUtils; |
||||
import com.fr.base.FRContext; |
||||
import com.fr.design.actions.UpdateAction; |
||||
import com.fr.design.beans.BasicBeanPane; |
||||
import com.fr.design.data.tabledata.tabledatapane.GlobalMultiTDTableDataPane; |
||||
import com.fr.design.data.tabledata.tabledatapane.GlobalTreeTableDataPane; |
||||
import com.fr.design.data.tabledata.tabledatapane.MultiTDTableDataPane; |
||||
import com.fr.design.data.tabledata.tabledatapane.TreeTableDataPane; |
||||
import com.fr.design.file.HistoryTemplateListPane; |
||||
import com.fr.design.gui.icontainer.UIScrollPane; |
||||
import com.fr.design.gui.ilist.JNameEdList; |
||||
import com.fr.design.gui.ilist.ListModelElement; |
||||
import com.fr.design.gui.ilist.ModNameActionListener; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.design.mainframe.JTemplate; |
||||
import com.fr.design.menu.LineSeparator; |
||||
import com.fr.design.menu.MenuDef; |
||||
import com.fr.design.menu.ShortCut; |
||||
import com.fr.design.menu.ToolBarDef; |
||||
import com.fr.design.utils.gui.GUICoreUtils; |
||||
import com.fr.general.ComparatorUtils; |
||||
import com.fr.general.Inter; |
||||
import com.fr.stable.ArrayUtils; |
||||
import com.fr.stable.Nameable; |
||||
import com.fr.stable.core.PropertyChangeAdapter; |
||||
|
||||
import javax.swing.*; |
||||
import javax.swing.event.ListSelectionEvent; |
||||
import javax.swing.event.ListSelectionListener; |
||||
import java.awt.*; |
||||
import java.awt.event.ActionEvent; |
||||
import java.awt.event.MouseAdapter; |
||||
import java.awt.event.MouseEvent; |
||||
import java.awt.event.MouseListener; |
||||
import java.lang.reflect.Constructor; |
||||
import java.lang.reflect.InvocationTargetException; |
||||
import java.util.Arrays; |
||||
import java.util.Comparator; |
||||
|
||||
public abstract class JListControlPane extends JControlPane { |
||||
public static final String LIST_NAME = "JControl_List"; |
||||
|
||||
protected JNameEdList nameableList; |
||||
protected int editingIndex; |
||||
protected String selectedName; |
||||
private boolean isNameRepeated = false; |
||||
|
||||
public JListControlPane() { |
||||
this.initComponentPane(); |
||||
} |
||||
|
||||
@Override |
||||
protected JPanel createControlUpdatePane() { |
||||
return new JControlUpdatePane(); |
||||
} |
||||
|
||||
/** |
||||
* 生成添加按钮的NameableCreator |
||||
* |
||||
* @return 按钮的NameableCreator |
||||
*/ |
||||
@Override |
||||
public abstract NameableCreator[] createNameableCreators(); |
||||
|
||||
|
||||
@Override |
||||
protected void initLeftPane(JPanel leftPane) { |
||||
nameableList = createJNameList(); |
||||
nameableList.setName(LIST_NAME); |
||||
leftPane.add(new UIScrollPane(nameableList), BorderLayout.CENTER); |
||||
|
||||
|
||||
nameableList.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); |
||||
nameableList.addMouseListener(listMouseListener); |
||||
nameableList.addListSelectionListener(new ListSelectionListener() { |
||||
public void valueChanged(ListSelectionEvent evt) { |
||||
// richie:避免多次update和populate大大降低效率
|
||||
if (!evt.getValueIsAdjusting()) { |
||||
// shoc 切换的时候加检验
|
||||
if (hasInvalid(false)) { |
||||
return; |
||||
} |
||||
((JControlUpdatePane) JListControlPane.this.controlUpdatePane).update(); |
||||
((JControlUpdatePane) JListControlPane.this.controlUpdatePane).populate(); |
||||
JListControlPane.this.checkButtonEnabled(); |
||||
} |
||||
} |
||||
}); |
||||
} |
||||
|
||||
public JNameEdList createJNameList() { |
||||
JNameEdList nameEdList = new JNameEdList(new DefaultListModel()) { |
||||
@Override |
||||
protected void doAfterLostFocus() { |
||||
JListControlPane.this.updateControlUpdatePane(); |
||||
} |
||||
}; |
||||
nameEdList.setCellRenderer(new NameableListCellRenderer()); |
||||
return nameEdList; |
||||
} |
||||
|
||||
public void updateControlUpdatePane() { |
||||
((JControlUpdatePane) controlUpdatePane).update(); |
||||
} |
||||
|
||||
protected void doWhenPopulate(BasicBeanPane beanPane) { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
protected ShortCut4JControlPane addItemShortCut() { |
||||
ShortCut addItemShortCut; |
||||
NameableCreator[] creators = creators(); |
||||
if (creators.length == 1) { |
||||
addItemShortCut = new AddItemUpdateAction(creators); |
||||
} else { |
||||
addItemShortCut = new AddItemMenuDef(creators); |
||||
} |
||||
return new AbsoluteEnableShortCut(addItemShortCut); |
||||
} |
||||
|
||||
@Override |
||||
protected ShortCut4JControlPane removeItemShortCut() { |
||||
return new NormalEnableShortCut(new RemoveItemAction()); |
||||
} |
||||
|
||||
@Override |
||||
protected ShortCut4JControlPane copyItemShortCut() { |
||||
return new NormalEnableShortCut(new CopyItemAction()); |
||||
} |
||||
|
||||
@Override |
||||
protected ShortCut4JControlPane moveUpItemShortCut() { |
||||
return new NormalEnableShortCut(new MoveUpItemAction()); |
||||
} |
||||
|
||||
@Override |
||||
protected ShortCut4JControlPane moveDownItemShortCut() { |
||||
return new NormalEnableShortCut(new MoveDownItemAction()); |
||||
} |
||||
|
||||
@Override |
||||
protected ShortCut4JControlPane sortItemShortCut() { |
||||
return new NormalEnableShortCut(new SortItemAction()); |
||||
} |
||||
|
||||
public void setNameListEditable(boolean editable) { |
||||
this.nameableList.setEditable(editable); |
||||
} |
||||
|
||||
@Override |
||||
public Nameable[] update() { |
||||
java.util.List<Nameable> res = new java.util.ArrayList<Nameable>(); |
||||
((JControlUpdatePane) this.controlUpdatePane).update(); |
||||
DefaultListModel listModel = (DefaultListModel) this.nameableList.getModel(); |
||||
for (int i = 0, len = listModel.getSize(); i < len; i++) { |
||||
res.add(((ListModelElement) listModel.getElementAt(i)).wrapper); |
||||
} |
||||
|
||||
return res.toArray(new Nameable[res.size()]); |
||||
} |
||||
|
||||
@Override |
||||
public void populate(Nameable[] nameableArray) { |
||||
DefaultListModel listModel = (DefaultListModel) this.nameableList.getModel(); |
||||
listModel.removeAllElements(); |
||||
if (ArrayUtils.isEmpty(nameableArray)) { |
||||
return; |
||||
} |
||||
|
||||
for (Nameable aNameableArray : nameableArray) { |
||||
listModel.addElement(new ListModelElement(aNameableArray)); |
||||
} |
||||
|
||||
if (listModel.size() > 0) { |
||||
this.nameableList.setSelectedIndex(0); |
||||
} |
||||
this.checkButtonEnabled(); |
||||
} |
||||
|
||||
/** |
||||
* 添加名字改变时的listener |
||||
* |
||||
* @param l 名字改变时的监听 |
||||
*/ |
||||
public void addModNameActionListener(ModNameActionListener l) { |
||||
this.nameableList.addModNameActionListener(l); |
||||
} |
||||
|
||||
/** |
||||
* 添加Editinglistener |
||||
* |
||||
* @param l 监听 |
||||
*/ |
||||
public void addEditingListner(PropertyChangeAdapter l) { |
||||
this.nameableList.addEditingListner(l); |
||||
} |
||||
|
||||
/* |
||||
* 刷新当前的选中的UpdatePane |
||||
*/ |
||||
protected void populateSelectedValue() { |
||||
((JControlUpdatePane) JListControlPane.this.controlUpdatePane).populate(); |
||||
} |
||||
|
||||
/** |
||||
* 根据name,选中JNameEdList中的item |
||||
*/ |
||||
public void setSelectedName(String name) { |
||||
DefaultListModel listModel = (DefaultListModel) this.nameableList.getModel(); |
||||
for (int i = 0, len = listModel.getSize(); i < len; i++) { |
||||
Nameable item = ((ListModelElement) listModel.getElementAt(i)).wrapper; |
||||
if (ComparatorUtils.equals(name, item.getName())) { |
||||
this.nameableList.setSelectedIndex(i); |
||||
break; |
||||
} |
||||
} |
||||
} |
||||
|
||||
public String getEditingName() { |
||||
return this.nameableList.getEditingName(); |
||||
} |
||||
|
||||
public Object getEditingType() { |
||||
return this.nameableList.getAllTypes()[editingIndex]; |
||||
} |
||||
|
||||
public void setWarnigText(int index) { |
||||
this.nameableList.setWarnigText(index); |
||||
} |
||||
|
||||
/** |
||||
* 获取选中的名字 |
||||
*/ |
||||
public String getSelectedName() { |
||||
ListModelElement el = (ListModelElement) this.nameableList.getSelectedValue(); |
||||
|
||||
return el == null ? null : el.wrapper.getName(); |
||||
} |
||||
|
||||
protected boolean isNameRepeted(java.util.List[] list, String name) { |
||||
for (int i = 0; i < list.length; i++) { |
||||
if (list[i].contains(name)) { |
||||
isNameRepeated = true; |
||||
return true; |
||||
} |
||||
} |
||||
isNameRepeated = false; |
||||
return false; |
||||
} |
||||
|
||||
/** |
||||
* 名字是否重复 |
||||
* |
||||
* @return 重复则返回true |
||||
*/ |
||||
public boolean isNameRepeated() { |
||||
return isNameRepeated; |
||||
} |
||||
|
||||
/** |
||||
* 添加 Nameable |
||||
* |
||||
* @param nameable 添加的Nameable |
||||
* @param index 序号 |
||||
*/ |
||||
public void addNameable(Nameable nameable, int index) { |
||||
JNameEdList nameEdList = JListControlPane.this.nameableList; |
||||
DefaultListModel model = (DefaultListModel) nameEdList.getModel(); |
||||
|
||||
ListModelElement el = new ListModelElement(nameable); |
||||
model.add(index, el); |
||||
nameableList.setSelectedIndex(index); |
||||
nameableList.ensureIndexIsVisible(index); |
||||
|
||||
nameEdList.repaint(); |
||||
} |
||||
|
||||
/** |
||||
* 是否重命名 |
||||
* |
||||
* @return 是则true |
||||
*/ |
||||
public boolean isContainsRename() { |
||||
String rename = Inter.getLocText("FR-Please_Rename") + "!"; |
||||
String[] names = this.nameableList.getAllNames(); |
||||
for (int i = names.length - 1; i >= 0; i--) { |
||||
if (ComparatorUtils.equals(names[i], rename)) { |
||||
return true; |
||||
} |
||||
} |
||||
return false; |
||||
} |
||||
|
||||
protected DefaultListModel getModel() { |
||||
return (DefaultListModel) JListControlPane.this.nameableList.getModel(); |
||||
} |
||||
|
||||
private String createUnrepeatedCopyName(String suffix) { |
||||
DefaultListModel model = this.getModel(); |
||||
String[] names = new String[model.getSize()]; |
||||
for (int i = 0; i < model.size(); i++) { |
||||
names[i] = ((ListModelElement) model.get(i)).wrapper.getName(); |
||||
} |
||||
String lastName = "CopyOf" + suffix; |
||||
while (ArrayUtils.contains(names, lastName)) { |
||||
lastName = "CopyOf" + lastName; |
||||
} |
||||
return lastName; |
||||
} |
||||
|
||||
|
||||
/** |
||||
* 生成不重复的名字 |
||||
* |
||||
* @param prefix 名字前缀 |
||||
* @return 名字 |
||||
*/ |
||||
@Override |
||||
public String createUnrepeatedName(String prefix) { |
||||
DefaultListModel model = this.getModel(); |
||||
Nameable[] all = new Nameable[model.getSize()]; |
||||
for (int i = 0; i < model.size(); i++) { |
||||
all[i] = ((ListModelElement) model.get(i)).wrapper; |
||||
} |
||||
// richer:生成的名字从1开始. kunsnat: 添加属性从0开始.
|
||||
int count = all.length + 1; |
||||
while (true) { |
||||
String name_test = prefix + count; |
||||
boolean repeated = false; |
||||
for (int i = 0, len = model.size(); i < len; i++) { |
||||
Nameable nameable = all[i]; |
||||
if (ComparatorUtils.equals(nameable.getName(), name_test)) { |
||||
repeated = true; |
||||
break; |
||||
} |
||||
} |
||||
|
||||
if (!repeated) { |
||||
return name_test; |
||||
} |
||||
|
||||
count++; |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 增加项的UpdateAction |
||||
*/ |
||||
protected class AddItemUpdateAction extends UpdateAction { |
||||
final NameableCreator creator; |
||||
|
||||
public AddItemUpdateAction(NameableCreator[] creators) { |
||||
this.creator = creators[0]; |
||||
this.setName(Inter.getLocText("FR-Action_Add")); |
||||
this.setMnemonic('A'); |
||||
this.setSmallIcon(BaseUtils.readIcon("/com/fr/base/images/cell/control/add.png")); |
||||
} |
||||
|
||||
@Override |
||||
public void actionPerformed(ActionEvent e) { |
||||
Nameable nameable = creator.createNameable(JListControlPane.this); |
||||
|
||||
JListControlPane.this.addNameable(nameable, getModel().getSize()); |
||||
} |
||||
} |
||||
|
||||
/* |
||||
* 增加项的MenuDef |
||||
*/ |
||||
protected class AddItemMenuDef extends MenuDef { |
||||
public AddItemMenuDef(NameableCreator[] creators) { |
||||
this.setName(Inter.getLocText("FR-Action_Add")); |
||||
this.setMnemonic('A'); |
||||
this.setIconPath("/com/fr/design/images/control/addPopup.png"); |
||||
wrapActionListener(creators); |
||||
} |
||||
|
||||
private void wrapActionListener(NameableCreator[] creators) { |
||||
for (final NameableCreator creator : creators) { |
||||
if (!whetherAdd(creator.menuName())) { |
||||
continue; |
||||
} |
||||
boolean isTrue = ComparatorUtils.equals(creator.menuName(), Inter.getLocText("Datasource-Stored_Procedure")) || |
||||
ComparatorUtils.equals(creator.menuName(), Inter.getLocText("DS-Relation_TableData")) || ComparatorUtils.equals(creator.menuName(), Inter.getLocText("DS-Multi_Dimensional_Database")); |
||||
if (isTrue) { |
||||
this.addShortCut(new LineSeparator()); |
||||
} |
||||
this.addShortCut(new UpdateAction() { |
||||
{ |
||||
this.setName(creator.menuName()); |
||||
Icon icon = creator.menuIcon(); |
||||
if (icon != null) { |
||||
this.setSmallIcon(icon); |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public void actionPerformed(ActionEvent e) { |
||||
if (hasInvalid(true)) { |
||||
return; |
||||
} |
||||
|
||||
Nameable nameable = creator.createNameable(JListControlPane.this); |
||||
|
||||
JListControlPane.this.addNameable(nameable, getModel().getSize()); |
||||
} |
||||
}); |
||||
} |
||||
} |
||||
|
||||
private boolean whetherAdd(String itemName) { |
||||
JTemplate jTemplate = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate(); |
||||
if (jTemplate == null) { |
||||
return false; |
||||
} |
||||
//先屏蔽掉这个,之后还有别的
|
||||
String[] names = {Inter.getLocText("FR-Hyperlink_Chart_Float")}; |
||||
for (String name : names) { |
||||
if (!jTemplate.isJWorkBook() && ComparatorUtils.equals(itemName, name)) { |
||||
return false; |
||||
} |
||||
} |
||||
String formName = Inter.getLocText("Hyperlink-Form_link"); |
||||
return !(jTemplate.isJWorkBook() && ComparatorUtils.equals(itemName, formName)); |
||||
} |
||||
} |
||||
|
||||
/* |
||||
* 移除item |
||||
*/ |
||||
private class RemoveItemAction extends UpdateAction { |
||||
public RemoveItemAction() { |
||||
this.setName(Inter.getLocText("FR-Action_Remove")); |
||||
this.setMnemonic('R'); |
||||
this.setSmallIcon(BaseUtils |
||||
.readIcon("/com/fr/base/images/cell/control/remove.png")); |
||||
} |
||||
|
||||
@Override |
||||
public void actionPerformed(ActionEvent evt) { |
||||
try { |
||||
JListControlPane.this.nameableList.getCellEditor() |
||||
.stopCellEditing(); |
||||
} catch (Exception ignored) { |
||||
} |
||||
// bug:在选中一个NameObject并删除,会遗留下Name.
|
||||
doBeforeRemove(); |
||||
if (GUICoreUtils.removeJListSelectedNodes(SwingUtilities |
||||
.getWindowAncestor(JListControlPane.this), nameableList)) { |
||||
checkButtonEnabled(); |
||||
doAfterRemove(); |
||||
} |
||||
} |
||||
} |
||||
|
||||
/* |
||||
* CopyItem |
||||
*/ |
||||
private class CopyItemAction extends UpdateAction { |
||||
public CopyItemAction() { |
||||
this.setName(Inter.getLocText("FR-Action_Copy")); |
||||
this.setMnemonic('C'); |
||||
this.setSmallIcon(BaseUtils |
||||
.readIcon("/com/fr/base/images/cell/control/copy.png")); |
||||
} |
||||
|
||||
@Override |
||||
public void actionPerformed(ActionEvent evt) { |
||||
// p:选中的值.
|
||||
ListModelElement selectedValue = (ListModelElement) nameableList.getSelectedValue(); |
||||
if (selectedValue == null) { |
||||
return; |
||||
} |
||||
|
||||
((JControlUpdatePane) controlUpdatePane).update(); |
||||
|
||||
Nameable selectedNameable = selectedValue.wrapper; |
||||
|
||||
// p: 用反射机制实现
|
||||
try { |
||||
Nameable newNameable = (Nameable) BaseUtils.cloneObject(selectedNameable); |
||||
newNameable.setName(createUnrepeatedCopyName(selectedNameable.getName())); |
||||
|
||||
JListControlPane.this.addNameable(newNameable, nameableList.getSelectedIndex() + 1); |
||||
} catch (Exception e) { |
||||
FRContext.getLogger().error(e.getMessage(), e); |
||||
} |
||||
} |
||||
} |
||||
|
||||
/* |
||||
* 上移Item |
||||
*/ |
||||
private class MoveUpItemAction extends UpdateAction { |
||||
public MoveUpItemAction() { |
||||
this.setName(Inter.getLocText("Utils-Move_Up")); |
||||
this.setMnemonic('U'); |
||||
this.setSmallIcon(BaseUtils |
||||
.readIcon("/com/fr/design/images/control/up.png")); |
||||
} |
||||
|
||||
@Override |
||||
public void actionPerformed(ActionEvent evt) { |
||||
int selectedIndex = nameableList.getSelectedIndex(); |
||||
if (selectedIndex == -1) { |
||||
return; |
||||
} |
||||
|
||||
// 上移
|
||||
if (selectedIndex > 0) { |
||||
DefaultListModel listModel = (DefaultListModel) nameableList |
||||
.getModel(); |
||||
|
||||
Object selecteObj1 = listModel.get(selectedIndex - 1); |
||||
listModel.set(selectedIndex - 1, listModel.get(selectedIndex)); |
||||
listModel.set(selectedIndex, selecteObj1); |
||||
|
||||
nameableList.setSelectedIndex(selectedIndex - 1); |
||||
nameableList.ensureIndexIsVisible(selectedIndex - 1); |
||||
} |
||||
} |
||||
} |
||||
|
||||
/* |
||||
* 下移Item |
||||
*/ |
||||
private class MoveDownItemAction extends UpdateAction { |
||||
public MoveDownItemAction() { |
||||
this.setName(Inter.getLocText("Utils-Move_Down")); |
||||
this.setMnemonic('D'); |
||||
this.setSmallIcon(BaseUtils |
||||
.readIcon("/com/fr/design/images/control/down.png")); |
||||
} |
||||
|
||||
@Override |
||||
public void actionPerformed(ActionEvent evt) { |
||||
int selectedIndex = nameableList.getSelectedIndex(); |
||||
if (selectedIndex == -1) { |
||||
return; |
||||
} |
||||
|
||||
if (selectedIndex < nameableList.getModel().getSize() - 1) { |
||||
DefaultListModel listModel = (DefaultListModel) nameableList |
||||
.getModel(); |
||||
|
||||
Object selecteObj1 = listModel.get(selectedIndex + 1); |
||||
listModel.set(selectedIndex + 1, listModel.get(selectedIndex)); |
||||
listModel.set(selectedIndex, selecteObj1); |
||||
|
||||
nameableList.setSelectedIndex(selectedIndex + 1); |
||||
nameableList.ensureIndexIsVisible(selectedIndex + 1); |
||||
} |
||||
} |
||||
} |
||||
|
||||
private class SortItemAction extends UpdateAction { |
||||
private boolean isAtoZ = false; |
||||
|
||||
public SortItemAction() { |
||||
this.setName(Inter.getLocText("FR-Action_Sort")); |
||||
this.setMnemonic('S'); |
||||
this.setSmallIcon(BaseUtils |
||||
.readIcon("/com/fr/design/images/control/sortAsc.png")); |
||||
} |
||||
|
||||
@Override |
||||
public void actionPerformed(ActionEvent evt) { |
||||
// p:选中的值.
|
||||
Object selectedValue = nameableList.getSelectedValue(); |
||||
|
||||
DefaultListModel listModel = (DefaultListModel) nameableList |
||||
.getModel(); |
||||
Nameable[] nameableArray = new Nameable[listModel.getSize()]; |
||||
if (nameableArray.length <= 0) { |
||||
return; |
||||
} |
||||
|
||||
for (int i = 0; i < listModel.getSize(); i++) { |
||||
nameableArray[i] = ((ListModelElement) listModel.getElementAt(i)).wrapper; |
||||
} |
||||
|
||||
// p:排序.
|
||||
if (isAtoZ) { |
||||
Comparator<Nameable> nameableComparator = new Comparator<Nameable>() { |
||||
@Override |
||||
public int compare(Nameable o1, Nameable o2) { |
||||
return -ComparatorUtils.compare(o1.getName(), o2 |
||||
.getName()); |
||||
} |
||||
}; |
||||
isAtoZ = !isAtoZ; |
||||
Arrays.sort(nameableArray, nameableComparator); |
||||
} else { |
||||
Comparator<Nameable> nameableComparator = new Comparator<Nameable>() { |
||||
@Override |
||||
public int compare(Nameable o1, Nameable o2) { |
||||
return ComparatorUtils.compare(o1.getName(), o2 |
||||
.getName()); |
||||
} |
||||
}; |
||||
isAtoZ = !isAtoZ; |
||||
Arrays.sort(nameableArray, nameableComparator); |
||||
} |
||||
|
||||
for (int i = 0; i < nameableArray.length; i++) { |
||||
listModel.set(i, new ListModelElement(nameableArray[i])); |
||||
} |
||||
|
||||
// p:需要选中以前的那个值.
|
||||
if (selectedValue != null) { |
||||
nameableList.setSelectedValue(selectedValue, true); |
||||
} |
||||
|
||||
checkButtonEnabled(); |
||||
// p:需要repaint.
|
||||
nameableList.repaint(); |
||||
} |
||||
} |
||||
|
||||
/* |
||||
* JNameEdList的鼠标事件 |
||||
*/ |
||||
private MouseListener listMouseListener = new MouseAdapter() { |
||||
@Override |
||||
public void mouseReleased(MouseEvent evt) { |
||||
nameableList.stopEditing(); |
||||
if (evt.getClickCount() >= 2 |
||||
&& SwingUtilities.isLeftMouseButton(evt)) { |
||||
editingIndex = nameableList.getSelectedIndex(); |
||||
selectedName = nameableList.getNameAt(editingIndex); |
||||
nameableList.editItemAt(nameableList.getSelectedIndex()); |
||||
} |
||||
// peter:处理右键的弹出菜单
|
||||
if (!SwingUtilities.isRightMouseButton(evt)) { |
||||
return; |
||||
} |
||||
|
||||
// peter: 注意,在checkButtonEnabled()方法里面,设置了所有的Action的Enabled.
|
||||
checkButtonEnabled(); |
||||
|
||||
// p:右键菜单.
|
||||
JPopupMenu popupMenu = new JPopupMenu(); |
||||
|
||||
for (ShortCut4JControlPane sj : getShorts()) { |
||||
sj.getShortCut().intoJPopupMenu(popupMenu); |
||||
} |
||||
|
||||
// peter: 只有弹出菜单有子菜单的时候,才需要弹出来.
|
||||
GUICoreUtils.showPopupMenu(popupMenu, nameableList, evt.getX() - 1, |
||||
evt.getY() - 1); |
||||
} |
||||
|
||||
@Override |
||||
public void mouseMoved(MouseEvent e) { |
||||
|
||||
} |
||||
}; |
||||
|
||||
/** |
||||
* 检查按钮可用状态 Check button enabled. |
||||
*/ |
||||
@Override |
||||
public void checkButtonEnabled() { |
||||
|
||||
int selectedIndex = nameableList.getSelectedIndex(); |
||||
if (selectedIndex == -1) { |
||||
this.cardLayout.show(cardPane, "SELECT"); |
||||
} else { |
||||
this.cardLayout.show(cardPane, "EDIT"); |
||||
} |
||||
for (ShortCut4JControlPane sj : getShorts()) { |
||||
sj.checkEnable(); |
||||
} |
||||
} |
||||
|
||||
/* |
||||
* Nameable的ListCellRenerer |
||||
*/ |
||||
private class NameableListCellRenderer extends |
||||
DefaultListCellRenderer { |
||||
@Override |
||||
public Component getListCellRendererComponent(JList list, Object value, |
||||
int index, boolean isSelected, boolean cellHasFocus) { |
||||
super.getListCellRendererComponent(list, value, index, isSelected, |
||||
cellHasFocus); |
||||
|
||||
if (value instanceof ListModelElement) { |
||||
Nameable wrappee = ((ListModelElement) value).wrapper; |
||||
this.setText(((ListModelElement) value).wrapper.getName()); |
||||
|
||||
boolean iconSet = false; |
||||
for (NameableCreator creator : JListControlPane.this.creators()) { |
||||
if (creator.menuIcon() != null && creator.acceptObject2Populate(wrappee) != null) { |
||||
this.setIcon(creator.menuIcon()); |
||||
this.setToolTipText(creator.createTooltip()); |
||||
iconSet = true; |
||||
break; |
||||
} |
||||
} |
||||
if (!iconSet) { |
||||
this.setIcon(BaseUtils.readIcon("/com/fr/base/images/oem/cpt.png")); |
||||
} |
||||
} |
||||
|
||||
return this; |
||||
} |
||||
} |
||||
|
||||
public class AbsoluteEnableShortCut extends ShortCut4JControlPane { |
||||
public AbsoluteEnableShortCut(ShortCut shortCut) { |
||||
this.shortCut = shortCut; |
||||
} |
||||
|
||||
/** |
||||
* 检查是否可用 |
||||
*/ |
||||
@Override |
||||
public void checkEnable() { |
||||
this.shortCut.setEnabled(true); |
||||
} |
||||
} |
||||
|
||||
public class NormalEnableShortCut extends ShortCut4JControlPane { |
||||
public NormalEnableShortCut(ShortCut shortCut) { |
||||
this.shortCut = shortCut; |
||||
} |
||||
|
||||
/** |
||||
* 检查是否可用 |
||||
*/ |
||||
@Override |
||||
public void checkEnable() { |
||||
this.shortCut.setEnabled(getModel() |
||||
.getSize() > 0 |
||||
&& JListControlPane.this.nameableList.getSelectedIndex() != -1); |
||||
} |
||||
} |
||||
|
||||
public class SortEnableShortCut extends ShortCut4JControlPane { |
||||
public SortEnableShortCut(ShortCut shortCut) { |
||||
this.shortCut = shortCut; |
||||
} |
||||
|
||||
/** |
||||
* 检查是否可用 |
||||
*/ |
||||
@Override |
||||
public void checkEnable() { |
||||
this.shortCut.setEnabled(getModel().getSize() > 1); |
||||
} |
||||
|
||||
} |
||||
|
||||
public class MoveUpEnableShortCut extends ShortCut4JControlPane { |
||||
public MoveUpEnableShortCut(ShortCut shortCut) { |
||||
this.shortCut = shortCut; |
||||
} |
||||
|
||||
/** |
||||
* 检查是否可用 |
||||
*/ |
||||
@Override |
||||
public void checkEnable() { |
||||
this.shortCut.setEnabled(getModel().getSize() > 1 |
||||
&& JListControlPane.this.nameableList.getSelectedIndex() > 0); |
||||
} |
||||
|
||||
} |
||||
|
||||
public class MoveDownEnableShortCut extends ShortCut4JControlPane { |
||||
public MoveDownEnableShortCut(ShortCut shortCut) { |
||||
this.shortCut = shortCut; |
||||
} |
||||
|
||||
/** |
||||
* 检查是否可用 |
||||
*/ |
||||
@Override |
||||
public void checkEnable() { |
||||
this.shortCut.setEnabled(getModel().getSize() > 1 |
||||
&& JListControlPane.this.nameableList.getSelectedIndex() < JListControlPane.this.nameableList.getModel().getSize() - 1); |
||||
} |
||||
|
||||
} |
||||
|
||||
private class JControlUpdatePane extends JPanel { |
||||
private CardLayout card; |
||||
private JPanel cardPane; |
||||
private BasicBeanPane[] updatePanes; |
||||
|
||||
private ListModelElement elEditing; |
||||
|
||||
public JControlUpdatePane() { |
||||
initUpdatePane(); |
||||
} |
||||
|
||||
private void initUpdatePane() { |
||||
NameableCreator[] creators = creators(); |
||||
if (creators == null) { |
||||
return; |
||||
} |
||||
card = new CardLayout(); |
||||
cardPane = FRGUIPaneFactory.createCardLayout_S_Pane(); |
||||
cardPane.setLayout(card); |
||||
this.setLayout(FRGUIPaneFactory.createBorderLayout()); |
||||
this.add(cardPane); |
||||
int len = creators.length; |
||||
updatePanes = new BasicBeanPane[len]; |
||||
} |
||||
|
||||
public void populate() { |
||||
ListModelElement el = (ListModelElement) JListControlPane.this.nameableList.getSelectedValue(); |
||||
if (el == null) { |
||||
return; |
||||
} |
||||
|
||||
elEditing = el; |
||||
NameableCreator[] creators = creators(); |
||||
|
||||
for (int i = 0, len = updatePanes.length; i < len; i++) { |
||||
Object ob2Populate = creators[i].acceptObject2Populate(el.wrapper); |
||||
if (ob2Populate != null) { |
||||
if (updatePanes[i] == null) { |
||||
if (isMulti(creators[i].getUpdatePane()) || isTree(creators[i].getUpdatePane())) { |
||||
updatePanes[i] = createPaneByCreators(creators[i], el.wrapper.getName()); |
||||
} else { |
||||
updatePanes[i] = createPaneByCreators(creators[i]); |
||||
} |
||||
cardPane.add(updatePanes[i], String.valueOf(i)); |
||||
} |
||||
card.show(cardPane, String.valueOf(i)); |
||||
updatePanes[i].populateBean(ob2Populate); |
||||
doWhenPopulate(updatePanes[i]); |
||||
break; |
||||
} |
||||
} |
||||
} |
||||
|
||||
public boolean isMulti(Class _class) { |
||||
return ComparatorUtils.equals(_class, GlobalMultiTDTableDataPane.class) || ComparatorUtils.equals(_class, MultiTDTableDataPane.class); |
||||
} |
||||
|
||||
public boolean isTree(Class _class) { |
||||
return ComparatorUtils.equals(_class, GlobalTreeTableDataPane.class) || ComparatorUtils.equals(_class, TreeTableDataPane.class); |
||||
} |
||||
|
||||
public void update() { |
||||
NameableCreator[] creators = creators(); |
||||
for (int i = 0; i < updatePanes.length; i++) { |
||||
BasicBeanPane pane = updatePanes[i]; |
||||
|
||||
if (pane != null && pane.isVisible()) { |
||||
Object bean = pane.updateBean(); |
||||
if (i < creators.length) { |
||||
creators[i].saveUpdatedBean(elEditing, bean); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
public void checkValid() throws Exception { |
||||
if (updatePanes != null) { |
||||
for (int i = 0; i < updatePanes.length; i++) { |
||||
if (updatePanes[i] != null) { |
||||
updatePanes[i].checkValid(); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
protected BasicBeanPane createPaneByCreators(NameableCreator creator) { |
||||
try { |
||||
return creator.getUpdatePane().newInstance(); |
||||
} catch (InstantiationException e) { |
||||
throw new RuntimeException(e); |
||||
} catch (IllegalAccessException e) { |
||||
throw new RuntimeException(e); |
||||
} |
||||
} |
||||
|
||||
protected BasicBeanPane createPaneByCreators(NameableCreator creator, String string) { |
||||
Constructor constructor = null; |
||||
try { |
||||
constructor = creator.getUpdatePane().getDeclaredConstructor(new Class[]{String.class}); |
||||
constructor.setAccessible(true); |
||||
return (BasicBeanPane) constructor.newInstance(string); |
||||
} catch (NoSuchMethodException e) { |
||||
throw new RuntimeException(e); |
||||
} catch (InstantiationException e) { |
||||
throw new RuntimeException(e); |
||||
} catch (IllegalAccessException e) { |
||||
throw new RuntimeException(e); |
||||
} catch (InvocationTargetException e) { |
||||
throw new RuntimeException(e); |
||||
} |
||||
|
||||
} |
||||
|
||||
// 选项添加个数有限制等情况下 要求能控制快捷按钮的状态
|
||||
protected void setToolbarDefEnable(int shortCutIndex, int itemIndex, boolean enabled) { |
||||
ToolBarDef toolbarDef = getToolbarDef(); |
||||
if (toolbarDef.getShortCutCount() > shortCutIndex) { |
||||
ShortCut sc = toolbarDef.getShortCut(shortCutIndex); |
||||
if (sc instanceof AddItemMenuDef) { |
||||
AddItemMenuDef am = (AddItemMenuDef) sc; |
||||
if (am.getShortCutCount() > itemIndex) { |
||||
am.getShortCut(itemIndex).setEnabled(enabled); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 检查是否符合规范 |
||||
* |
||||
* @throws Exception |
||||
*/ |
||||
@Override |
||||
public void checkValid() throws Exception { |
||||
((JControlUpdatePane) this.controlUpdatePane).checkValid(); |
||||
} |
||||
|
||||
private int getInValidIndex() { |
||||
BasicBeanPane[] p = ((JControlUpdatePane) controlUpdatePane).updatePanes; |
||||
if (p != null) { |
||||
for (int i = 0; i < p.length; i++) { |
||||
if (p[i] != null) { |
||||
try { |
||||
p[i].checkValid(); |
||||
} catch (Exception e) { |
||||
return i; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
return -1; |
||||
} |
||||
|
||||
@Override |
||||
protected boolean hasInvalid(boolean isAdd) { |
||||
int idx = JListControlPane.this.getInValidIndex(); |
||||
if (isAdd || nameableList.getSelectedIndex() != idx) { |
||||
try { |
||||
checkValid(); |
||||
} catch (Exception exp) { |
||||
JOptionPane.showMessageDialog(JListControlPane.this, exp.getMessage()); |
||||
nameableList.setSelectedIndex(idx); |
||||
return true; |
||||
} |
||||
} |
||||
return false; |
||||
} |
||||
/** |
||||
* 设置选中项 |
||||
* |
||||
* @param index 选中项的序列号 |
||||
*/ |
||||
public void setSelectedIndex(int index) { |
||||
nameableList.setSelectedIndex(index); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,18 @@
|
||||
package com.fr.design.style.background; |
||||
|
||||
import com.fr.general.Background; |
||||
|
||||
import javax.swing.*; |
||||
import javax.swing.event.ChangeListener; |
||||
|
||||
/** |
||||
* Created by richie on 16/5/18. |
||||
*/ |
||||
public abstract class BackgroundDetailPane extends JPanel { |
||||
|
||||
public abstract void populate(Background background); |
||||
|
||||
public abstract Background update() throws Exception; |
||||
|
||||
public abstract void addChangeListener(ChangeListener changeListener); |
||||
} |
@ -0,0 +1,121 @@
|
||||
package com.fr.design.style.background; |
||||
|
||||
|
||||
import com.fr.base.background.*; |
||||
import com.fr.design.ExtraDesignClassManager; |
||||
import com.fr.design.fun.BackgroundUIProvider; |
||||
import com.fr.design.style.background.gradient.GradientBackgroundPane; |
||||
import com.fr.design.style.background.impl.*; |
||||
import com.fr.general.Background; |
||||
import com.fr.general.Inter; |
||||
|
||||
import java.util.LinkedHashMap; |
||||
import java.util.Map; |
||||
import java.util.Set; |
||||
|
||||
/** |
||||
* Created by richie on 16/5/18. |
||||
*/ |
||||
public class BackgroundFactory { |
||||
|
||||
private static Map<Class<? extends Background>, BackgroundUIWrapper> map = new LinkedHashMap<>(); |
||||
private static Map<Class<? extends Background>, BackgroundUIWrapper> browser = new LinkedHashMap<>(); |
||||
|
||||
static { |
||||
registerUniversal(map); |
||||
registerImageBackground(map); |
||||
registerUniversal(browser); |
||||
registerBrowserImageBackground(browser); |
||||
registerExtra(map); |
||||
registerExtra(browser); |
||||
} |
||||
|
||||
private static void registerUniversal(Map<Class<? extends Background>, BackgroundUIWrapper> map) { |
||||
map.put(null, BackgroundUIWrapper.create() |
||||
.setType(NullBackgroundPane.class).setTitle(Inter.getLocText("Background-Null"))); |
||||
map.put(ColorBackground.class, BackgroundUIWrapper.create() |
||||
.setType(ColorBackgroundPane.class).setTitle(Inter.getLocText("Color"))); |
||||
map.put(TextureBackground.class, BackgroundUIWrapper.create() |
||||
.setType(TextureBackgroundPane.class).setTitle(Inter.getLocText("Background-Texture"))); |
||||
map.put(PatternBackground.class, BackgroundUIWrapper.create() |
||||
.setType(PatternBackgroundPane.class).setTitle(Inter.getLocText("Background-Pattern"))); |
||||
map.put(GradientBackground.class, BackgroundUIWrapper.create() |
||||
.setType(GradientBackgroundPane.class).setTitle(Inter.getLocText("Gradient-Color"))); |
||||
} |
||||
|
||||
private static void registerImageBackground(Map<Class<? extends Background>, BackgroundUIWrapper> map) { |
||||
map.put(ImageBackground.class, BackgroundUIWrapper.create() |
||||
.setType(ImageBackgroundPane.class).setTitle(Inter.getLocText("Image"))); |
||||
} |
||||
|
||||
private static void registerBrowserImageBackground(Map<Class<? extends Background>, BackgroundUIWrapper> map) { |
||||
map.put(ImageBackground.class, BackgroundUIWrapper.create() |
||||
.setType(ImageBackgroundPane4Browser.class).setTitle(Inter.getLocText("Image"))); |
||||
} |
||||
|
||||
private static void registerExtra(Map<Class<? extends Background>, BackgroundUIWrapper> map) { |
||||
for (BackgroundUIProvider provider : ExtraDesignClassManager.getInstance().getBackgroundUIProviders()) { |
||||
map.put(provider.targetClass(), BackgroundUIWrapper.create() |
||||
.setType(provider.targetUIClass()).setTitle(provider.targetTitle())); |
||||
} |
||||
} |
||||
|
||||
|
||||
public static Set<Class<? extends Background>> kindsOfKey() { |
||||
return map.keySet(); |
||||
} |
||||
|
||||
public static BackgroundUIWrapper getWrapper(Class<? extends Background> category) { |
||||
return map.get(category); |
||||
} |
||||
|
||||
public static BackgroundDetailPane createIfAbsent(Class<? extends Background> category) { |
||||
BackgroundUIWrapper wrapper = map.get(category); |
||||
return createByWrapper(wrapper); |
||||
} |
||||
|
||||
public static BackgroundDetailPane createIfAbsent(int index) { |
||||
for (BackgroundUIWrapper wrapper : map.values()) { |
||||
if (wrapper.getIndex() == index) { |
||||
return createByWrapper(wrapper); |
||||
} |
||||
} |
||||
return new NullBackgroundPane(); |
||||
} |
||||
|
||||
public static Set<Class<? extends Background>> browserKindsOfKey() { |
||||
return browser.keySet(); |
||||
} |
||||
|
||||
public static BackgroundUIWrapper getBrowserWrapper(Class<? extends Background> category) { |
||||
return browser.get(category); |
||||
} |
||||
|
||||
public static BackgroundDetailPane createBrowserIfAbsent(Class<? extends Background> category) { |
||||
BackgroundUIWrapper wrapper = browser.get(category); |
||||
return createByWrapper(wrapper); |
||||
} |
||||
|
||||
public static BackgroundDetailPane createBrowserIfAbsent(int index) { |
||||
for (BackgroundUIWrapper wrapper : browser.values()) { |
||||
if (wrapper.getIndex() == index) { |
||||
return createByWrapper(wrapper); |
||||
} |
||||
} |
||||
return new NullBackgroundPane(); |
||||
} |
||||
|
||||
private static BackgroundDetailPane createByWrapper(BackgroundUIWrapper wrapper) { |
||||
Class<? extends BackgroundDetailPane> clazz = wrapper.getType(); |
||||
if (clazz == null) { |
||||
clazz = NullBackgroundPane.class; |
||||
} |
||||
BackgroundDetailPane quickPane; |
||||
try { |
||||
quickPane = clazz.newInstance(); |
||||
} catch (Exception e) { |
||||
quickPane = new NullBackgroundPane(); |
||||
} |
||||
return quickPane; |
||||
} |
||||
} |
@ -0,0 +1,51 @@
|
||||
package com.fr.design.style.background; |
||||
|
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.general.Background; |
||||
import com.fr.general.Inter; |
||||
|
||||
/** |
||||
* Created by richie on 16/5/18. |
||||
*/ |
||||
public class BackgroundPane4Browser extends BackgroundPane { |
||||
|
||||
public BackgroundPane4Browser() { |
||||
super(); |
||||
} |
||||
|
||||
protected void initTabPane() { |
||||
int index = 0; |
||||
for (Class<? extends Background> key : BackgroundFactory.browserKindsOfKey()) { |
||||
BackgroundUIWrapper wrapper = BackgroundFactory.getBrowserWrapper(key); |
||||
wrapper.setIndex(index++); |
||||
tabbedPane.addTab(Inter.getLocText(wrapper.getTitle()), FRGUIPaneFactory.createY_AXISBoxInnerContainer_L_Pane()); |
||||
} |
||||
} |
||||
|
||||
protected BackgroundUIWrapper getBackgroundUIWrapper(Background background) { |
||||
return BackgroundFactory.getBrowserWrapper(background == null ? null : background.getClass()); |
||||
} |
||||
|
||||
protected BackgroundDetailPane getTabItemPane(Background background, int index) { |
||||
BackgroundDetailPane quickPane = cacheMap.get(index); |
||||
if (quickPane == null) { |
||||
quickPane = BackgroundFactory.createBrowserIfAbsent(background == null ? null : background.getClass()); |
||||
quickPane.addChangeListener(backgroundChangeListener); |
||||
cacheMap.put(index, quickPane); |
||||
} |
||||
tabbedPane.setComponentAt(index, quickPane); |
||||
tabbedPane.setSelectedIndex(index); |
||||
return quickPane; |
||||
} |
||||
|
||||
protected BackgroundDetailPane getTabItemPaneByIndex(int index) { |
||||
BackgroundDetailPane quickPane = cacheMap.get(index); |
||||
if (quickPane == null) { |
||||
quickPane = BackgroundFactory.createBrowserIfAbsent(index); |
||||
tabbedPane.setComponentAt(index, quickPane); |
||||
cacheMap.put(index, quickPane); |
||||
quickPane.addChangeListener(backgroundChangeListener); |
||||
} |
||||
return quickPane; |
||||
} |
||||
} |
@ -0,0 +1,49 @@
|
||||
package com.fr.design.style.background; |
||||
|
||||
/** |
||||
* Created by richie on 16/5/18. |
||||
*/ |
||||
public class BackgroundUIWrapper { |
||||
|
||||
public static BackgroundUIWrapper create() { |
||||
return new BackgroundUIWrapper(); |
||||
} |
||||
|
||||
private int index = -1; |
||||
private String title; |
||||
private Class<? extends BackgroundDetailPane> clazz; |
||||
|
||||
private BackgroundUIWrapper() { |
||||
|
||||
} |
||||
|
||||
public Class<? extends BackgroundDetailPane> getType() { |
||||
return clazz; |
||||
} |
||||
|
||||
public BackgroundUIWrapper setType(Class<? extends BackgroundDetailPane> clazz) { |
||||
this.clazz = clazz; |
||||
return this; |
||||
} |
||||
|
||||
public String getTitle() { |
||||
return title; |
||||
} |
||||
|
||||
public BackgroundUIWrapper setTitle(String title) { |
||||
this.title = title; |
||||
return this; |
||||
} |
||||
|
||||
public int getIndex() { |
||||
return index; |
||||
} |
||||
|
||||
|
||||
public BackgroundUIWrapper setIndex(int index) { |
||||
if (this.index == -1) { |
||||
this.index = index; |
||||
} |
||||
return this; |
||||
} |
||||
} |
@ -0,0 +1,46 @@
|
||||
package com.fr.design.style.background.impl; |
||||
|
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.design.style.background.BackgroundDetailPane; |
||||
|
||||
import javax.swing.*; |
||||
import java.awt.*; |
||||
|
||||
/** |
||||
* Created by richie on 16/5/18. |
||||
*/ |
||||
public abstract class BPane extends BackgroundDetailPane { |
||||
|
||||
public BPane(int nColumn) { |
||||
this.initComponents(nColumn); |
||||
} |
||||
|
||||
private void initComponents(int nColumn) { |
||||
this.setLayout(FRGUIPaneFactory.createBorderLayout()); |
||||
this.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4)); |
||||
|
||||
JPanel contentPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_S_Pane(); |
||||
this.add(contentPane, BorderLayout.NORTH); |
||||
// contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.Y_AXIS));
|
||||
|
||||
// type type.
|
||||
|
||||
JPanel typePane = FRGUIPaneFactory.createTitledBorderPane(titleOfTypePane()); |
||||
contentPane.add(typePane); |
||||
JPanel typePane2 = new JPanel(); |
||||
typePane.add(typePane2); |
||||
typePane2.setLayout(layoutOfTypePane(nColumn)); |
||||
setChildrenOfTypePane(typePane2); |
||||
|
||||
setChildrenOfContentPane(contentPane); |
||||
} |
||||
|
||||
protected abstract String titleOfTypePane(); |
||||
|
||||
protected abstract LayoutManager layoutOfTypePane(int nColumn); |
||||
|
||||
protected abstract void setChildrenOfTypePane(JPanel typePane2); |
||||
|
||||
protected void setChildrenOfContentPane(JPanel contentPane) { |
||||
} |
||||
} |
@ -0,0 +1,42 @@
|
||||
package com.fr.design.style.background.impl; |
||||
|
||||
import com.fr.base.background.ColorBackground; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.design.style.background.BackgroundDetailPane; |
||||
import com.fr.design.style.color.DetailColorSelectPane; |
||||
import com.fr.general.Background; |
||||
|
||||
import javax.swing.event.ChangeListener; |
||||
import java.awt.*; |
||||
|
||||
/** |
||||
* Color background pane. |
||||
*/ |
||||
public class ColorBackgroundPane extends BackgroundDetailPane { |
||||
|
||||
private DetailColorSelectPane detailColorSelectPane; |
||||
|
||||
public ColorBackgroundPane() { |
||||
this.setLayout(FRGUIPaneFactory.createBorderLayout()); |
||||
|
||||
detailColorSelectPane = new DetailColorSelectPane(); |
||||
this.add(detailColorSelectPane, BorderLayout.CENTER); |
||||
} |
||||
|
||||
public void populate(Background background) { |
||||
if (background instanceof ColorBackground) { |
||||
ColorBackground colorBackgroud = (ColorBackground) background; |
||||
this.detailColorSelectPane.populate(colorBackgroud.getColor()); |
||||
} else { |
||||
this.detailColorSelectPane.populate(Color.white); |
||||
} |
||||
} |
||||
|
||||
public Background update() throws Exception { |
||||
return ColorBackground.getInstance(this.detailColorSelectPane.update()); |
||||
} |
||||
|
||||
public void addChangeListener(ChangeListener changeListener) { |
||||
detailColorSelectPane.addChangeListener(changeListener); |
||||
} |
||||
} |
@ -0,0 +1,230 @@
|
||||
package com.fr.design.style.background.impl; |
||||
|
||||
import com.fr.base.BaseUtils; |
||||
import com.fr.base.Style; |
||||
import com.fr.base.background.ImageBackground; |
||||
import com.fr.design.gui.ibutton.UIButton; |
||||
import com.fr.design.gui.ibutton.UIRadioButton; |
||||
import com.fr.design.gui.ilable.UILabel; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.design.style.background.BackgroundDetailPane; |
||||
import com.fr.design.style.background.image.ImageFileChooser; |
||||
import com.fr.design.style.background.image.ImagePreviewPane; |
||||
import com.fr.general.Background; |
||||
import com.fr.general.Inter; |
||||
import com.fr.stable.Constants; |
||||
import com.fr.stable.CoreGraphHelper; |
||||
|
||||
import javax.swing.*; |
||||
import javax.swing.event.ChangeEvent; |
||||
import javax.swing.event.ChangeListener; |
||||
import java.awt.*; |
||||
import java.awt.event.ActionEvent; |
||||
import java.awt.event.ActionListener; |
||||
import java.io.File; |
||||
|
||||
/** |
||||
* Image background pane. |
||||
*/ |
||||
public class ImageBackgroundPane extends BackgroundDetailPane { |
||||
|
||||
private ImagePreviewPane previewPane = null; |
||||
private Style imageStyle = null; |
||||
private ChangeListener changeListener = null; |
||||
private ImageFileChooser imageFileChooser = null; |
||||
private UILabel imageSizeLabel = new UILabel(); |
||||
|
||||
protected JRadioButton defaultRadioButton = null; |
||||
protected JRadioButton tiledRadioButton = null; |
||||
private JRadioButton extendRadioButton = null; |
||||
private JRadioButton adjustRadioButton = null; |
||||
|
||||
public ImageBackgroundPane() { |
||||
this.setLayout(FRGUIPaneFactory.createBorderLayout()); |
||||
|
||||
// preview pane
|
||||
JPanel previewContainerPane = FRGUIPaneFactory.createBorderLayout_L_Pane(); |
||||
this.add(previewContainerPane, BorderLayout.CENTER); |
||||
|
||||
JPanel previewOwnerPane = FRGUIPaneFactory.createTitledBorderPane(Inter.getLocText("Preview")); |
||||
previewOwnerPane.setLayout(new BorderLayout()); |
||||
previewContainerPane.add(previewOwnerPane, BorderLayout.CENTER); |
||||
|
||||
|
||||
previewPane = new ImagePreviewPane(); |
||||
previewOwnerPane.add(new JScrollPane(previewPane)); |
||||
previewPane.addChangeListener(imageSizeChangeListener); |
||||
|
||||
JPanel selectFilePane = FRGUIPaneFactory.createBorderLayout_L_Pane(); |
||||
previewContainerPane.add(selectFilePane, BorderLayout.EAST); |
||||
selectFilePane.setBorder(BorderFactory.createEmptyBorder(8, 2, 4, 0)); |
||||
|
||||
UIButton selectPictureButton = new UIButton( |
||||
Inter.getLocText("Image-Select_Picture")); |
||||
selectFilePane.add(selectPictureButton, BorderLayout.NORTH); |
||||
selectPictureButton.setMnemonic('S'); |
||||
selectPictureButton.addActionListener(selectPictureActionListener); |
||||
JPanel layoutPane = FRGUIPaneFactory.createMediumHGapHighTopFlowInnerContainer_M_Pane(); |
||||
selectFilePane.add(layoutPane, BorderLayout.CENTER); |
||||
|
||||
//布局
|
||||
defaultRadioButton = new UIRadioButton(Inter.getLocText("Default")); |
||||
tiledRadioButton = new UIRadioButton(Inter.getLocText("Image-Titled")); |
||||
extendRadioButton = new UIRadioButton(Inter.getLocText("Image-Extend")); |
||||
adjustRadioButton = new UIRadioButton(Inter.getLocText("Image-Adjust")); |
||||
|
||||
defaultRadioButton.addActionListener(layoutActionListener); |
||||
tiledRadioButton.addActionListener(layoutActionListener); |
||||
extendRadioButton.addActionListener(layoutActionListener); |
||||
adjustRadioButton.addActionListener(layoutActionListener); |
||||
|
||||
JPanel jp = new JPanel(new GridLayout(4, 1, 15, 15)); |
||||
for (JRadioButton button : imageLayoutButtons()) { |
||||
jp.add(button); |
||||
} |
||||
layoutPane.add(jp); |
||||
|
||||
ButtonGroup layoutBG = new ButtonGroup(); |
||||
layoutBG.add(defaultRadioButton); |
||||
layoutBG.add(tiledRadioButton); |
||||
layoutBG.add(extendRadioButton); |
||||
layoutBG.add(adjustRadioButton); |
||||
|
||||
defaultRadioButton.setSelected(true); |
||||
|
||||
// init image file chooser.
|
||||
imageFileChooser = new ImageFileChooser(); |
||||
imageFileChooser.setMultiSelectionEnabled(false); |
||||
} |
||||
|
||||
protected JRadioButton[] imageLayoutButtons() { |
||||
return new JRadioButton[]{ |
||||
defaultRadioButton, |
||||
tiledRadioButton, |
||||
extendRadioButton, |
||||
adjustRadioButton |
||||
}; |
||||
} |
||||
|
||||
/** |
||||
* Select picture. |
||||
*/ |
||||
ActionListener selectPictureActionListener = new ActionListener() { |
||||
|
||||
public void actionPerformed(ActionEvent evt) { |
||||
int returnVal = imageFileChooser.showOpenDialog(ImageBackgroundPane.this); |
||||
if (returnVal != JFileChooser.CANCEL_OPTION) { |
||||
File selectedFile = imageFileChooser.getSelectedFile(); |
||||
|
||||
if (selectedFile != null && selectedFile.isFile()) { |
||||
Image image = BaseUtils.readImage(selectedFile.getPath()); |
||||
CoreGraphHelper.waitForImage(image); |
||||
|
||||
previewPane.setImage(image); |
||||
setImageStyle(); |
||||
previewPane.setImageStyle(imageStyle); |
||||
previewPane.repaint(); |
||||
} else { |
||||
previewPane.setImage(null); |
||||
} |
||||
} |
||||
|
||||
fireChagneListener(); |
||||
} |
||||
}; |
||||
|
||||
private void setImageStyle() { |
||||
if (tiledRadioButton.isSelected()) { |
||||
imageStyle = Style.DEFAULT_STYLE.deriveImageLayout(Constants.IMAGE_TILED); |
||||
} else if (adjustRadioButton.isSelected()) { |
||||
imageStyle = Style.DEFAULT_STYLE.deriveImageLayout(Constants.IMAGE_ADJUST); |
||||
} else if (extendRadioButton.isSelected()) { |
||||
imageStyle = Style.DEFAULT_STYLE.deriveImageLayout(Constants.IMAGE_EXTEND); |
||||
} else { |
||||
imageStyle = Style.DEFAULT_STYLE.deriveImageLayout(Constants.IMAGE_CENTER); |
||||
} |
||||
} |
||||
|
||||
ActionListener layoutActionListener = new ActionListener() { |
||||
|
||||
public void actionPerformed(ActionEvent evt) { |
||||
setImageStyle(); |
||||
changeImageStyle(); |
||||
} |
||||
|
||||
private void changeImageStyle() { |
||||
previewPane.setImageStyle(ImageBackgroundPane.this.imageStyle); |
||||
previewPane.repaint(); |
||||
} |
||||
}; |
||||
|
||||
public void populate(Background background) { |
||||
|
||||
if (background instanceof ImageBackground) { |
||||
ImageBackground imageBackground = (ImageBackground) background; |
||||
|
||||
if (imageBackground.getLayout() == Constants.IMAGE_CENTER) { |
||||
defaultRadioButton.setSelected(true); |
||||
imageStyle = Style.DEFAULT_STYLE.deriveImageLayout(Constants.IMAGE_CENTER); |
||||
} else if (imageBackground.getLayout() == Constants.IMAGE_EXTEND) { |
||||
extendRadioButton.setSelected(true); |
||||
imageStyle = Style.DEFAULT_STYLE.deriveImageLayout(Constants.IMAGE_EXTEND); |
||||
} else if (imageBackground.getLayout() == Constants.IMAGE_ADJUST) { |
||||
adjustRadioButton.setSelected(true); |
||||
imageStyle = Style.DEFAULT_STYLE.deriveImageLayout(Constants.IMAGE_ADJUST); |
||||
} else { |
||||
tiledRadioButton.setSelected(true); |
||||
imageStyle = Style.DEFAULT_STYLE.deriveImageLayout(Constants.IMAGE_TILED); |
||||
} |
||||
|
||||
previewPane.setImageStyle(ImageBackgroundPane.this.imageStyle); |
||||
if (imageBackground.getImage() != null) { |
||||
previewPane.setImage(imageBackground.getImage()); |
||||
imageSizeLabel.setText(previewPane.getImage().getWidth(null) |
||||
+ " X " + previewPane.getImage().getHeight(null)); |
||||
} |
||||
|
||||
if (imageBackground.getImage() != null) { |
||||
previewPane.setImage(imageBackground.getImage()); |
||||
} |
||||
} else { |
||||
previewPane.setImage(null); |
||||
tiledRadioButton.setSelected(true); |
||||
|
||||
imageSizeLabel.setText(""); |
||||
} |
||||
|
||||
fireChagneListener(); |
||||
} |
||||
|
||||
public Background update() throws Exception { |
||||
ImageBackground imageBackground = new ImageBackground(previewPane.getImage()); |
||||
setImageStyle(); |
||||
imageBackground.setLayout(imageStyle.getImageLayout()); |
||||
return imageBackground; |
||||
} |
||||
|
||||
public void addChangeListener(ChangeListener changeListener) { |
||||
this.changeListener = changeListener; |
||||
} |
||||
|
||||
private void fireChagneListener() { |
||||
if (this.changeListener != null) { |
||||
ChangeEvent evt = new ChangeEvent(this); |
||||
this.changeListener.stateChanged(evt); |
||||
} |
||||
} |
||||
|
||||
ChangeListener imageSizeChangeListener = new ChangeListener() { |
||||
|
||||
public void stateChanged(ChangeEvent evt) { |
||||
Image image = ((ImagePreviewPane) evt.getSource()).getImage(); |
||||
|
||||
if (image == null) { |
||||
imageSizeLabel.setText(""); |
||||
} else { |
||||
imageSizeLabel.setText(Inter.getLocText(new String[]{"Size", "px"}, new String[]{": " + image.getWidth(null) + "x" + image.getHeight(null)})); |
||||
} |
||||
} |
||||
}; |
||||
} |
@ -0,0 +1,25 @@
|
||||
package com.fr.design.style.background.impl; |
||||
|
||||
import com.fr.stable.ArrayUtils; |
||||
|
||||
import javax.swing.*; |
||||
|
||||
/** |
||||
* Created by richie on 16/5/18. |
||||
*/ |
||||
public class ImageBackgroundPane4Browser extends ImageBackgroundPane { |
||||
|
||||
|
||||
public ImageBackgroundPane4Browser() { |
||||
super(); |
||||
} |
||||
|
||||
@Override |
||||
protected JRadioButton[] imageLayoutButtons() { |
||||
|
||||
return (JRadioButton[]) ArrayUtils.addAll(super.imageLayoutButtons(), new JRadioButton[] { |
||||
defaultRadioButton, |
||||
tiledRadioButton, |
||||
}); |
||||
} |
||||
} |
@ -0,0 +1,39 @@
|
||||
package com.fr.design.style.background.impl; |
||||
|
||||
import com.fr.design.gui.ilable.UILabel; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.design.style.background.BackgroundDetailPane; |
||||
import com.fr.design.utils.gui.GUICoreUtils; |
||||
import com.fr.general.Background; |
||||
import com.fr.general.Inter; |
||||
|
||||
import javax.swing.*; |
||||
import javax.swing.event.ChangeListener; |
||||
|
||||
/** |
||||
* Null background pane. |
||||
*/ |
||||
public class NullBackgroundPane extends BackgroundDetailPane { |
||||
|
||||
public NullBackgroundPane() { |
||||
this.setLayout(FRGUIPaneFactory.createBorderLayout()); |
||||
|
||||
UILabel centerLabel = new UILabel( |
||||
Inter.getLocText("Background-Background_is_NULL") + "..."); |
||||
this.add(centerLabel); |
||||
centerLabel.setHorizontalAlignment(SwingConstants.CENTER); |
||||
centerLabel.setBorder(BorderFactory.createLineBorder(GUICoreUtils.getTitleLineBorderColor())); |
||||
} |
||||
|
||||
public void populate(Background background) { |
||||
// do nothing.
|
||||
} |
||||
|
||||
public Background update() throws Exception { |
||||
return null; |
||||
} |
||||
|
||||
public void addChangeListener(ChangeListener changeListener) { |
||||
// do nothing.
|
||||
} |
||||
} |
@ -0,0 +1,208 @@
|
||||
package com.fr.design.style.background.impl; |
||||
|
||||
import com.fr.base.GraphHelper; |
||||
import com.fr.base.background.PatternBackground; |
||||
import com.fr.design.gui.ilable.UILabel; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.design.style.color.ColorSelectBox; |
||||
import com.fr.general.Background; |
||||
import com.fr.general.Inter; |
||||
|
||||
import javax.swing.*; |
||||
import javax.swing.event.ChangeEvent; |
||||
import javax.swing.event.ChangeListener; |
||||
import java.awt.*; |
||||
import java.awt.event.ActionEvent; |
||||
import java.awt.event.ActionListener; |
||||
import java.awt.geom.Rectangle2D; |
||||
|
||||
/** |
||||
* Pattern background pane. |
||||
*/ |
||||
public class PatternBackgroundPane extends BPane { |
||||
|
||||
private int patternIndex = 0; // pattern setIndex.
|
||||
protected ColorSelectBox foregroundColorPane; |
||||
protected ColorSelectBox backgroundColorPane; |
||||
private PatternButton[] patternButtonArray; |
||||
|
||||
public PatternBackgroundPane() { |
||||
super(12); |
||||
|
||||
foregroundColorPane.addSelectChangeListener(colorChangeListener); |
||||
backgroundColorPane.addSelectChangeListener(colorChangeListener); |
||||
} |
||||
|
||||
public PatternBackgroundPane(int nColumn) { |
||||
super(nColumn); |
||||
|
||||
if(foregroundColorPane != null) { |
||||
foregroundColorPane.addSelectChangeListener(colorChangeListener); |
||||
} |
||||
if(backgroundColorPane != null) { |
||||
backgroundColorPane.addSelectChangeListener(colorChangeListener); |
||||
} |
||||
} |
||||
|
||||
protected String titleOfTypePane() { |
||||
return Inter.getLocText("Background-Pattern"); |
||||
} |
||||
protected LayoutManager layoutOfTypePane(int nColumn) { |
||||
return FRGUIPaneFactory.createNColumnGridLayout(nColumn); |
||||
} |
||||
|
||||
protected void setChildrenOfTypePane(JPanel typePane2) { |
||||
ButtonGroup patternButtonGroup = new ButtonGroup(); |
||||
patternButtonArray = new PatternButton[PatternBackground.PATTERN_COUNT]; |
||||
for (int i = 0; i < PatternBackground.PATTERN_COUNT; i++) { |
||||
patternButtonArray[i] = new PatternButton(i); |
||||
patternButtonGroup.add(patternButtonArray[i]); |
||||
typePane2.add(patternButtonArray[i]); |
||||
} |
||||
} |
||||
|
||||
protected void setChildrenOfContentPane(JPanel contentPane) { |
||||
// colors
|
||||
JPanel colorPane = FRGUIPaneFactory.createTitledBorderPane(Inter.getLocText("Colors")); |
||||
contentPane.add(colorPane); |
||||
|
||||
foregroundColorPane = new ColorSelectBox(80); |
||||
backgroundColorPane = new ColorSelectBox(80); |
||||
foregroundColorPane.setSelectObject(Color.lightGray); |
||||
backgroundColorPane.setSelectObject(Color.black); |
||||
|
||||
colorPane.add(Box.createHorizontalStrut(2)); |
||||
colorPane.add(this.createLabelColorPane(Inter.getLocText("Foreground") |
||||
+ ":", foregroundColorPane)); |
||||
|
||||
colorPane.add(Box.createHorizontalStrut(8)); |
||||
|
||||
colorPane.add(this.createLabelColorPane(Inter.getLocText("Background") |
||||
+ ":", backgroundColorPane)); |
||||
} |
||||
|
||||
private JPanel createLabelColorPane(String text, |
||||
ColorSelectBox colorPane) { |
||||
JPanel labelColorPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); |
||||
labelColorPane.add(new UILabel(text)); |
||||
labelColorPane.add(colorPane); |
||||
|
||||
return labelColorPane; |
||||
} |
||||
|
||||
public void populate(Background background) { |
||||
if (background != null && background instanceof PatternBackground) { |
||||
PatternBackground patternBackground = (PatternBackground) background; |
||||
int patternIndex = patternBackground.getPatternIndex(); |
||||
|
||||
if (patternIndex >= 0 |
||||
&& patternIndex < this.patternButtonArray.length) { |
||||
this.patternButtonArray[patternIndex].setSelected(true); |
||||
this.patternIndex = patternIndex; |
||||
} else { |
||||
this.patternIndex = 0; |
||||
} |
||||
|
||||
foregroundColorPane.setSelectObject(patternBackground.getForeground()); |
||||
backgroundColorPane.setSelectObject(patternBackground.getBackground()); |
||||
} else { |
||||
patternIndex = 0; |
||||
this.patternButtonArray[0].setSelected(true); |
||||
|
||||
foregroundColorPane.setSelectObject(Color.lightGray); |
||||
backgroundColorPane.setSelectObject(Color.black); |
||||
} |
||||
} |
||||
|
||||
public Background update() throws Exception { |
||||
return new PatternBackground(patternIndex, foregroundColorPane.getSelectObject(), backgroundColorPane.getSelectObject()); |
||||
} |
||||
|
||||
public void addChangeListener(ChangeListener changeListener) { |
||||
foregroundColorPane.addSelectChangeListener(changeListener); |
||||
backgroundColorPane.addSelectChangeListener(changeListener); |
||||
|
||||
for (int i = 0; i < this.patternButtonArray.length; i++) { |
||||
this.patternButtonArray[i].addChangeListener(changeListener); |
||||
} |
||||
} |
||||
// Foreground or Background changed.
|
||||
ChangeListener colorChangeListener = new ChangeListener() { |
||||
|
||||
public void stateChanged(ChangeEvent e) { |
||||
for (int i = 0; i < patternButtonArray.length; i++) { |
||||
patternButtonArray[i].setPatternForeground(foregroundColorPane.getSelectObject()); |
||||
patternButtonArray[i].setPatternBackground(backgroundColorPane.getSelectObject()); |
||||
} |
||||
|
||||
PatternBackgroundPane.this.repaint();// repaint
|
||||
} |
||||
}; |
||||
|
||||
/** |
||||
* Pattern type button. |
||||
*/ |
||||
class PatternButton extends JToggleButton implements ActionListener { |
||||
|
||||
public PatternButton(int pIndex) { |
||||
this.pIndex = pIndex; |
||||
this.addActionListener(this); |
||||
|
||||
this.setCursor(new Cursor(Cursor.HAND_CURSOR)); |
||||
this.setBorder(null); |
||||
this.patternBackground = new PatternBackground(this.pIndex, |
||||
Color.lightGray, Color.black); |
||||
} |
||||
|
||||
public void paintComponent(Graphics g) { |
||||
Graphics2D g2d = (Graphics2D) g; |
||||
|
||||
Dimension d = getSize(); |
||||
this.patternBackground.paint(g2d, new Rectangle2D.Double(0, 0, |
||||
d.width - 1, d.height - 1)); |
||||
|
||||
if (this.pIndex == patternIndex) {// it's selected.
|
||||
g2d.setPaint(new Color(255, 51, 0)); |
||||
} else { |
||||
g2d.setPaint(Color.gray); |
||||
} |
||||
GraphHelper.draw(g2d, new Rectangle2D.Double(0, 0, d.width - 1, |
||||
d.height - 1)); |
||||
} |
||||
|
||||
public Dimension getPreferredSize() { |
||||
return new Dimension(24, 24); |
||||
} |
||||
|
||||
public void setPatternForeground(Color foreground) { |
||||
this.patternBackground.setForeground(foreground); |
||||
} |
||||
|
||||
public void setPatternBackground(Color background) { |
||||
this.patternBackground.setBackground(background); |
||||
} |
||||
|
||||
/** |
||||
* set Pattern setIndex. |
||||
*/ |
||||
public void actionPerformed(ActionEvent evt) { |
||||
PatternBackgroundPane.this.patternIndex = pIndex; |
||||
|
||||
fireChagneListener(); |
||||
PatternBackgroundPane.this.repaint();// repaint
|
||||
} |
||||
|
||||
public void addChangeListener(ChangeListener changeListener) { |
||||
this.changeListener = changeListener; |
||||
} |
||||
|
||||
private void fireChagneListener() { |
||||
if (this.changeListener != null) { |
||||
ChangeEvent evt = new ChangeEvent(this); |
||||
this.changeListener.stateChanged(evt); |
||||
} |
||||
} |
||||
private int pIndex = 0; |
||||
private PatternBackground patternBackground; |
||||
} |
||||
} |
@ -0,0 +1,24 @@
|
||||
package com.fr.design.style.background.impl; |
||||
|
||||
import com.fr.design.style.color.ColorSelectBox; |
||||
|
||||
import javax.swing.*; |
||||
import java.awt.*; |
||||
|
||||
/** |
||||
* Created by richie on 16/5/18. |
||||
*/ |
||||
public class PatternBackgroundPaneNoFore extends PatternBackgroundPane { |
||||
|
||||
public PatternBackgroundPaneNoFore(int nColumn) { |
||||
super(nColumn); |
||||
} |
||||
|
||||
// 重载 不加载两个前后按钮
|
||||
protected void setChildrenOfContentPane(JPanel contentPane) { |
||||
foregroundColorPane = new ColorSelectBox(80); |
||||
backgroundColorPane = new ColorSelectBox(80); |
||||
foregroundColorPane.setSelectObject(Color.lightGray); |
||||
backgroundColorPane.setSelectObject(Color.black); |
||||
} |
||||
} |
@ -0,0 +1,197 @@
|
||||
package com.fr.design.style.background.impl; |
||||
|
||||
import com.fr.base.GraphHelper; |
||||
import com.fr.base.background.TextureBackground; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.general.Background; |
||||
import com.fr.general.ComparatorUtils; |
||||
import com.fr.general.Inter; |
||||
|
||||
import javax.swing.*; |
||||
import javax.swing.event.ChangeEvent; |
||||
import javax.swing.event.ChangeListener; |
||||
import java.awt.*; |
||||
import java.awt.event.ActionEvent; |
||||
import java.awt.event.ActionListener; |
||||
import java.awt.geom.Rectangle2D; |
||||
|
||||
/** |
||||
* Texture background pane. TODO kunsnat: 拆出去. 真特么的长.. |
||||
*/ |
||||
public class TextureBackgroundPane extends BPane { |
||||
|
||||
private static final TexturePaint[] EMBED_TEXTURE_PAINT_ARRAY = new TexturePaint[]{ |
||||
TextureBackground.NEWSPRINT_TEXTURE_PAINT, |
||||
TextureBackground.RECYCLED_PAPER_TEXTURE_PAINT, |
||||
TextureBackground.PARCHMENT_TEXTURE_PAINT, |
||||
TextureBackground.STATIONERY_TEXTURE_PAINT, |
||||
TextureBackground.GREEN_MARBLE_TEXTURE_PAINT, |
||||
TextureBackground.WHITE_MARBLE_TEXTURE_PAINT, |
||||
TextureBackground.BROWN_MARBLE_TEXTURE_PAINT, |
||||
TextureBackground.GRANITE_TEXTURE_PAINT, |
||||
TextureBackground.BLUE_TISSUE_PAPER_TEXTURE_PAINT, |
||||
TextureBackground.PINK_TISSUE_PAPER_TEXTURE_PAINT, |
||||
TextureBackground.PURPLE_MESH_TEXTURE_PAINT, |
||||
TextureBackground.BOUQUET_TEXTURE_PAINT, |
||||
TextureBackground.PAPYRUS_TEXTURE_PAINT, |
||||
TextureBackground.CANVAS_TEXTURE_PAINT, |
||||
TextureBackground.DENIM_TEXTURE_PAINT, |
||||
TextureBackground.WOVEN_MAT_TEXTURE_PAINT, |
||||
TextureBackground.WATER_DROPLETS_TEXTURE_PAINT, |
||||
TextureBackground.PAPER_BAG_TEXTURE_PAINT, |
||||
TextureBackground.FISH_FOSSIL_TEXTURE_PAINT, |
||||
TextureBackground.SAND_TEXTURE_PAINT, |
||||
TextureBackground.CORK_TEXTURE_PAINT, |
||||
TextureBackground.WALNUT_TEXTURE_PAINT, |
||||
TextureBackground.OAK_TEXTURE_PAINT, |
||||
TextureBackground.MEDIUM_WOOD_TEXTURE_PAINT}; |
||||
|
||||
private static final String[] EMBED_TEXTURE_PAINT_DES_ARRAY = new String[]{ |
||||
Inter.getLocText("BackgroundTexture-Newsprint"), |
||||
Inter.getLocText("BackgroundTexture-RecycledPaper"), |
||||
Inter.getLocText("BackgroundTexture-Parchment"), |
||||
Inter.getLocText("BackgroundTexture-Stationery"), |
||||
Inter.getLocText("BackgroundTexture-GreenMarble"), |
||||
Inter.getLocText("BackgroundTexture-WhiteMarble"), |
||||
Inter.getLocText("BackgroundTexture-BrownMarble"), |
||||
Inter.getLocText("BackgroundTexture-Granite"), |
||||
Inter.getLocText("BackgroundTexture-BlueTissuePaper"), |
||||
Inter.getLocText("BackgroundTexture-PinkTissuePaper"), |
||||
Inter.getLocText("BackgroundTexture-PurpleMesh"), |
||||
Inter.getLocText("BackgroundTexture-Bouquet"), |
||||
Inter.getLocText("BackgroundTexture-Papyrus"), |
||||
Inter.getLocText("BackgroundTexture-Canvas"), |
||||
Inter.getLocText("BackgroundTexture-Denim"), |
||||
Inter.getLocText("BackgroundTexture-WovenMat"), |
||||
Inter.getLocText("BackgroundTexture-WaterDroplets"), |
||||
Inter.getLocText("BackgroundTexture-PaperBag"), |
||||
Inter.getLocText("BackgroundTexture-FishFossil"), |
||||
Inter.getLocText("BackgroundTexture-Sand"), |
||||
Inter.getLocText("BackgroundTexture-Cork"), |
||||
Inter.getLocText("BackgroundTexture-Walnut"), |
||||
Inter.getLocText("BackgroundTexture-Oak"), |
||||
Inter.getLocText("BackgroundTexture-MediumWood") |
||||
}; |
||||
|
||||
private TexturePaint texturePaint; |
||||
private TextureButton[] textureButtonArray; |
||||
|
||||
public TextureBackgroundPane() { |
||||
super(8);// 默认的.
|
||||
} |
||||
|
||||
public TextureBackgroundPane(int colum) { |
||||
super(colum);// 自定义的.
|
||||
} |
||||
|
||||
protected LayoutManager layoutOfTypePane(int nColumn) { |
||||
return FRGUIPaneFactory.createNColumnGridLayout(nColumn); |
||||
} |
||||
|
||||
protected String titleOfTypePane() { |
||||
return Inter.getLocText("Background-Texture"); |
||||
} |
||||
protected void setChildrenOfTypePane(JPanel typePane2) { |
||||
ButtonGroup patternButtonGroup = new ButtonGroup(); |
||||
textureButtonArray = new TextureButton[EMBED_TEXTURE_PAINT_ARRAY.length]; |
||||
for (int i = 0; i < EMBED_TEXTURE_PAINT_ARRAY.length; i++) { |
||||
textureButtonArray[i] = new TextureButton( |
||||
EMBED_TEXTURE_PAINT_ARRAY[i], EMBED_TEXTURE_PAINT_DES_ARRAY[i]); |
||||
patternButtonGroup.add(textureButtonArray[i]); |
||||
typePane2.add(textureButtonArray[i]); |
||||
} |
||||
} |
||||
|
||||
public void populate(Background background) { |
||||
if (background instanceof TextureBackground) { |
||||
TextureBackground textureBackground = (TextureBackground) background; |
||||
|
||||
this.texturePaint = textureBackground.getTexturePaint(); |
||||
|
||||
for (int i = 0; i < textureButtonArray.length; i++) { |
||||
if (ComparatorUtils.equals(textureButtonArray[i].getTexturePaint(), this.texturePaint)) { |
||||
textureButtonArray[i].setSelected(true); |
||||
break; |
||||
} |
||||
} |
||||
} else { |
||||
this.textureButtonArray[0].setSelected(true); |
||||
this.texturePaint = textureButtonArray[0].getTexturePaint(); |
||||
} |
||||
} |
||||
|
||||
public Background update() throws Exception { |
||||
return new TextureBackground(this.texturePaint); |
||||
} |
||||
|
||||
public void addChangeListener(ChangeListener changeListener) { |
||||
for (int i = 0; i < this.textureButtonArray.length; i++) { |
||||
this.textureButtonArray[i].addChangeListener(changeListener); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* Texture type button. |
||||
*/ |
||||
class TextureButton extends JToggleButton implements ActionListener { |
||||
|
||||
private TexturePaint buttonTexturePaint; |
||||
|
||||
public TextureButton(TexturePaint buttonTexturePaint, String tooltip) { |
||||
this.buttonTexturePaint = buttonTexturePaint; |
||||
this.setToolTipText(tooltip); |
||||
|
||||
this.setCursor(new Cursor(Cursor.HAND_CURSOR)); |
||||
this.addActionListener(this); |
||||
this.setBorder(null); |
||||
} |
||||
|
||||
public void paintComponent(Graphics g) { |
||||
Graphics2D g2d = (Graphics2D) g; |
||||
|
||||
Dimension d = getSize(); |
||||
|
||||
g2d.setPaint(this.buttonTexturePaint); |
||||
GraphHelper.fill(g2d, new Rectangle2D.Double(0, 0, d.width - 1, |
||||
d.height - 1)); |
||||
|
||||
if (ComparatorUtils.equals(texturePaint, this.buttonTexturePaint)) {// it's
|
||||
// selected.
|
||||
g2d.setPaint(Color.black); |
||||
} else { |
||||
g2d.setPaint(Color.gray); |
||||
} |
||||
GraphHelper.draw(g2d, new Rectangle2D.Double(0, 0, d.width - 1, |
||||
d.height - 1)); |
||||
} |
||||
|
||||
public Dimension getPreferredSize() { |
||||
return new Dimension(36, 32); |
||||
} |
||||
|
||||
public TexturePaint getTexturePaint() { |
||||
return this.buttonTexturePaint; |
||||
} |
||||
|
||||
/** |
||||
* set Pattern setIndex. |
||||
*/ |
||||
public void actionPerformed(ActionEvent evt) { |
||||
TextureBackgroundPane.this.texturePaint = this.getTexturePaint(); |
||||
|
||||
fireChagneListener(); |
||||
TextureBackgroundPane.this.repaint(); // repaint.
|
||||
} |
||||
|
||||
public void addChangeListener(ChangeListener changeListener) { |
||||
this.changeListener = changeListener; |
||||
} |
||||
|
||||
private void fireChagneListener() { |
||||
if (this.changeListener != null) { |
||||
ChangeEvent evt = new ChangeEvent(this); |
||||
this.changeListener.stateChanged(evt); |
||||
} |
||||
} |
||||
} |
||||
} |
Loading…
Reference in new issue