View Javadoc

1   package org.xnap.commons.gui.settings;
2   
3   import java.util.Iterator;
4   import java.util.LinkedList;
5   import java.util.List;
6   import javax.swing.AbstractButton;
7   import javax.swing.ComboBoxModel;
8   import javax.swing.SpinnerNumberModel;
9   import javax.swing.text.JTextComponent;
10  import org.xnap.commons.settings.BooleanSetting;
11  import org.xnap.commons.settings.IntSetting;
12  import org.xnap.commons.settings.Setting;
13  import org.xnap.commons.settings.StringSetting;
14  
15  /***
16   * Provides a mediator between {@link org.xnap.commons.settings.Setting} objects
17   * and gui components. This class can be used to easily implement dialogs that
18   * configure application settings. 
19   * 
20   * @author Steffen Pingel
21   */
22  public class SettingComponentMediator {
23  
24  	private List<SettingMapper> mappers = new LinkedList<SettingMapper>();
25  	
26  	public void add(BooleanSetting setting, AbstractButton button)
27  	{
28  		mappers.add(new BooleanSettingMapper(setting, button));
29  	}
30  
31  	public void add(IntSetting setting, SpinnerNumberModel spinnerModel)
32  	{
33  		mappers.add(new IntSettingMapper(setting, spinnerModel));
34  	}
35  
36  	public void add(StringSetting setting, JTextComponent textComponent)
37  	{
38  		mappers.add(new StringSettingMapper(setting, textComponent));
39  	}
40  
41  	public <T> void add(Setting<T> setting, ComboBoxModel model)
42  	{
43  		mappers.add(new SelectionMapper<T>(setting, model));
44  	}
45  
46  	public void add(SettingMapper mapper)
47  	{
48  		mappers.add(mapper);
49  	}
50  	
51  	public void remove(SettingMapper mapper)
52  	{
53  		mappers.remove(mapper);
54  	}
55  	
56  	public Iterator<SettingMapper> iterator()
57  	{
58  		return mappers.iterator();
59  	}
60  	
61  	public void apply()
62  	{
63  		for (SettingMapper mapper : mappers) {
64  			mapper.apply();
65  		}
66  	}
67  	
68  	public void revert()
69  	{
70  		for (SettingMapper mapper : mappers) {
71  			mapper.revert();
72  		}		
73  	}
74  
75  	public void revertToDefaults()
76  	{
77  		for (SettingMapper mapper : mappers) {
78  			mapper.revertToDefaults();
79  		}				
80  	}
81  	
82  	public static interface SettingMapper {
83  
84  		void apply();
85  
86  		void revert();
87  		
88  		void revertToDefaults();
89  		
90  	}
91  	
92  	public static class BooleanSettingMapper implements SettingMapper {
93  
94  		private AbstractButton button;
95  		private BooleanSetting setting;
96  
97  		public BooleanSettingMapper(BooleanSetting setting, AbstractButton button)
98  		{
99  			this.setting = setting;
100 			this.button = button;
101 		}
102 		
103 		public void apply()
104 		{
105 			setting.setValue(button.isSelected());
106 		}
107 
108 		public void revert()
109 		{
110 			button.setSelected(setting.getValue());
111 		}
112 
113 		public void revertToDefaults()
114 		{
115 			button.setSelected(setting.getDefaultValue());
116 		}
117 		
118 	}
119 	
120 	public static class StringSettingMapper implements SettingMapper {
121 
122 		private StringSetting setting;
123 		private JTextComponent textComponent;
124 
125 		public StringSettingMapper(StringSetting setting, JTextComponent textComponent)
126 		{
127 			this.setting = setting;
128 			this.textComponent = textComponent;
129 		}
130 		
131 		public void apply()
132 		{
133 			setting.setValue(textComponent.getText());
134 		}
135 
136 		public void revert()
137 		{
138 			textComponent.setText(setting.getValue());
139 		}
140 
141 		public void revertToDefaults()
142 		{
143 			textComponent.setText(setting.getDefaultValue());
144 		}
145 		
146 	}
147 
148 	public static class IntSettingMapper implements SettingMapper {
149 
150 		private IntSetting setting;
151 		private SpinnerNumberModel spinnerModel;
152 
153 		public IntSettingMapper(IntSetting setting, SpinnerNumberModel spinnerModel)
154 		{
155 			this.setting = setting;
156 			this.spinnerModel = spinnerModel;
157 		}
158 		
159 		public void apply()
160 		{
161 			setting.setValue(spinnerModel.getNumber().intValue());
162 		}
163 
164 		public void revert()
165 		{
166 			spinnerModel.setValue(setting.getValue());
167 		}
168 
169 		public void revertToDefaults()
170 		{
171 			spinnerModel.setValue(setting.getDefaultValue());
172 		}
173 		
174 	}
175 
176 	public static class SelectionMapper<T> implements SettingMapper {
177 
178 		private Setting<T> setting;
179 		private ComboBoxModel model;
180 
181 		public SelectionMapper(Setting<T> setting, ComboBoxModel model)
182 		{
183 			this.setting = setting;
184 			this.model = model;
185 		}
186 		
187 		public void apply()
188 		{
189 			setting.setValue((T)model.getSelectedItem());
190 		}
191 
192 		public void revert()
193 		{
194 			model.setSelectedItem(setting.getValue());
195 		}
196 
197 		public void revertToDefaults()
198 		{
199 			model.setSelectedItem(setting.getDefaultValue());
200 		}
201 		
202 	}
203 
204 }