reintegrated redlist branch into trunk
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / ui / element / ToggleableTextElement.java
1 // $Id$
2 /**
3 * Copyright (C) 2007 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
11 package eu.etaxonomy.taxeditor.ui.element;
12
13 import java.util.HashSet;
14 import java.util.Set;
15
16 import org.eclipse.swt.SWT;
17 import org.eclipse.swt.events.KeyAdapter;
18 import org.eclipse.swt.events.KeyEvent;
19 import org.eclipse.swt.events.ModifyEvent;
20 import org.eclipse.swt.events.ModifyListener;
21 import org.eclipse.swt.events.SelectionEvent;
22 import org.eclipse.swt.events.SelectionListener;
23 import org.eclipse.swt.graphics.Color;
24 import org.eclipse.swt.widgets.Button;
25 import org.eclipse.swt.widgets.Composite;
26 import org.eclipse.swt.widgets.Label;
27 import org.eclipse.swt.widgets.Text;
28
29 import eu.etaxonomy.taxeditor.model.ImageResources;
30 import eu.etaxonomy.taxeditor.preference.Resources;
31 import eu.etaxonomy.taxeditor.store.StoreUtil;
32
33 /**
34 * When the button is pressed, this textfield may be edited.
35 *
36 * @author n.hoffmann
37 * @created Nov 18, 2009
38 * @version 1.0
39 */
40 public class ToggleableTextElement extends AbstractCdmFormElement implements SelectionListener, ModifyListener, IEnableableFormElement, ISelectable {
41
42 private final Text text_cache;
43 private final Button button_toggle;
44 private boolean state;
45 private final Set<SelectionListener> selectionListener = new HashSet<SelectionListener>();
46 private final Label label;
47 private final Composite container;
48
49 //TODO for RL
50 public void setVisible(boolean b) {
51 text_cache.setVisible(b);
52 button_toggle.setVisible(b);
53 label.setVisible(b);
54 container.setVisible(b);
55 }
56
57
58 /**
59 * <p>Constructor for ToggleableTextElement.</p>
60 *
61 * @param style a int.
62 * @param formFactory a {@link eu.etaxonomy.taxeditor.ui.element.CdmFormFactory} object.
63 * @param parentElement a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement} object.
64 * @param labelString a {@link java.lang.String} object.
65 * @param initialText a {@link java.lang.String} object.
66 * @param initialState a boolean.
67 */
68 protected ToggleableTextElement(CdmFormFactory formFactory, ICdmFormElement parentElement,
69 String labelString, String initialText, boolean initialState, int style) {
70 super(formFactory, parentElement);
71
72 label = formFactory.createLabel(getLayoutComposite(), labelString, style);
73 addControl(label);
74
75 container = formFactory.createComposite(getLayoutComposite(), SWT.WRAP);
76 container.setLayout(LayoutConstants.LAYOUT(2, false));
77 container.setLayoutData(LayoutConstants.FILL_HORIZONTALLY());
78 addControl(container);
79
80 text_cache = formFactory.createText(container, initialText, SWT.WRAP | SWT.MULTI);
81 addControl(text_cache);
82 text_cache.addModifyListener(this);
83 text_cache.setLayoutData(LayoutConstants.FILL());
84
85 // Don't accept carriage returns as input
86 text_cache.addKeyListener( new KeyAdapter(){
87 @Override
88 public void keyPressed(KeyEvent e) {
89 if(e.character == SWT.CR) {
90 e.doit = false;
91 }
92 }
93 });
94
95 button_toggle = formFactory.createButton(container, "Edit", SWT.TOGGLE);
96 button_toggle.setText("");
97 button_toggle.setImage(ImageResources.getImage(ImageResources.LOCK_ICON));
98 addControl(button_toggle);
99 button_toggle.addSelectionListener(this);
100
101 setState(initialState);
102 }
103
104 /**
105 * <p>setText</p>
106 *
107 * @param text a {@link java.lang.String} object.
108 */
109 public void setText(String text){
110 if(text != null){
111 // store current caret position
112 int caretPosition = text_cache.getCaretPosition();
113
114 text_cache.removeModifyListener(this);
115 text_cache.setText(text);
116 text_cache.addModifyListener(this);
117
118 // restore caret position
119 text_cache.setSelection(caretPosition);
120 }
121 }
122
123 /**
124 * <p>getText</p>
125 *
126 * @return a {@link java.lang.String} object.
127 */
128 public String getText(){
129 return text_cache.getText();
130 }
131
132 /**
133 * <p>Setter for the field <code>state</code>.</p>
134 *
135 * @param state a boolean.
136 */
137 private void setState(boolean state) {
138 if(state){
139 button_toggle.setImage(ImageResources.getImage(ImageResources.LOCK_OPEN_ICON));
140 }
141 else{
142 button_toggle.setImage(ImageResources.getImage(ImageResources.LOCK_ICON));
143 }
144 text_cache.setEnabled(state);
145 this.state = state;
146 }
147
148 /** {@inheritDoc} */
149 @Override
150 public void setEnabled(boolean enabled) {
151 text_cache.setEnabled(enabled);
152 button_toggle.setEnabled(enabled);
153 button_toggle.setGrayed(enabled);
154 button_toggle.setSelection(enabled);
155 String symbolicName = enabled ? Resources.COLOR_FONT_DEFAULT : Resources.COLOR_TEXT_DISABLED;
156 text_cache.setForeground(StoreUtil.getColor(symbolicName));
157 }
158
159 /* (non-Javadoc)
160 * @see eu.etaxonomy.taxeditor.ui.element.IEnableableFormElement#isEnabled()
161 */
162 @Override
163 public boolean isEnabled() {
164 return text_cache.isEnabled();
165 }
166
167 /**
168 * <p>Getter for the field <code>state</code>.</p>
169 *
170 * @return a boolean.
171 */
172 public boolean getState(){
173 return state;
174 }
175
176 /* (non-Javadoc)
177 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
178 */
179 /** {@inheritDoc} */
180 @Override
181 public void widgetSelected(SelectionEvent e) {
182 setState(button_toggle.getSelection());
183 for(SelectionListener listener : selectionListener){
184 listener.widgetSelected(e);
185 }
186 firePropertyChangeEvent(new CdmPropertyChangeEvent(this, e));
187 }
188
189 /**
190 * <p>addSelectionListener</p>
191 *
192 * @param listener a {@link org.eclipse.swt.events.SelectionListener} object.
193 */
194 public void addSelectionListener(SelectionListener listener){
195 selectionListener.add(listener);
196 }
197
198 /**
199 * <p>removeSelectionListener</p>
200 *
201 * @param listener a {@link org.eclipse.swt.events.SelectionListener} object.
202 */
203 public void removeSelectionListener(SelectionListener listener){
204 selectionListener.remove(listener);
205 }
206
207 /** {@inheritDoc} */
208 @Override
209 public void widgetDefaultSelected(SelectionEvent e) {}
210
211 /** {@inheritDoc} */
212 @Override
213 public void modifyText(ModifyEvent e) {
214 firePropertyChangeEvent(new CdmPropertyChangeEvent(this, e));
215 }
216
217 /** {@inheritDoc} */
218 @Override
219 public void setIrrelevant(boolean irrelevant) {
220 String colorId = irrelevant ? Resources.COLOR_COMPOSITE_IRRELEVANT : Resources.COLOR_COMPOSITE_BACKGROUND;
221
222 Color color = getColor(colorId);
223 text_cache.setBackground(color);
224 }
225
226 /** {@inheritDoc} */
227 @Override
228 public void setBackground(Color color) {
229 label.setBackground(color);
230 container.setBackground(color);
231 }
232
233 @Override
234 public void setSelected(boolean selected) {
235 setBackground(selected ? SELECTED : getPersistentBackground());
236 }
237 }