Project

General

Profile

Download (14.1 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
 *
3
 */
4
package eu.etaxonomy.taxeditor.ui.element;
5

    
6
import java.awt.Point;
7
import java.io.IOException;
8
import java.util.Set;
9
import java.util.regex.Matcher;
10
import java.util.regex.Pattern;
11

    
12
import javax.xml.parsers.ParserConfigurationException;
13

    
14
import org.apache.commons.lang.StringUtils;
15
import org.eclipse.jface.dialogs.MessageDialog;
16
import org.eclipse.jface.layout.GridDataFactory;
17
import org.eclipse.jface.util.PropertyChangeEvent;
18
import org.eclipse.jface.viewers.CellEditor.LayoutData;
19
import org.eclipse.nebula.widgets.richtext.RichTextEditor;
20
import org.eclipse.nebula.widgets.richtext.RichTextEditorConfiguration;
21
import org.eclipse.nebula.widgets.richtext.toolbar.ToolbarButton;
22
import org.eclipse.swt.SWT;
23
import org.eclipse.swt.events.KeyAdapter;
24
import org.eclipse.swt.events.KeyEvent;
25
import org.eclipse.swt.events.ModifyEvent;
26
import org.eclipse.swt.events.ModifyListener;
27
import org.eclipse.swt.events.SelectionAdapter;
28
import org.eclipse.swt.events.SelectionEvent;
29
import org.eclipse.swt.graphics.Color;
30
import org.eclipse.swt.layout.GridLayout;
31
import org.eclipse.swt.layout.RowLayout;
32
import org.eclipse.swt.widgets.Button;
33
import org.eclipse.swt.widgets.Composite;
34
import org.eclipse.swt.widgets.Control;
35
import org.eclipse.swt.widgets.Label;
36
import org.eclipse.swt.widgets.Listener;
37
import org.eclipse.swt.widgets.Text;
38
import org.eclipse.ui.dialogs.SelectionDialog;
39
import org.eclipse.ui.forms.widgets.TableWrapData;
40
import org.eclipse.ui.forms.widgets.TableWrapLayout;
41

    
42

    
43

    
44

    
45

    
46
import eu.etaxonomy.cdm.common.CdmUtils;
47
import eu.etaxonomy.cdm.model.agent.AgentBase;
48
import eu.etaxonomy.cdm.model.common.IIntextReferenceTarget;
49
import eu.etaxonomy.cdm.model.common.IntextReference;
50
import eu.etaxonomy.cdm.model.common.Language;
51
import eu.etaxonomy.cdm.model.common.LanguageString;
52
import eu.etaxonomy.cdm.model.reference.Reference;
53
import eu.etaxonomy.cdm.model.reference.ReferenceFactory;
54
import eu.etaxonomy.taxeditor.preference.Resources;
55
import eu.etaxonomy.taxeditor.store.CdmStore;
56
import eu.etaxonomy.taxeditor.ui.selection.EntitySelectionElement;
57

    
58
/**
59
 * @author n.hoffmann
60
 * @version $Id: $
61
 */
62
public class RichTextWithLabelElement extends AbstractCdmFormElement implements ModifyListener, IEnableableFormElement,
63
        ISelectable {
64

    
65
    
66
	protected RichTextEditor text;
67
    
68
    public void setLanguageString(LanguageString languageString) {
69
    	if (languageString == null){
70
    		this.languageString = LanguageString.NewInstance("", Language.DEFAULT());
71
    	}
72
		this.languageString = languageString;
73
		
74
		
75
	}
76

    
77
	private LanguageString languageString ;
78
   
79
    EntitySelectionElement<Reference> selection_reference;
80

    
81
	private Label label;
82
    
83
    private final boolean isMultiLine;
84

    
85
    public static final int MAX_HEIGHT = 0;
86
    public static final int SINGLE = -1;
87

    
88
    protected RichTextWithLabelElement(CdmFormFactory formFactory, ICdmFormElement parentElement, boolean isMultiLine) {
89
        super(formFactory, parentElement);
90
        this.isMultiLine = isMultiLine;
91
    }
92

    
93
    protected RichTextWithLabelElement(CdmFormFactory formFactory, ICdmFormElement parentElement, String labelString,
94
            LanguageString initialLanguageString, Integer textHeight, int style) {
95
        this(formFactory, parentElement, labelString, initialLanguageString, textHeight, null, true, style);
96
    }
97

    
98
    protected RichTextWithLabelElement(CdmFormFactory formFactory, ICdmFormElement parentElement, String labelString,
99
            LanguageString initialText, Integer textHeight, boolean isMultiLine, int style) {
100
        this(formFactory, parentElement, labelString, initialText, textHeight, null, isMultiLine, style);
101
    }
102

    
103
    protected RichTextWithLabelElement(CdmFormFactory formFactory, ICdmFormElement parentElement, String labelString,
104
            LanguageString initialText, Integer textHeight, Integer textLimit, int style) {
105
        this(formFactory, parentElement, labelString, initialText, textHeight, textLimit, false, style);
106
    }
107

    
108
    protected RichTextWithLabelElement(CdmFormFactory formFactory, ICdmFormElement parentElement, String labelString,
109
            LanguageString initialLanguageString, Integer textHeight, Integer textLimit, boolean isMultiLine, int style) {
110
        super(formFactory, parentElement);
111

    
112
        this.isMultiLine = isMultiLine;
113
        this.languageString = initialLanguageString;
114

    
115
        initLabel(formFactory, labelString, isMultiLine, getLayoutComposite());
116
        if (initialLanguageString != null){
117
        	initText( initialLanguageString.getText(), textHeight, textLimit, isMultiLine, style, getLayoutComposite());
118
        }else{
119
        	initText( "", textHeight, textLimit, isMultiLine, style, getLayoutComposite());
120
        	
121
        }
122
        formFactory.addPropertyChangeListener(this);
123
    }
124

    
125
    protected void initText(String initialText, Integer textHeight, Integer textLimit,
126
            boolean isMultiLine, int style, Composite layoutComposite) {
127
    	int scrollStyle = textHeight == null ? SWT.NULL : (SWT.V_SCROLL | SWT.MULTI);
128

    
129
        int combinedStyle = style | SWT.BORDER | scrollStyle;
130

    
131
        // SWT.PASSWORD does not work when SWT.WRAP is set.
132
        if (style != SWT.PASSWORD) {
133
            combinedStyle = combinedStyle | SWT.WRAP;
134
        }
135

    
136
        text = formFactory.createRichTextEditor(layoutComposite, "", combinedStyle);
137
       // text.setTextLimit(textLimit!=null?textLimit:Text.LIMIT);
138
       
139
      
140
        addControl(text);
141

    
142
        // text.setWO
143

    
144
        if (textHeight == null) {
145
            text.addKeyListener(new KeyAdapter() {
146
                @Override
147
                public void keyPressed(KeyEvent e) {
148
                    if (e.character == SWT.CR) {
149
                        // Don't accept carriage returns as input when in single
150
                        // line mode
151
                        e.doit = false;
152
                    } else if (e.character == SWT.TAB) {
153
                        // traverse is not working for wrapped text widgets so
154
                        // we reintroduce it here
155
                        e.doit = false;
156
                        text.traverse(SWT.TRAVERSE_TAB_NEXT);
157
                    }
158
                }
159
            });
160
        }
161

    
162
        TableWrapData layoutData;
163
        if(isMultiLine){
164
            layoutData = LayoutConstants.FILL_HORIZONTALLY(2, 1);
165
        }
166
        else{
167
            layoutData = LayoutConstants.FILL();
168
        }
169
        if (textHeight != null && textHeight > 0) {
170
            (layoutData).heightHint = textHeight;
171
        }
172

    
173
        text.setLayoutData(layoutData);
174

    
175
        text.addModifyListener(this);
176

    
177
        setText();
178
    }
179
    
180
//   
181

    
182
    protected void initLabel(CdmFormFactory formFactory, String labelString, boolean isMultiLine, Composite layoutComposite) {
183
        if (labelString != null) {
184
            label = formFactory.createLabel(layoutComposite, CdmUtils.Nz(labelString), SWT.NULL);
185
            addControl(label);
186
            if(isMultiLine){
187
                label.setLayoutData(LayoutConstants.FILL_HORIZONTALLY(2, 1));
188
                ((TableWrapData)label.getLayoutData()).valign = TableWrapData.MIDDLE;
189
            }
190
            else{
191
                label.setLayoutData(LayoutConstants.LEFT());
192
                ((TableWrapData)label.getLayoutData()).valign = TableWrapData.MIDDLE;
193
            }
194
        }
195
    }
196

    
197
    
198

    
199
    /** {@inheritDoc} */
200
    @Override
201
    public void setBackground(Color color) {
202
        if (label != null) {
203
            label.setBackground(color);
204
        }
205
    }
206

    
207
    @Override
208
    public void setSelected(boolean selected) {
209
        setBackground(selected ? SELECTED : getPersistentBackground());
210
    }
211

    
212
	@Override
213
	public void setIrrelevant(boolean irrelevant) {
214
		// TODO Auto-generated method stub
215
		
216
	}
217

    
218
	@Override
219
	public void setEnabled(boolean enabled) {
220
		// TODO Auto-generated method stub
221
		
222
	}
223

    
224
	@Override
225
	public boolean isEnabled() {
226
		// TODO Auto-generated method stub
227
		return false;
228
	}
229
	
230
	@Override
231
	public void modifyText(ModifyEvent e) {
232
		if(languageString == null){
233
				languageString = LanguageString.NewInstance("", CdmStore.getDefaultLanguage());
234
			}
235

    
236
		languageString.setText(getText());
237
		firePropertyChangeEvent(new CdmPropertyChangeEvent(this, e));
238
	}
239
	
240
	public LanguageString getLanguageString(){
241
		return languageString;
242
	}
243
	
244
	/**
245
     * Set the text of this composites text composite
246
     *
247
     * @param string
248
     *            a {@link java.lang.String} object.
249
     */
250
	
251
    public void setText() {
252
    	
253
    	
254
    	String convertedString = "";
255
    	
256
    	if (languageString != null){
257
    		Set<IntextReference> inrefs =  this.languageString.getIntextReferences();
258
    		convertedString = languageString.getText();
259
    		String inLineString = null;
260
        	String innerText = null;
261
        	String htmlString = null;
262
        	boolean converted = true;
263
        	if (!languageString.getText().contains("<cdm")){
264
    			text.setText(languageString.getText());
265
    			return;
266
    		}
267
        	if (inrefs == null || inrefs.size() == 0){
268
        		 text.setText(CdmUtils.Nz(languageString.getText()));
269
        	}else{
270
	        	for (IntextReference inref: inrefs){
271
	        		
272
	        		if (inref.getTarget() == null){
273
	        			break;
274
	        		}
275
	        		
276
	        		inLineString = findInlineString(convertedString,  inref.toInlineString(".*"));
277
	        		innerText = findInText(inLineString, "(<cdm:.+>)(.+)(</cdm:.+>)");
278
	        		if (innerText != null){
279
	        			htmlString = createHtml(inref, innerText);
280
	        		}else{
281
	        			inLineString =findInlineString(convertedString, "(<cdm:.+/>)");
282
	        			htmlString = createHtml(inref, innerText);
283
	        		}
284
	        		if (inLineString != null){
285
	        			convertedString = convertedString.replace(inLineString, htmlString);
286
	        			System.out.println("new text after converting "+convertedString + " - " + languageString.getText());
287
	        		}else{
288
	        			converted = false;
289
	        		}
290
	        		
291
	        	}
292
	        	text.setText(convertedString);
293
	        	if(!converted){
294
	        		System.err.println("There is a problem with the language string and an intextrefernce.");
295
	        	}
296
	        	
297
        	}
298
    	}
299
    	
300
        Listener[] listeners = text.getListeners(SWT.Modify);
301

    
302
        text.removeModifyListener(this);
303
        text.addModifyListener(this);
304
//        for (Listener listener : listeners) {
305
//            text.removeListener(SWT.Modify, listener);
306
//        }
307
//        
308
//       
309
//
310
//        for (Listener listener : listeners) {
311
//            text.addListener(SWT.Modify, listener);
312
//        }
313
        
314
    }
315
    
316
    /**
317
     * Set the text of this composites text composite
318
     *
319
     * @param string
320
     *            a {@link java.lang.String} object.
321
     */
322
    public String getText() {
323
    	
324
    	
325
    	String convertedString = "";
326
    	
327
    	if (this.languageString != null){
328
    		Set<IntextReference> inrefs =  this.languageString.getIntextReferences();
329
    		String inLineString = null;
330
        	String innerText = null;
331
        	String htmlString = null;
332
        	convertedString = text.getText();
333
        	System.out.println("before converting html to markup: "+convertedString);
334
        	for (IntextReference inref: inrefs){
335
        		if (inref.getTarget() == null){
336
        			break;
337
        		}
338
        		htmlString = findHtmlString(text.getText(), inref);
339
        		System.out.println("html"+htmlString);
340
        		if (htmlString != null){
341
        			innerText = findInText(htmlString, "(.+>)(.*)(</span>)");
342
        			inLineString = createCdmMarkUp(inref, innerText);
343
        			System.out.println("cdm mark up" + inLineString);
344
        			convertedString = convertedString.replace(htmlString, inLineString);
345
        			System.out.println("cnvertedString" +convertedString);
346
        		}else{
347
        			convertedString = text.getText();
348
        		}
349
        	}
350
    	}
351
    	return convertedString;
352
    	
353
       
354

    
355
       
356
    }
357
    
358
    
359
    private String findHtmlString(String htmlText, IntextReference inRef) {
360
		String htmlString = createHtml(inRef, ".*");
361
		Pattern pattern = Pattern.compile(htmlString);
362
    	Matcher matcher = pattern.matcher(htmlText);
363
    	if (matcher.find())
364
    	{
365
    		String result = matcher.group();
366
    	    return result;
367
    	}
368
    	return null;
369
		
370
		
371
	}
372
    
373
    private String createCdmMarkUp(IntextReference inRef, String innerText){
374
    	return inRef.toInlineString(innerText);
375
    	
376
    }
377

    
378
	private static final String CDM_PREFIX = "cdm:";
379
    private String createHtml(IntextReference inRef, String innerString){
380
    	/*
381
    	 * 
382
    	 * <span 
383
			class="cdm:IntextReference" 
384
			data-cdm-referenced-type="reference" 
385
			data-cdm-referenced-uuid="38567a90-bcae-4f76-b148-21fcae649a85'" 
386
			data-cdm-intext-uuid="'d427802f-ea22-4d10-b90b-fa90aa0092ed">
387
			innerString
388
			</span>
389

    
390
    	 */
391
    	String type = " data-cdm-referenced-type=\"" + inRef.myClass().tag() + "\"";
392
 	    IIntextReferenceTarget entity = inRef.getTarget();
393
 	    String attributes = " data-cdm-referenced-uuid=\"" + entity.getUuid() + "\" data-cdm-intext-uuid=\"" + inRef.getUuid() + "\"" ;
394
 	    String result;
395
 	    if (StringUtils.isNotEmpty(innerString)){
396
 	        result = "<span \n class=\"cdm:IntextReference\"" + type + attributes + ">" + innerString + "</" + "span" + ">";
397
 	    }else{
398
             result ="<span \n class=\"cdm:IntextReference\"" + type + attributes  + "/>";
399
 	    }
400
 	    return result;
401
    	
402
    	
403
    }
404
    
405
    private String findInlineString(String text, String inlineString){
406
    	if (text == null){
407
    		return null;
408
    	}
409
    	Pattern pattern = Pattern.compile(inlineString);
410
    	Matcher matcher = pattern.matcher(text);
411
    	String result = null;
412
    	if (matcher.find()){
413
    		result = matcher.group();
414
    		System.out.println(result);
415
    		for (int i = 0; i<matcher.groupCount(); i++){
416
    			if (i == 0){
417
    				 result= matcher.group(i);
418
    			}
419
    			System.out.println(matcher.group(i));
420
    		}
421
    		
422
    		   				
423
    	   
424
    	}
425
    	return result;
426
    }
427
    
428
    private String findInText(String text, String inlineString){
429
	    if (text == null){
430
	    	return null;
431
	    }
432
	
433
    	Pattern pattern = Pattern.compile(inlineString);
434
    	Matcher matcher = pattern.matcher(text);
435
    	if (matcher.find())
436
    	{
437
    		String result = matcher.group(1);
438
    	    return matcher.group(2);
439
    	}
440
    	return null;
441
    }
442
}
443
	
444
	
445
	
446

    
447
	
448

    
449
   
450

    
(39-39/47)