|
|
@ -4,6 +4,7 @@ import com.fr.base.BaseUtils; |
|
|
|
import com.fr.base.chart.chartdata.TopDefinitionProvider; |
|
|
|
import com.fr.base.chart.chartdata.TopDefinitionProvider; |
|
|
|
import com.fr.chart.chartattr.Bar2DPlot; |
|
|
|
import com.fr.chart.chartattr.Bar2DPlot; |
|
|
|
import com.fr.chart.chartattr.ChartCollection; |
|
|
|
import com.fr.chart.chartattr.ChartCollection; |
|
|
|
|
|
|
|
import com.fr.chart.chartattr.Plot; |
|
|
|
import com.fr.chart.chartdata.NormalTableDataDefinition; |
|
|
|
import com.fr.chart.chartdata.NormalTableDataDefinition; |
|
|
|
import com.fr.design.event.UIObserver; |
|
|
|
import com.fr.design.event.UIObserver; |
|
|
|
import com.fr.design.event.UIObserverListener; |
|
|
|
import com.fr.design.event.UIObserverListener; |
|
|
@ -26,212 +27,230 @@ import java.util.List; |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
* 多分类轴 的数据集定义界面. |
|
|
|
* 多分类轴 的数据集定义界面. |
|
|
|
|
|
|
|
* |
|
|
|
* @author kunsnat E-mail:kunsnat@gmail.com |
|
|
|
* @author kunsnat E-mail:kunsnat@gmail.com |
|
|
|
* @version 创建时间:2013-9-3 上午10:00:28 |
|
|
|
* @version 创建时间:2013-9-3 上午10:00:28 |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
public class CategoryPlotMoreCateTableDataContentPane extends CategoryPlotTableDataContentPane implements UIObserver{ |
|
|
|
public class CategoryPlotMoreCateTableDataContentPane extends CategoryPlotTableDataContentPane implements UIObserver { |
|
|
|
private static final long serialVersionUID = -3305681053750642843L; |
|
|
|
private static final long serialVersionUID = -3305681053750642843L; |
|
|
|
private static final int COMBOX_GAP = 8; |
|
|
|
private static final int COMBOX_GAP = 8; |
|
|
|
private static final int COMBOX_WIDTH = 95; |
|
|
|
private static final int COMBOX_WIDTH = 95; |
|
|
|
private static final int COMBOX_HEIGHT = 20; |
|
|
|
private static final int COMBOX_HEIGHT = 20; |
|
|
|
|
|
|
|
|
|
|
|
private JPanel boxPane; |
|
|
|
private JPanel boxPane; |
|
|
|
|
|
|
|
|
|
|
|
private ArrayList<UIComboBox> boxList = new ArrayList<UIComboBox>(); |
|
|
|
private ArrayList<UIComboBox> boxList = new ArrayList<UIComboBox>(); |
|
|
|
private UIButton addButton; |
|
|
|
private UIButton addButton; |
|
|
|
|
|
|
|
|
|
|
|
private UIObserverListener uiobListener = null; |
|
|
|
private UIObserverListener uiobListener = null; |
|
|
|
|
|
|
|
|
|
|
|
public CategoryPlotMoreCateTableDataContentPane() { |
|
|
|
public List<UIComboBox> getBoxList() { |
|
|
|
// do nothing
|
|
|
|
return boxList; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public CategoryPlotMoreCateTableDataContentPane() { |
|
|
|
|
|
|
|
// do nothing
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public CategoryPlotMoreCateTableDataContentPane(ChartDataPane parent) { |
|
|
|
public CategoryPlotMoreCateTableDataContentPane(ChartDataPane parent) { |
|
|
|
categoryCombox = new UIComboBox(); |
|
|
|
categoryCombox = new UIComboBox(); |
|
|
|
categoryCombox.setPreferredSize(new Dimension(COMBOX_WIDTH,COMBOX_HEIGHT)); |
|
|
|
categoryCombox.setPreferredSize(new Dimension(COMBOX_WIDTH,COMBOX_HEIGHT)); |
|
|
|
|
|
|
|
|
|
|
|
JPanel categoryPane = new JPanel(new BorderLayout(4,0)); |
|
|
|
JPanel categoryPane = new JPanel(new BorderLayout(4, 0)); |
|
|
|
categoryPane.setBorder(BorderFactory.createMatteBorder(0, 0, 6, 1, getBackground())); |
|
|
|
categoryPane.setBorder(BorderFactory.createMatteBorder(0, 0, 6, 1, getBackground())); |
|
|
|
UILabel categoryLabel = new BoldFontTextLabel(Inter.getLocText("FR-Chart-Category_Name")) ; |
|
|
|
UILabel categoryLabel = new BoldFontTextLabel(Inter.getLocText("FR-Chart-Category_Name")); |
|
|
|
categoryLabel.setPreferredSize(new Dimension(85,COMBOX_HEIGHT)); |
|
|
|
categoryLabel.setPreferredSize(new Dimension(85,COMBOX_HEIGHT)); |
|
|
|
|
|
|
|
|
|
|
|
addButton = new UIButton(BaseUtils.readIcon("/com/fr/design/images/buttonicon/add.png")); |
|
|
|
addButton = new UIButton(BaseUtils.readIcon("/com/fr/design/images/buttonicon/add.png")); |
|
|
|
addButton.setPreferredSize(new Dimension(20, COMBOX_HEIGHT)); |
|
|
|
addButton.setPreferredSize(new Dimension(20, COMBOX_HEIGHT)); |
|
|
|
|
|
|
|
|
|
|
|
categoryPane.add(GUICoreUtils.createBorderLayoutPane(new Component[]{categoryCombox, addButton,null,categoryLabel,null})); |
|
|
|
categoryPane.add(GUICoreUtils.createBorderLayoutPane(new Component[]{categoryCombox, addButton, null, categoryLabel, null})); |
|
|
|
categoryPane.setBorder(BorderFactory.createEmptyBorder(0,24,10,15)); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
categoryPane.setBorder(BorderFactory.createEmptyBorder(0,24,10,15)); |
|
|
|
|
|
|
|
|
|
|
|
boxPane = new JPanel(); |
|
|
|
boxPane = new JPanel(); |
|
|
|
boxPane.setLayout(new BoxLayout(boxPane, BoxLayout.Y_AXIS)); |
|
|
|
boxPane.setLayout(new BoxLayout(boxPane, BoxLayout.Y_AXIS)); |
|
|
|
|
|
|
|
|
|
|
|
categoryPane.add(boxPane, BorderLayout.SOUTH); |
|
|
|
categoryPane.add(boxPane, BorderLayout.SOUTH); |
|
|
|
|
|
|
|
|
|
|
|
this.setLayout(new BorderLayout()); |
|
|
|
this.setLayout(new BorderLayout()); |
|
|
|
this.add(categoryPane, BorderLayout.NORTH); |
|
|
|
this.add(categoryPane, BorderLayout.NORTH); |
|
|
|
this.add(getJSeparator()); |
|
|
|
this.add(getJSeparator()); |
|
|
|
seriesTypeComboxPane = new SeriesTypeUseComboxPane(parent, new Bar2DPlot()); |
|
|
|
seriesTypeComboxPane = new SeriesTypeUseComboxPane(parent, new Bar2DPlot()); |
|
|
|
this.add(seriesTypeComboxPane, BorderLayout.SOUTH); |
|
|
|
this.add(seriesTypeComboxPane, BorderLayout.SOUTH); |
|
|
|
|
|
|
|
|
|
|
|
addButton.addActionListener(new ActionListener() { |
|
|
|
addButton.addActionListener(new ActionListener() { |
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public void actionPerformed(ActionEvent e) { |
|
|
|
public void actionPerformed(ActionEvent e) { |
|
|
|
if(boxList.size() < 2) { |
|
|
|
if (boxList.size() < 2) { |
|
|
|
addNewCombox(); |
|
|
|
addNewCombox(); |
|
|
|
relayoutPane(); |
|
|
|
relayoutPane(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
checkSeriseUse(categoryCombox.getSelectedItem() != null); |
|
|
|
checkSeriseUse(categoryCombox.getSelectedItem() != null); |
|
|
|
} |
|
|
|
} |
|
|
|
}); |
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
categoryCombox.addItemListener(new ItemListener() { |
|
|
|
categoryCombox.addItemListener(new ItemListener() { |
|
|
|
public void itemStateChanged(ItemEvent e) { |
|
|
|
public void itemStateChanged(ItemEvent e) { |
|
|
|
checkSeriseUse(categoryCombox.getSelectedItem() != null); |
|
|
|
checkSeriseUse(categoryCombox.getSelectedItem() != null); |
|
|
|
makeToolTipUse(categoryCombox); |
|
|
|
makeToolTipUse(categoryCombox); |
|
|
|
|
|
|
|
|
|
|
|
checkAddButton(); |
|
|
|
checkComponent(); |
|
|
|
} |
|
|
|
} |
|
|
|
}); |
|
|
|
}); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
protected void checkSeriseUse(boolean hasUse) { |
|
|
|
protected void checkSeriseUse(boolean hasUse) { |
|
|
|
super.checkSeriseUse(hasUse); |
|
|
|
super.checkSeriseUse(hasUse); |
|
|
|
|
|
|
|
|
|
|
|
addButton.setEnabled(hasUse); |
|
|
|
addButton.setEnabled(hasUse); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private UIComboBox addNewCombox() { |
|
|
|
private UIComboBox addNewCombox() { |
|
|
|
final JPanel buttonPane = new JPanel(); |
|
|
|
final JPanel buttonPane = new JPanel(); |
|
|
|
buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT, 0, 2)); |
|
|
|
buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT, 0, 2)); |
|
|
|
|
|
|
|
|
|
|
|
final UIComboBox combox = new UIComboBox(); |
|
|
|
final UIComboBox combox = new UIComboBox(); |
|
|
|
combox.setPreferredSize(new Dimension(COMBOX_WIDTH, COMBOX_HEIGHT)); |
|
|
|
combox.setPreferredSize(new Dimension(COMBOX_WIDTH, COMBOX_HEIGHT)); |
|
|
|
|
|
|
|
|
|
|
|
int count = categoryCombox.getItemCount(); |
|
|
|
int count = categoryCombox.getItemCount(); |
|
|
|
for(int i = 0; i < count; i++) { |
|
|
|
for (int i = 0; i < count; i++) { |
|
|
|
combox.addItem(categoryCombox.getItemAt(i)); |
|
|
|
combox.addItem(categoryCombox.getItemAt(i)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
combox.registerChangeListener(uiobListener); |
|
|
|
combox.registerChangeListener(uiobListener); |
|
|
|
combox.addItemListener(new ItemListener() { |
|
|
|
combox.addItemListener(new ItemListener() { |
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public void itemStateChanged(ItemEvent e) { |
|
|
|
public void itemStateChanged(ItemEvent e) { |
|
|
|
makeToolTipUse(combox); |
|
|
|
makeToolTipUse(combox); |
|
|
|
} |
|
|
|
} |
|
|
|
}); |
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
combox.setSelectedItem(categoryCombox.getItemAt(0)); |
|
|
|
combox.setSelectedItem(categoryCombox.getItemAt(0)); |
|
|
|
makeToolTipUse(combox); |
|
|
|
makeToolTipUse(combox); |
|
|
|
|
|
|
|
|
|
|
|
buttonPane.add(combox); |
|
|
|
buttonPane.add(combox); |
|
|
|
UIButton delButton = new UIButton(BaseUtils.readIcon("com/fr/design/images/toolbarbtn/close.png")); |
|
|
|
UIButton delButton = new UIButton(BaseUtils.readIcon("com/fr/design/images/toolbarbtn/close.png")); |
|
|
|
buttonPane.add(delButton); |
|
|
|
buttonPane.add(delButton); |
|
|
|
boxPane.add(buttonPane); |
|
|
|
boxPane.add(buttonPane); |
|
|
|
boxList.add(combox); |
|
|
|
boxList.add(combox); |
|
|
|
|
|
|
|
|
|
|
|
checkAddButton(); |
|
|
|
checkComponent(); |
|
|
|
|
|
|
|
|
|
|
|
delButton.addActionListener(new ActionListener() { |
|
|
|
delButton.addActionListener(new ActionListener() { |
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public void actionPerformed(ActionEvent e) { |
|
|
|
public void actionPerformed(ActionEvent e) { |
|
|
|
boxPane.remove(buttonPane); |
|
|
|
boxPane.remove(buttonPane); |
|
|
|
boxList.remove(combox); |
|
|
|
boxList.remove(combox); |
|
|
|
checkAddButton(); |
|
|
|
checkComponent(); |
|
|
|
relayoutPane(); |
|
|
|
relayoutPane(); |
|
|
|
} |
|
|
|
} |
|
|
|
}); |
|
|
|
}); |
|
|
|
delButton.registerChangeListener(uiobListener); |
|
|
|
delButton.registerChangeListener(uiobListener); |
|
|
|
|
|
|
|
|
|
|
|
return combox; |
|
|
|
return combox; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private void checkAddButton() { |
|
|
|
private void checkAddButton() { |
|
|
|
int size = boxList.size(); |
|
|
|
int size = boxList.size(); |
|
|
|
addButton.setEnabled(size < 2 && categoryCombox.getSelectedItem() != null); |
|
|
|
addButton.setEnabled(size < 2 && categoryCombox.getSelectedItem() != null); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private void relayoutPane() { |
|
|
|
protected void checkComponent() { |
|
|
|
this.revalidate(); |
|
|
|
checkAddButton(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private void relayoutPane() { |
|
|
|
/** |
|
|
|
this.revalidate(); |
|
|
|
*检查 某些Box是否可用 |
|
|
|
} |
|
|
|
* @param hasUse 是否使用. |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
public void checkBoxUse(boolean hasUse) { |
|
|
|
/** |
|
|
|
super.checkBoxUse(hasUse); |
|
|
|
* 检查 某些Box是否可用 |
|
|
|
|
|
|
|
* |
|
|
|
checkAddButton(); |
|
|
|
* @param hasUse 是否使用. |
|
|
|
} |
|
|
|
*/ |
|
|
|
|
|
|
|
public void checkBoxUse(boolean hasUse) { |
|
|
|
|
|
|
|
super.checkBoxUse(hasUse); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
checkComponent(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
protected void refreshBoxListWithSelectTableData(List list) { |
|
|
|
protected void refreshBoxListWithSelectTableData(List list) { |
|
|
|
super.refreshBoxListWithSelectTableData(list); |
|
|
|
super.refreshBoxListWithSelectTableData(list); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (int i = 0, size = boxList.size(); i < size; i++) { |
|
|
|
|
|
|
|
refreshBoxItems(boxList.get(i), list); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* 给组件登记一个观察者监听事件 |
|
|
|
|
|
|
|
* |
|
|
|
|
|
|
|
* @param listener 观察者监听事件 |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
public void registerChangeListener(UIObserverListener listener) { |
|
|
|
|
|
|
|
uiobListener = listener; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* 组件是否需要响应添加的观察者事件 |
|
|
|
|
|
|
|
* |
|
|
|
|
|
|
|
* @return 如果需要响应观察者事件则返回true,否则返回false |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
public boolean shouldResponseChangeListener() { |
|
|
|
|
|
|
|
return true; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* 更新 多分类相关界面 |
|
|
|
|
|
|
|
* |
|
|
|
|
|
|
|
* @param collection |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
public void populateBean(ChartCollection collection) { |
|
|
|
|
|
|
|
super.populateBean(collection); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
boxList.clear(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
TopDefinitionProvider top = collection.getSelectedChart().getFilterDefinition(); |
|
|
|
|
|
|
|
if (top instanceof NormalTableDataDefinition) { |
|
|
|
|
|
|
|
NormalTableDataDefinition normal = (NormalTableDataDefinition) top; |
|
|
|
|
|
|
|
int size = normal.getMoreCateSize(); |
|
|
|
|
|
|
|
for (int i = 0; i < size; i++) { |
|
|
|
|
|
|
|
UIComboBox box = addNewCombox(); |
|
|
|
|
|
|
|
box.setSelectedItem(normal.getMoreCateWithIndex(i)); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
checkAddButton(); |
|
|
|
|
|
|
|
checkSeriseUse(categoryCombox.getSelectedItem() != null); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* 保存多分类界面到collection |
|
|
|
|
|
|
|
* |
|
|
|
|
|
|
|
* @param collection |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
public void updateBean(ChartCollection collection) { |
|
|
|
|
|
|
|
super.updateBean(collection); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
TopDefinitionProvider top = collection.getSelectedChart().getFilterDefinition(); |
|
|
|
|
|
|
|
Plot plot = collection.getSelectedChart().getPlot(); |
|
|
|
|
|
|
|
if (top instanceof NormalTableDataDefinition) { |
|
|
|
|
|
|
|
NormalTableDataDefinition normal = (NormalTableDataDefinition) top; |
|
|
|
|
|
|
|
normal.clearMoreCate(); |
|
|
|
|
|
|
|
updateMoreCate(normal, plot); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
for(int i = 0, size = boxList.size(); i < size; i++) { |
|
|
|
protected void updateMoreCate(NormalTableDataDefinition normal, Plot plot) { |
|
|
|
refreshBoxItems(boxList.get(i), list); |
|
|
|
for (int i = 0, size = boxList.size(); i < size; i++) { |
|
|
|
} |
|
|
|
UIComboBox box = boxList.get(i); |
|
|
|
|
|
|
|
if (box.getSelectedItem() != null) { |
|
|
|
|
|
|
|
normal.addMoreCate(box.getSelectedItem().toString()); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* 给组件登记一个观察者监听事件 |
|
|
|
|
|
|
|
* |
|
|
|
|
|
|
|
* @param listener 观察者监听事件 |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
public void registerChangeListener(UIObserverListener listener) { |
|
|
|
|
|
|
|
uiobListener = listener; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* 组件是否需要响应添加的观察者事件 |
|
|
|
|
|
|
|
* |
|
|
|
|
|
|
|
* @return 如果需要响应观察者事件则返回true,否则返回false |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
public boolean shouldResponseChangeListener() { |
|
|
|
|
|
|
|
return true; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* 更新 多分类相关界面 |
|
|
|
|
|
|
|
* @param collection |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
public void populateBean(ChartCollection collection) { |
|
|
|
|
|
|
|
super.populateBean(collection); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
boxList.clear(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
TopDefinitionProvider top = collection.getSelectedChart().getFilterDefinition(); |
|
|
|
|
|
|
|
if(top instanceof NormalTableDataDefinition) { |
|
|
|
|
|
|
|
NormalTableDataDefinition normal = (NormalTableDataDefinition)top; |
|
|
|
|
|
|
|
int size = normal.getMoreCateSize(); |
|
|
|
|
|
|
|
for(int i = 0; i < size; i++) { |
|
|
|
|
|
|
|
UIComboBox box = addNewCombox(); |
|
|
|
|
|
|
|
box.setSelectedItem(normal.getMoreCateWithIndex(i)); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
checkAddButton(); |
|
|
|
|
|
|
|
checkSeriseUse(categoryCombox.getSelectedItem() != null); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* 保存多分类界面到collection |
|
|
|
|
|
|
|
* @param collection |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
public void updateBean(ChartCollection collection) { |
|
|
|
|
|
|
|
super.updateBean(collection); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
TopDefinitionProvider top = collection.getSelectedChart().getFilterDefinition(); |
|
|
|
|
|
|
|
if(top instanceof NormalTableDataDefinition) { |
|
|
|
|
|
|
|
NormalTableDataDefinition normal = (NormalTableDataDefinition)top; |
|
|
|
|
|
|
|
normal.clearMoreCate(); |
|
|
|
|
|
|
|
for(int i = 0, size = boxList.size(); i < size; i++) { |
|
|
|
|
|
|
|
UIComboBox box = boxList.get(i); |
|
|
|
|
|
|
|
if(box.getSelectedItem() != null) { |
|
|
|
|
|
|
|
normal.addMoreCate(box.getSelectedItem().toString()); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |