OSDN Git Service

initial commit
[xdf/git-repos.git] / xdf-swing / src / main / java / jp / ac / aiit / xdf / component / swing / mappers / SwingLayoutingComponentMapperTemplate.java
1 package jp.ac.aiit.xdf.component.swing.mappers;
2
3 import java.awt.Component;
4 import java.awt.Container;
5 import java.util.List;
6
7 import javax.swing.GroupLayout;
8 import javax.swing.JFrame;
9 import javax.swing.GroupLayout.Group;
10
11 import jp.ac.aiit.xdf.core.model.ObjectModel;
12
13
14 /**
15  * @author Tagaki
16  * レイアウト管理マッパー<br>
17  * Swing環境における padding, margin, follows の各属性を実現する。<br>
18  * また、非公式に autogap 属性をサポートする。この属性の値を、本FWではtrueを既定と定めるが、
19  * padding, marginに厳しいレイアウトを望む場合、これをfalseに設定すると良い。<br>
20  * (例)スタイル記述において「group{autogap:false;}」
21  */
22 public abstract class SwingLayoutingComponentMapperTemplate extends SwingComponentMapperTemplate {
23
24         @Override
25         protected void processingChildComponents() {
26                 if( component instanceof Container ) {
27                         for(ObjectModel child : model.children()) {
28                                 child.realize();
29                         }
30                         
31                         Container c = ( component instanceof JFrame ? ((JFrame) component).getContentPane() : (Container) component );
32                         
33                         GroupLayout layout = new GroupLayout(c);
34                         c.setLayout(layout);
35
36                         //autogap属性の処理
37                         if(model.hasAttr("autogap") && "false".equals(model.attr("autogap"))){
38                                 //明示的に「false」設定された場合に限りfalse。
39                                 layout.setAutoCreateContainerGaps(false);
40                         } else{ //既定的には true。
41                                 layout.setAutoCreateContainerGaps(true);
42                         }
43                         layout.setVerticalGroup( createVerticalGroup(layout) );
44                         layout.setHorizontalGroup( createHorizontalGroup(layout) );
45                 }
46         }
47
48         private Group createVerticalGroup(GroupLayout layout) {
49                 Group vGroup = layout.createSequentialGroup( );
50                 Group followGroup = null;
51                 
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" );
54                 
55                 int maxRow = 0;
56                 for(ObjectModel child : model.children()) {
57                         String pfollows = (String) child.attr("follows");
58                         if( pfollows == null || !pfollows.equals("right") ) {
59                                 maxRow++;
60                         }
61                 }
62                 
63                 List<ObjectModel> children = model.children();
64                 int rowIndex = 0;
65                 for(int i=0; i<children.size(); i++) {
66                         ObjectModel child = children.get(i);
67                         
68                         child.setRealize(false);
69                         
70                         String follows = (String) child.attr("follows");
71                         
72                         if( follows != null && follows.equals("right") ) {
73                                 if( followGroup == null ) {
74                                         followGroup = layout.createParallelGroup();
75                                         vGroup.addGroup(followGroup);
76                                 }
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 );
80                                 followGroup = null;
81                         } else {
82                                 addToVerticalGroup(vGroup, model, child, rowIndex == 0 ? ptop : 0, rowIndex == maxRow-1 ? pbottom : 0 );
83                                 rowIndex++;
84                         }
85                         
86                         child.setRealize(true);
87                 }
88                 
89                 return vGroup;
90         }
91         
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" );
95
96                 // System.out.println("DebugInfo:layout mtop[" + String.valueOf(mtop) +"]  mbottom[" + String.valueOf(mbottom));
97
98                 g.addGap(mtop+ptop);
99                 model.setRealize(true);
100                 g.addComponent((Component) model.getComponent());
101                 model.setRealize(false);
102                 g.addGap(mbottom+pbottom);
103         }
104         
105         
106         private Group createHorizontalGroup(GroupLayout layout) {
107                 Group hGroup = layout.createParallelGroup();
108                 Group followGroup = null;
109                 
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" );
112                 
113                 for(ObjectModel child : model.children()) {
114                         child.setRealize(false);
115                         String follows = (String) child.attr("follows");
116                         
117                         if( follows != null && follows.equals("right") ) {
118                                 //次の要素が右に並ぶ(ので、右パディングは適用しない)
119                                 int leftPad = 0;
120                                 if( followGroup == null ) {
121                                         //はじめてfollows=rightになった(左はじなので、左パディングを適用する)
122                                         followGroup = layout.createSequentialGroup();
123                                         hGroup.addGroup(followGroup);
124                                         leftPad = pleft;
125                                 }
126                                 addToHorizontalGroup(followGroup, model, child, leftPad, 0);
127                         } else if( followGroup != null ) {
128                                 //follows=rightでなくなった(右はじ)ただ、followGroupがあるので左はじではない
129                                 addToHorizontalGroup(followGroup, model, child, 0, pright);
130                                 followGroup = null;
131                         } else {
132                                 //follows=rightでなく、かつ左はじ
133                                 addToHorizontalGroup(hGroup, model, child, pleft, pright);
134                         }
135                         child.setRealize(true);
136                 }
137                 
138                 return hGroup;
139         }
140         
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+"]");
145                 
146                 g.addGap(mleft+pleft);
147                 model.setRealize(true);
148                 g.addComponent((Component) model.getComponent());
149                 model.setRealize(false);
150                 g.addGap(mright+pright);
151         }
152 }