1 package jp.ac.aiit.xdf.component.swing.mappers;
3 import java.awt.Component;
4 import java.awt.Container;
7 import javax.swing.GroupLayout;
8 import javax.swing.JFrame;
9 import javax.swing.GroupLayout.Group;
11 import jp.ac.aiit.xdf.core.model.ObjectModel;
17 * Swing環境における padding, margin, follows の各属性を実現する。<br>
18 * また、非公式に autogap 属性をサポートする。この属性の値を、本FWではtrueを既定と定めるが、
19 * padding, marginに厳しいレイアウトを望む場合、これをfalseに設定すると良い。<br>
20 * (例)スタイル記述において「group{autogap:false;}」
22 public abstract class SwingLayoutingComponentMapperTemplate extends SwingComponentMapperTemplate {
25 protected void processingChildComponents() {
26 if( component instanceof Container ) {
27 for(ObjectModel child : model.children()) {
31 Container c = ( component instanceof JFrame ? ((JFrame) component).getContentPane() : (Container) component );
33 GroupLayout layout = new GroupLayout(c);
37 if(model.hasAttr("autogap") && "false".equals(model.attr("autogap"))){
38 //明示的に「false」設定された場合に限りfalse。
39 layout.setAutoCreateContainerGaps(false);
41 layout.setAutoCreateContainerGaps(true);
43 layout.setVerticalGroup( createVerticalGroup(layout) );
44 layout.setHorizontalGroup( createHorizontalGroup(layout) );
48 private Group createVerticalGroup(GroupLayout layout) {
49 Group vGroup = layout.createSequentialGroup( );
50 Group followGroup = null;
52 int ptop = Integer.valueOf( model.hasAttr("padding-top") ? (String) model.attr("padding-top") : "0" );
53 int pbottom = Integer.valueOf( model.hasAttr("padding-bottom") ? (String) model.attr("padding-bottom") : "0" );
56 for(ObjectModel child : model.children()) {
57 String pfollows = (String) child.attr("follows");
58 if( pfollows == null || !pfollows.equals("right") ) {
63 List<ObjectModel> children = model.children();
65 for(int i=0; i<children.size(); i++) {
66 ObjectModel child = children.get(i);
68 child.setRealize(false);
70 String follows = (String) child.attr("follows");
72 if( follows != null && follows.equals("right") ) {
73 if( followGroup == null ) {
74 followGroup = layout.createParallelGroup();
75 vGroup.addGroup(followGroup);
77 addToVerticalGroup(followGroup, model, child, rowIndex == 0 ? ptop : 0, rowIndex == maxRow-1 ? pbottom : 0 );
78 } else if( followGroup != null ) {
79 addToVerticalGroup(followGroup, model, child, rowIndex == 0 ? ptop : 0, rowIndex == maxRow-1 ? pbottom : 0 );
82 addToVerticalGroup(vGroup, model, child, rowIndex == 0 ? ptop : 0, rowIndex == maxRow-1 ? pbottom : 0 );
86 child.setRealize(true);
92 private void addToVerticalGroup(Group g, ObjectModel parent, ObjectModel model, int ptop, int pbottom) {
93 int mtop = Integer.valueOf( model.hasAttr("margin-top") ? (String) model.attr("margin-top") : "0" );
94 int mbottom = Integer.valueOf( model.hasAttr("margin-bottom") ? (String) model.attr("margin-bottom") : "0" );
96 // System.out.println("DebugInfo:layout mtop[" + String.valueOf(mtop) +"] mbottom[" + String.valueOf(mbottom));
99 model.setRealize(true);
100 g.addComponent((Component) model.getComponent());
101 model.setRealize(false);
102 g.addGap(mbottom+pbottom);
106 private Group createHorizontalGroup(GroupLayout layout) {
107 Group hGroup = layout.createParallelGroup();
108 Group followGroup = null;
110 int pleft = Integer.valueOf( model.hasAttr("padding-left") ? (String) model.attr("padding-left") : "0" );
111 int pright = Integer.valueOf( model.hasAttr("padding-right") ? (String) model.attr("padding-right") : "0" );
113 for(ObjectModel child : model.children()) {
114 child.setRealize(false);
115 String follows = (String) child.attr("follows");
117 if( follows != null && follows.equals("right") ) {
118 //次の要素が右に並ぶ(ので、右パディングは適用しない)
120 if( followGroup == null ) {
121 //はじめてfollows=rightになった(左はじなので、左パディングを適用する)
122 followGroup = layout.createSequentialGroup();
123 hGroup.addGroup(followGroup);
126 addToHorizontalGroup(followGroup, model, child, leftPad, 0);
127 } else if( followGroup != null ) {
128 //follows=rightでなくなった(右はじ)ただ、followGroupがあるので左はじではない
129 addToHorizontalGroup(followGroup, model, child, 0, pright);
132 //follows=rightでなく、かつ左はじ
133 addToHorizontalGroup(hGroup, model, child, pleft, pright);
135 child.setRealize(true);
141 private void addToHorizontalGroup(Group g, ObjectModel parent, ObjectModel model, int pleft, int pright) {
142 int mleft = Integer.valueOf( model.hasAttr("margin-left") ? (String) model.attr("margin-left") : "0" );
143 int mright = Integer.valueOf( model.hasAttr("margin-right") ? (String) model.attr("margin-right") : "0" );
144 // System.out.println("DebugInfo:layout "+ model.tagname() +" mleft[" + String.valueOf(mleft) +"] mright[" + String.valueOf(mright) +"] pleft["+pleft+"] pright["+pright+"]");
146 g.addGap(mleft+pleft);
147 model.setRealize(true);
148 g.addComponent((Component) model.getComponent());
149 model.setRealize(false);
150 g.addGap(mright+pright);