1307f0496a21a288fba49a7ab65c4fbd99217b43
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / ui / campanula / basicFields / ToggleableTextFieldController.java
1 // $Id$
2 /**
3 * Copyright (C) 2013 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
6 *
7 * The contents of this file are subject to the Mozilla Public License Version 1.1
8 * See LICENSE.TXT at the top of this package for the full license terms.
9 */
10 package eu.etaxonomy.taxeditor.ui.campanula.basicFields;
11
12 import java.util.HashSet;
13 import java.util.Set;
14
15 import org.eclipse.swt.SWT;
16 import org.eclipse.swt.events.KeyAdapter;
17 import org.eclipse.swt.events.KeyEvent;
18 import org.eclipse.swt.events.ModifyEvent;
19 import org.eclipse.swt.events.ModifyListener;
20 import org.eclipse.swt.events.SelectionEvent;
21 import org.eclipse.swt.events.SelectionListener;
22 import org.eclipse.swt.graphics.Color;
23 import org.eclipse.swt.widgets.Button;
24 import org.eclipse.swt.widgets.Listener;
25 import org.eclipse.swt.widgets.Text;
26
27 import eu.etaxonomy.cdm.common.CdmUtils;
28 import eu.etaxonomy.taxeditor.preference.Resources;
29 import eu.etaxonomy.taxeditor.store.StoreUtil;
30 import eu.etaxonomy.taxeditor.ui.campanula.compatibility.ICdmFormElement;
31 import eu.etaxonomy.taxeditor.ui.element.AbstractCdmFormElement;
32 import eu.etaxonomy.taxeditor.ui.element.CdmFormFactory;
33 import eu.etaxonomy.taxeditor.ui.element.CdmPropertyChangeEvent;
34 import eu.etaxonomy.taxeditor.ui.element.IEnableableFormElement;
35 import eu.etaxonomy.taxeditor.ui.element.ISelectable;
36 import eu.etaxonomy.taxeditor.ui.element.LayoutConstants;
37
38 /**
39 * @author pplitzner
40 * @date 14.08.2013
41 *
42 */
43 public class ToggleableTextFieldController extends AbstractCdmFormElement implements SelectionListener, ModifyListener, IEnableableFormElement, ISelectable {
44
45 private ToggleableTextField toggleableTextField;
46
47 private boolean state;
48 private Set<SelectionListener> selectionListener = new HashSet<SelectionListener>();
49 //TODO also connect label
50 // private Label label;
51
52 /**
53 * <p>Constructor for ToggleableTextElement.</p>
54 *
55 * @param style a int.
56 * @param formFactory a {@link eu.etaxonomy.taxeditor.ui.element.CdmFormFactory} object.
57 * @param parentElement a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement} object.
58 * @param labelString a {@link java.lang.String} object.
59 * @param initialText a {@link java.lang.String} object.
60 * @param initialState a boolean.
61 */
62 public ToggleableTextFieldController(ToggleableTextField toggleableTextField, CdmFormFactory formFactory, ICdmFormElement parentElement,
63 String initialText, boolean initialState, int style) {
64 super(formFactory, parentElement);
65 setPropertyChangeListeners(formFactory.getPropertyChangeListeners());
66 formFactory.addPropertyChangeListener(this);
67
68 this.toggleableTextField = toggleableTextField;
69
70 // label = formFactory.createLabel(getLayoutComposite(), labelString, style);
71 // addControl(label);
72
73 Text text = toggleableTextField.getText();
74 addControl(text);
75 text.addModifyListener(this);
76 text.setLayoutData(LayoutConstants.FILL());
77
78 // Don't accept carriage returns as input
79 text.addKeyListener( new KeyAdapter(){
80 @Override
81 public void keyPressed(KeyEvent e) {
82 if(e.character == SWT.CR) {
83 e.doit = false;
84 }
85 }
86 });
87
88 Button editButton = toggleableTextField.getEditButton();
89 addControl(editButton);
90 editButton.addSelectionListener(this);
91
92 setState(initialState);
93 }
94
95 /**
96 * <p>setText</p>
97 *
98 * @param text a {@link java.lang.String} object.
99 */
100 public void setText(String text){
101 if(text != null){
102 // store current caret position
103 Text textField = toggleableTextField.getText();
104 int caretPosition = textField.getCaretPosition();
105
106 Listener[] listeners = textField.getListeners(SWT.Modify);
107 for (Listener listener : listeners) {
108 textField.removeListener(SWT.Modify, listener);
109 }
110 textField.setText(CdmUtils.Nz(text));
111 for (Listener listener : listeners) {
112 textField.addListener(SWT.Modify, listener);
113 }
114
115 // restore caret position
116 textField.setSelection(caretPosition);
117 }
118 }
119
120 /**
121 * <p>getText</p>
122 *
123 * @return a {@link java.lang.String} object.
124 */
125 public String getText(){
126 return toggleableTextField.getText().getText();
127 }
128
129 /**
130 * <p>Setter for the field <code>state</code>.</p>
131 *
132 * @param state a boolean.
133 */
134 public void setState(boolean state) {
135 this.state = state;
136 setEnabled(state);
137 }
138
139 /** {@inheritDoc} */
140 @Override
141 public void setEnabled(boolean enabled) {
142 toggleableTextField.getText().setEnabled(enabled);
143 String symbolicName = enabled ? Resources.COLOR_FONT_DEFAULT : Resources.COLOR_TEXT_DISABLED;
144 toggleableTextField.getText().setForeground(StoreUtil.getColor(symbolicName));
145 toggleableTextField.getEditButton().setSelection(enabled);
146 }
147
148 /**
149 * <p>Getter for the field <code>state</code>.</p>
150 *
151 * @return a boolean.
152 */
153 public boolean getState(){
154 return state;
155 }
156
157 /* (non-Javadoc)
158 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
159 */
160 /** {@inheritDoc} */
161 @Override
162 public void widgetSelected(SelectionEvent e) {
163 setState(toggleableTextField.getEditButton().getSelection());
164 for(SelectionListener listener : selectionListener){
165 listener.widgetSelected(e);
166 }
167 firePropertyChangeEvent(new CdmPropertyChangeEvent(this, e));
168 }
169
170 /**
171 * <p>addSelectionListener</p>
172 *
173 * @param listener a {@link org.eclipse.swt.events.SelectionListener} object.
174 */
175 public void addSelectionListener(SelectionListener listener){
176 selectionListener.add(listener);
177 }
178
179 /**
180 * <p>removeSelectionListener</p>
181 *
182 * @param listener a {@link org.eclipse.swt.events.SelectionListener} object.
183 */
184 public void removeSelectionListener(SelectionListener listener){
185 selectionListener.remove(listener);
186 }
187
188 /** {@inheritDoc} */
189 @Override
190 public void widgetDefaultSelected(SelectionEvent e) {}
191
192 /** {@inheritDoc} */
193 @Override
194 public void modifyText(ModifyEvent e) {
195 firePropertyChangeEvent(new CdmPropertyChangeEvent(this, e));
196 }
197
198 /** {@inheritDoc} */
199 @Override
200 public void setIrrelevant(boolean irrelevant) {
201 String colorId = irrelevant ? Resources.COLOR_COMPOSITE_IRRELEVANT : Resources.COLOR_COMPOSITE_BACKGROUND;
202
203 Color color = getColor(colorId);
204 toggleableTextField.getText().setBackground(color);
205 }
206
207 /** {@inheritDoc} */
208 @Override
209 public void setBackground(Color color) {
210 // label.setBackground(color);
211 toggleableTextField.setBackground(color);
212 }
213
214 @Override
215 public void setSelected(boolean selected) {
216 setBackground(selected ? SELECTED : getPersistentBackground());
217 }
218 }