Statistics
| Revision:

gvsig-tools / org.gvsig.tools / library / trunk / org.gvsig.tools / org.gvsig.tools.swing / org.gvsig.tools.swing.impl / src / main / java / org / gvsig / tools / swing / impl / DefaultToolsSwingManager.java @ 2445

History | View | Annotate | Download (29.4 KB)

1
package org.gvsig.tools.swing.impl;
2

    
3
import org.gvsig.tools.swing.api.FilteredListModel;
4
import java.awt.BorderLayout;
5
import java.awt.Color;
6
import java.awt.Component;
7
import java.awt.Cursor;
8
import java.awt.Dimension;
9
import java.awt.Toolkit;
10
import java.awt.datatransfer.DataFlavor;
11
import java.awt.datatransfer.StringSelection;
12
import java.awt.datatransfer.Transferable;
13
import java.awt.event.ActionEvent;
14
import java.awt.event.ActionListener;
15
import java.awt.image.BufferedImage;
16
import java.awt.image.WritableRaster;
17
import java.beans.PropertyChangeEvent;
18
import java.io.File;
19
import java.lang.reflect.InvocationTargetException;
20
import java.lang.reflect.Method;
21
import javax.swing.AbstractAction;
22
import javax.swing.AbstractButton;
23
import javax.swing.Action;
24
import javax.swing.BorderFactory;
25
import javax.swing.ComboBoxModel;
26
import javax.swing.Icon;
27
import javax.swing.ImageIcon;
28
import javax.swing.JButton;
29
import javax.swing.JComboBox;
30
import javax.swing.JComponent;
31
import javax.swing.JLabel;
32
import javax.swing.JList;
33
import javax.swing.JMenuItem;
34
import javax.swing.JPanel;
35
import javax.swing.JPopupMenu;
36
import javax.swing.JScrollPane;
37
import javax.swing.JSlider;
38
import javax.swing.JTabbedPane;
39
import javax.swing.JTable;
40
import javax.swing.JTree;
41
import javax.swing.JViewport;
42
import javax.swing.border.TitledBorder;
43
import javax.swing.table.TableModel;
44
import javax.swing.text.DefaultEditorKit;
45
import javax.swing.text.JTextComponent;
46
import javax.swing.tree.TreeModel;
47
import org.apache.commons.lang3.StringUtils;
48
import org.gvsig.tools.ToolsLocator;
49
import org.gvsig.tools.bookmarksandhistory.Bookmarks;
50
import org.gvsig.tools.bookmarksandhistory.History;
51
import org.gvsig.tools.i18n.I18nManager;
52
import org.gvsig.tools.swing.api.ActionListenerSupport;
53
import org.gvsig.tools.swing.api.ChangeListenerHelper;
54
import org.gvsig.tools.swing.api.ColorChooserController;
55
import org.gvsig.tools.swing.api.CompoundIcon;
56
import org.gvsig.tools.swing.api.DropDown;
57
import org.gvsig.tools.swing.api.FilteredListController;
58
import org.gvsig.tools.swing.api.FilteredTableModel;
59
import org.gvsig.tools.swing.api.FilteredTreeController;
60
import org.gvsig.tools.swing.api.FilteredTreeModel;
61
import org.gvsig.tools.swing.api.JListWithCheckbox;
62
import org.gvsig.tools.swing.api.JWebBrowser;
63
import org.gvsig.tools.swing.api.JWebBrowserFactory;
64
import org.gvsig.tools.swing.api.MessageBarController;
65
import org.gvsig.tools.swing.api.SimpleImage;
66
import org.gvsig.tools.swing.api.TableColumnAdjuster;
67
import org.gvsig.tools.swing.api.ToolsSwingLocator;
68
import org.gvsig.tools.swing.api.ToolsSwingManager;
69
import org.gvsig.tools.swing.api.pickercontroller.ColorPickerController;
70
import org.gvsig.tools.swing.api.pickercontroller.DatePickerController;
71
import org.gvsig.tools.swing.api.pickercontroller.FilePickerController;
72
import org.gvsig.tools.swing.api.pickercontroller.FolderPickerController;
73
import org.gvsig.tools.swing.api.pickercontroller.PickerController;
74
import org.gvsig.tools.swing.icontheme.IconTheme;
75
import org.gvsig.tools.swing.icontheme.IconThemeManager;
76
import org.gvsig.tools.swing.impl.bufferedImage.VirtualBufferedImageHelper;
77
import org.gvsig.tools.swing.impl.bufferedImage.VirtualBufferedImageHelper.VirtualDataBuffer;
78
import org.gvsig.tools.swing.impl.pickercontroller.BytearrayPickerControllerImpl;
79
import org.gvsig.tools.swing.impl.pickercontroller.ColorPickerControllerImpl;
80
import org.gvsig.tools.swing.impl.pickercontroller.DatePickerControllerImpl;
81
import org.gvsig.tools.swing.impl.pickercontroller.FilePickerControllerImpl;
82
import org.gvsig.tools.swing.impl.pickercontroller.FolderPickerControllerImpl;
83
import org.gvsig.tools.swing.api.bookmarkshistory.BookmarksController;
84
import org.gvsig.tools.swing.api.bookmarkshistory.HistoryController;
85
import org.gvsig.tools.swing.api.pickercontroller.DataTypePickerController;
86
import org.gvsig.tools.swing.impl.bookmarkshistory.DefaultBookmarksController;
87
import org.gvsig.tools.swing.impl.bookmarkshistory.DefaultHistoryController;
88
import org.gvsig.tools.swing.impl.pickercontroller.DataTypePickerControllerImpl;
89

    
90
public class DefaultToolsSwingManager implements ToolsSwingManager {
91
    private static final String CLEAR_BUTTON_NAME = "ClearButton";
92
    
93

    
94
    private Dimension maxPhysicalSizeOfBufferedImage;
95
    private JWebBrowserFactory webBrowserfactory;
96

    
97
    @Override
98
    public ActionListenerSupport createActionListenerSupport() {
99
        return new DefaultActionListenerSupport();
100
    }
101

    
102
    @Override
103
    public JListWithCheckbox createJListWithCheckbox(JList wrappedList) {
104
        return new DefaultJListWithCheckbox(wrappedList);
105
    }
106

    
107
    @Override
108
    public void setTreeModel(JComboBox comboBox, TreeModel aTreeModel) {
109
        TreeComboUtils.setTreeModel(comboBox, aTreeModel);
110
    }
111

    
112
    @Override
113
    public ComboBoxModel createComboBoxModel(TreeModel treeModel) {
114
        return TreeComboUtils.createComboBoxModel(treeModel);
115
    }
116

    
117
    @Override
118
    public BufferedImage createBufferedImage(int w, int h, int type) {
119
        if (getMaxPhysicalSizeOfBufferedImage().getWidth() < w || getMaxPhysicalSizeOfBufferedImage().getHeight() < h) {
120
            return createVirtualBufferedImage(w, h, type);
121
        }
122
        return new BufferedImage(w, h, type);
123
    }
124

    
125
    @Override
126
    public BufferedImage createVirtualBufferedImage(int w, int h, int type) {
127
        return VirtualBufferedImageHelper.createVirtualBufferedImage(w, h, type);
128
    }
129

    
130
    @Override
131
    public BufferedImage copyBufferedImage(BufferedImage img) {
132
        WritableRaster sourceRaster = img.getRaster();
133

    
134
        BufferedImage newImage;
135
        if (sourceRaster.getDataBuffer() instanceof VirtualDataBuffer) {
136
            newImage = VirtualBufferedImageHelper.createVirtualBufferedImage(
137
                    img.getWidth(),
138
                    img.getHeight(),
139
                    img.getSampleModel(),
140
                    img.getColorModel()
141
            );
142
        } else {
143
            newImage = createBufferedImage(img.getWidth(), img.getHeight(), img.getType());
144
        }
145

    
146
        WritableRaster raster = newImage.getRaster();
147
        img.copyData(raster);
148
        return newImage;
149
    }
150

    
151
    @Override
152
    public void setMaxPhysicalSizeOfBufferedImage(Dimension dimension) {
153
        this.maxPhysicalSizeOfBufferedImage = dimension;
154
    }
155

    
156
    @Override
157
    public Dimension getMaxPhysicalSizeOfBufferedImage() {
158
        if (this.maxPhysicalSizeOfBufferedImage == null) {
159
            this.maxPhysicalSizeOfBufferedImage = new Dimension(2000, 2000);
160
        }
161
        return this.maxPhysicalSizeOfBufferedImage;
162
    }
163

    
164
    @Override
165
    public ColorChooserController createColorChooserController(JTextComponent txtLabel, JButton btnShowDialog, JSlider sldAlpha, boolean allowNull) {
166
        return new DefaultColorChooserController(txtLabel, btnShowDialog, sldAlpha, allowNull);
167
    }
168

    
169
    @Override
170
    public ColorChooserController createColorChooserController(JTextComponent txtLabel, JButton btnShowDialog) {
171
        return new DefaultColorChooserController(txtLabel, btnShowDialog);
172
    }
173

    
174
    @Override
175
    public ColorChooserController createColorChooserController(JTextComponent txtLabel, JButton btnShowDialog, JSlider sldAlpha) {
176
        return new DefaultColorChooserController(txtLabel, btnShowDialog, sldAlpha);
177
    }
178

    
179
    @Override
180
    public Color alphaBlendingWithOpaqueBackground(Color bgColor, Color fgColor) {
181
        // https://en.wikipedia.org/wiki/Alpha_compositing#Alpha_blending
182
        Color src = fgColor;
183
        Color dst = bgColor;
184

    
185
        // double outa = 1;
186
        double srca = src.getAlpha() / 255.0;
187
        double srca_1 = (1 - srca);
188

    
189
        Color color = new Color(
190
                (int) (src.getRed() * srca + dst.getRed() * srca_1) & 0xff,
191
                (int) (src.getGreen() * srca + dst.getGreen() * srca_1) & 0xff,
192
                (int) (src.getBlue() * srca + dst.getBlue() * srca_1) & 0xff
193
        );
194
        return color;
195
    }
196

    
197
    @Override
198
    public Color opaqueColor(Color src) {
199
        // https://en.wikipedia.org/wiki/Alpha_compositing#Alpha_blending
200
        double srca = src.getAlpha() / 255.0;
201
        double srca_1 = (1 - srca);
202

    
203
        Color color = new Color(
204
                (int) (src.getRed() * srca + 255 * srca_1) & 0xff,
205
                (int) (src.getGreen() * srca + 255 * srca_1) & 0xff,
206
                (int) (src.getBlue() * srca + 255 * srca_1) & 0xff
207
        );
208
        return color;
209
    }
210

    
211
    private Object call(Object obj, String name, Object... params) {
212
        Class[] types = null;
213
        if (params != null) {
214
            types = new Class[params.length];
215
            for (int i = 0; i < params.length; i++) {
216
                types[i] = params[i].getClass();
217
            }
218
        }
219
        Method method;
220
        try {
221
            method = obj.getClass().getMethod(name, types);
222
            Object r = method.invoke(obj, params);
223
            return r;
224
        } catch (NoSuchMethodException
225
                | SecurityException
226
                | IllegalAccessException
227
                | IllegalArgumentException
228
                | InvocationTargetException ex) {
229
        }
230
        return null;
231
    }
232
    
233
    @Override
234
    public void translate(JComponent component) {
235
        this.translate(component,false);
236
    }
237
    
238
    @Override
239
    public void translate(AbstractButton component) {
240
        this.translate(component,false);
241
    }
242
    
243
    @Override
244
    public void translate(JLabel component) {
245
        this.translate(component,false);
246
    }
247
    
248
    @Override
249
    public void translate(JTabbedPane component) {
250
        this.translate(component,false);
251
    }
252
    
253
    @Override
254
    public void translate(JComponent component, boolean wrap) {
255
        I18nManager i18n = ToolsLocator.getI18nManager();
256
        String text = (String) call(component, "getText", (Object[]) null);
257
        if (!StringUtils.isBlank(text)) {
258
            text = i18n.getTranslation(text);
259
            if( wrap ) {
260
                text = toHTML(text);
261
            }
262
            call(component, "setText", text);
263
        }
264
        text = (String) call(component, "getToolTipText", (Object[]) null);
265
        if (!StringUtils.isEmpty(text)) {
266
            text = i18n.getTranslation(text);
267
            call(component, "setToolTipText", toHTML(text));
268
        }
269
    }
270

    
271
    @Override
272
    public void translate(AbstractButton component, boolean wrap) {
273
        I18nManager i18n = ToolsLocator.getI18nManager();
274
        String text=  component.getText();
275
        if (!StringUtils.isBlank(text)) {
276
            text = i18n.getTranslation(text);
277
            if( wrap ) {
278
                text = toHTML(text);
279
            }
280
            component.setText(text);
281
        }
282
        text = component.getToolTipText();
283
        if (!StringUtils.isBlank(text)) {
284
            text = i18n.getTranslation(text);
285
            component.setToolTipText(toHTML(text));
286
        }
287
    }
288

    
289
    @Override
290
    public void translate(JLabel component, boolean wrap) {
291
        I18nManager i18n = ToolsLocator.getI18nManager();
292
        String text = component.getText();
293
        if (!StringUtils.isBlank(text)) {
294
            text = i18n.getTranslation(text);
295
            if( wrap ) {
296
                text = toHTML(text);
297
            }
298
            component.setText(text);
299
        }
300
        text = component.getToolTipText();
301
        if (!StringUtils.isBlank(text)) {
302
            text = i18n.getTranslation(text);
303
            component.setToolTipText(toHTML(text));
304
        }
305
    }
306

    
307
    @Override
308
    public void translate(JTabbedPane component, boolean wrap) {
309
        I18nManager i18n = ToolsLocator.getI18nManager();
310

    
311
        for (int i = 0; i < component.getTabCount(); i++) {
312
            String text = component.getTitleAt(i);
313
            if (!StringUtils.isBlank(text)) {
314
                text = i18n.getTranslation(text);
315
                if( wrap ) {
316
                    text = toHTML(text);
317
                }
318
                component.setTitleAt(i, text);
319
            }
320
            text = component.getToolTipTextAt(i);
321
            if (!StringUtils.isBlank(text)) {
322
                text = i18n.getTranslation(text);
323
                component.setToolTipTextAt(i, toHTML(text));
324
            }
325
        }
326
    }
327

    
328
    private String toHTML(String s) {
329
      s = StringUtils.replace(s, "\n", "<br>");
330
      s = StringUtils.replace(s, "<html>", "");
331
      s = StringUtils.replace(s, "</html>", "");
332
      s = "<html>"+s+"</html>";
333
      return s;
334
    }
335
    
336
    @Override
337
    public void setDefaultPopupMenu(final JTextComponent component) {
338
        this.setDefaultPopupMenu(component, null);
339
    }
340

    
341
    @Override
342
    public void setDefaultPopupMenu(final JTextComponent component, String title) {
343
        JPopupMenu popupMenu = new JPopupMenu();
344
        I18nManager i18nManager = ToolsLocator.getI18nManager();
345

    
346
        Action copyAction = component.getActionMap().get(DefaultEditorKit.copyAction);
347
        Action cutAction = component.getActionMap().get(DefaultEditorKit.cutAction);
348
        Action pasteAction = component.getActionMap().get(DefaultEditorKit.pasteAction);
349
        Action selectAllAction = component.getActionMap().get(DefaultEditorKit.selectAllAction);
350

    
351
        if (copyAction == null
352
                && cutAction == null
353
                && pasteAction == null
354
                && selectAllAction == null) {
355
            copyAction = component.getActionMap().get(i18nManager.getTranslation("copy"));
356
            cutAction = component.getActionMap().get(i18nManager.getTranslation("cut"));
357
            pasteAction = component.getActionMap().get(i18nManager.getTranslation("paste"));
358
            selectAllAction = component.getActionMap().get(i18nManager.getTranslation("SelectAll"));
359
        } else {
360
            copyAction.putValue(Action.NAME, i18nManager.getTranslation("copy"));
361
            cutAction.putValue(Action.NAME, i18nManager.getTranslation("cut"));
362
            pasteAction.putValue(Action.NAME, i18nManager.getTranslation("paste"));
363
            selectAllAction.putValue(Action.NAME, i18nManager.getTranslation("SelectAll"));
364
        }
365

    
366
        final String title2;
367
        if (title == null) {
368
            title2 = i18nManager.getTranslation("text_editor");
369
        } else {
370
            title2 = title;
371
        }
372
        Action textEditorAction = new AbstractAction(i18nManager.getTranslation("text_editor")) {
373
            @Override
374
            public void actionPerformed(ActionEvent e) {
375
                DefaultZoomDialog dialog = new DefaultZoomDialog(component, title2, component.getText());
376
                dialog.setEditable(component.isEditable());
377
                dialog.setAlwaysOnTop(true);
378
                dialog.setVisible(true);
379
                if (component.isEditable() && component.isEnabled()) {
380
                    component.setText(dialog.getText());
381
                }
382
            }
383
        };
384
        final JMenuItem menuCut = new JMenuItem(cutAction);
385
        final JMenuItem menuPaste = new JMenuItem(pasteAction);
386

    
387
        popupMenu.add(textEditorAction);
388
        popupMenu.addSeparator();
389

    
390
        popupMenu.add(menuCut);
391
        popupMenu.add(copyAction);
392
        popupMenu.add(menuPaste);
393
        popupMenu.add(selectAllAction);
394

    
395
        if (component.isEnabled() && component.isEditable()) {
396
            menuCut.setEnabled(true);
397
            menuPaste.setEnabled(true);
398
        } else {
399
            menuCut.setEnabled(false);
400
            menuPaste.setEnabled(false);
401
        }
402
        component.addPropertyChangeListener((PropertyChangeEvent evt) -> {
403
          if (evt == null) {
404
            return;
405
          }
406
          if (evt.getPropertyName().equalsIgnoreCase("enabled")) {
407
            boolean enabled = component.isEnabled();
408
            menuCut.setEnabled(enabled);
409
            menuPaste.setEnabled(enabled);
410
          } else if (evt.getPropertyName().equalsIgnoreCase("editable")) {
411
            boolean editable = component.isEditable();
412
            menuCut.setEnabled(editable);
413
            menuPaste.setEnabled(editable);
414
          }
415
        });
416
        component.setComponentPopupMenu(popupMenu);
417
    }
418

    
419
    @Override
420
    public String showZoomDialog(Component parent, String title, String text, boolean editable) {
421
        DefaultZoomDialog dialog = new DefaultZoomDialog(parent, title, text);
422
        dialog.setEditable(editable);
423
        dialog.setAlwaysOnTop(true);
424
        dialog.setVisible(true);
425
        if (editable) {
426
            return dialog.getText();
427
        }
428
        return text;
429
    }
430
    
431
    @Override
432
    public void setDefaultPopupMenu(JComboBox component) {
433
        this.setDefaultPopupMenu((JTextComponent) component.getEditor().getEditorComponent(), null);
434
    }
435

    
436
    @Override
437
    public void setDefaultPopupMenu(JComboBox component, String title) {
438
        this.setDefaultPopupMenu((JTextComponent) component.getEditor().getEditorComponent(), title);
439
    }
440

    
441
    @Override
442
    public ChangeListenerHelper createChangeListenerHelper() {
443
        DefaultChangeListenerHelper x = new DefaultChangeListenerHelper();
444
        return x;
445
    }
446

    
447
    @Override
448
    public ColorPickerController createColorPickerController(JTextComponent txtLabel, JButton btnShowDialog, JSlider sldAlpha, boolean allowNull) {
449
        return new ColorPickerControllerImpl(txtLabel, btnShowDialog, sldAlpha, allowNull);
450
    }
451

    
452
    @Override
453
    public ColorPickerController createColorPickerController(JTextComponent txtLabel, JButton btnShowDialog) {
454
        return new ColorPickerControllerImpl(txtLabel, btnShowDialog);
455
    }
456

    
457
    @Override
458
    public ColorPickerController createColorPickerController(JTextComponent txtLabel, JButton btnShowDialog, JSlider sldAlpha) {
459
        return new ColorPickerControllerImpl(txtLabel, btnShowDialog, sldAlpha);
460
    }
461

    
462
    @Override
463
    public DatePickerController createDatePickerController(JTextComponent txtDate, JButton btnDate) {
464
        return new DatePickerControllerImpl(txtDate, btnDate);
465
    }
466

    
467
    @Override
468
    public FilePickerController createFilePickerController(JTextComponent txtFile, JButton btnFile, String dialogTitle, String fileChooserID, File initialPath, boolean seticon) {
469
        return new FilePickerControllerImpl(txtFile, btnFile, dialogTitle, fileChooserID, initialPath, seticon);
470
    }
471

    
472
    @Override
473
    public FilePickerController createFilePickerController(JTextComponent txtFile, JButton btnFile) {
474
        return new FilePickerControllerImpl(txtFile, btnFile);
475
    }
476

    
477
    @Override
478
    public PickerController<byte[]> createByteArrayPickerController(JTextComponent txtText, JButton btnUpload, JButton btnDownload, String fileChooserID, File initialPath) {
479
        return new BytearrayPickerControllerImpl(txtText, btnUpload, btnDownload, fileChooserID, initialPath);
480
    }
481

    
482
    @Override
483
    public PickerController<byte[]> createByteArrayPickerController(JTextComponent txtText, JButton btnUpload, JButton btnDownload) {
484
        return new BytearrayPickerControllerImpl(txtText, btnUpload, btnDownload, null, null);
485
    }
486

    
487
    @Override
488
    public FilePickerController createFilePickerController(JTextComponent txtFile, JButton btnFile, String dialogTitle) {
489
        return new FilePickerControllerImpl(txtFile, btnFile, dialogTitle);
490
    }
491

    
492
    @Override
493
    public FolderPickerController createFolderPickerController(JTextComponent txtFile, JButton btnFile, String dialogTitle, String fileChooserID, File initialPath, boolean seticon) {
494
        return new FolderPickerControllerImpl(txtFile, btnFile, dialogTitle, fileChooserID, initialPath, seticon);
495
    }
496

    
497
    @Override
498
    public FolderPickerController createFolderPickerController(JTextComponent txtFile, JButton btnFile) {
499
        return new FolderPickerControllerImpl(txtFile, btnFile);
500
    }
501

    
502
    @Override
503
    public FolderPickerController createFolderPickerController(JTextComponent txtFile, JButton btnFile, String dialogTitle) {
504
        return new FolderPickerControllerImpl(txtFile, btnFile, dialogTitle);
505
    }
506

    
507
    @Override
508
    public void removeBorder(JComponent component) {
509
        try {
510
            component.setBorder(null);
511
            JComponent p1 = (JComponent) component.getParent();
512
            if (p1 instanceof JViewport) {
513
                p1 = (JComponent) component.getParent();
514
            }
515
            if (p1 instanceof JScrollPane) {
516
                JScrollPane scrollPanel = (JScrollPane) component.getParent();
517
                scrollPanel.setBorder(null);
518
            }
519
        } catch (Exception ex) {
520

    
521
        }
522
    }
523

    
524
    protected ImageIcon getIcon(String name) {
525
        IconThemeManager iconThemeManager = ToolsSwingLocator.getIconThemeManager();
526
        IconTheme theme = iconThemeManager.getCurrent();
527
        ImageIcon icon = theme.get(name);
528
        return icon;
529
    }
530

    
531
    @Override
532
    public void addClearButton(JTextComponent text) {
533
        this.addClearButton(text, null);
534
    }
535

    
536
    @Override
537
    public void addClearButton(JComboBox combo) {
538
        try {
539
            JTextComponent text = (JTextComponent) combo.getEditor().getEditorComponent();
540
            this.addClearButton(text, null);
541
        } catch (Throwable th) {
542
            // Si no puede a?adir el boton no hace nada.
543
        }
544
    }
545
    
546
    @Override
547
    public boolean hasClearButton(final JComboBox combo) {
548
        try {
549
            JTextComponent text = (JTextComponent) combo.getEditor().getEditorComponent();
550
            return this.hasClearButton(text);
551
        } catch (Throwable th) {
552
            return false;
553
        }
554
    }
555

    
556
    @Override
557
    public void removeClearButton(final JComboBox combo) {
558
        try {
559
            JTextComponent text = (JTextComponent) combo.getEditor().getEditorComponent();
560
            this.removeClearButton(text);
561
        } catch (Throwable th) {
562
            // Si no puede a?adir el boton no hace nada.
563
        }
564
    }
565
    
566
    @Override
567
    public boolean hasClearButton(final JTextComponent text) {
568
        for (Component component : text.getComponents()) {
569
            if( component instanceof JButton && 
570
                    StringUtils.equalsIgnoreCase(CLEAR_BUTTON_NAME, component.getName()) ) {
571
                return true;
572
            }
573
        }
574
        return false;
575
    }
576
    
577
    @Override
578
    public void removeClearButton(final JTextComponent text) {
579
        for (Component component : text.getComponents()) {
580
            if( component instanceof JButton && 
581
                    StringUtils.equalsIgnoreCase(CLEAR_BUTTON_NAME, component.getName()) ) {
582
                text.remove(component);
583
                return;
584
            }
585
        }
586
    }
587
    
588
    @Override
589
    public void addClearButton(final JTextComponent text, final ActionListener action) {
590
        JPanel panel = new JPanel();
591
        final JButton btnClear = new JButton(getIcon("picker-cleartext"));
592
        panel.setBorder(BorderFactory.createEmptyBorder(0,0,0,0));
593
        btnClear.setBorderPainted(false);
594
        btnClear.setBorder(BorderFactory.createEmptyBorder(0,1,0,2));
595
        btnClear.setBorderPainted(false);
596
        btnClear.setFocusPainted(false);
597
        btnClear.setContentAreaFilled(false);
598
        btnClear.setOpaque(false);
599
        btnClear.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
600
        btnClear.setName(CLEAR_BUTTON_NAME);
601
        if (action == null) {
602
            btnClear.addActionListener((ActionEvent e) -> {
603
              text.setText("");
604
            });
605
        } else {
606
            btnClear.addActionListener(action);
607
        }
608
        panel.setOpaque(false);
609
        panel.setLayout(new BorderLayout());
610
        panel.add(btnClear, BorderLayout.NORTH);
611
        text.setLayout(new BorderLayout());
612
        text.add(panel, BorderLayout.EAST);
613
        
614
        text.addPropertyChangeListener((PropertyChangeEvent evt) -> {
615
          if (evt == null) {
616
            return;
617
          }
618
          if (evt.getPropertyName().equalsIgnoreCase("enabled")) {
619
            boolean enabled = text.isEnabled();
620
            btnClear.setEnabled(enabled);
621
          } else if (evt.getPropertyName().equalsIgnoreCase("editable")) {
622
            boolean editable = text.isEditable();
623
            btnClear.setEnabled(editable);
624
          }
625
        });
626
    }
627

    
628
    @Override
629
    public SimpleImage createSimpleImage() {
630
        SimpleImage x = new DefaultSimpleImage();
631
        return x;
632
    }
633

    
634
    @Override
635
    public SimpleImage createSimpleImage(Object source) {
636
        SimpleImage x = new DefaultSimpleImage(source);
637
        return x;
638
    }
639

    
640
    @Override
641
    public DropDown createDropDown(JComboBox combo) {
642
        DropDown c = new DropDownComboBox(combo);
643
        return c;
644
    }
645

    
646
    @Override
647
    public DropDown createDropDown(JLabel label) {
648
        DropDown c = new DropDownLabel(label);
649
        return c;
650
    }
651

    
652
    @Override
653
    public DropDown createDropDown(AbstractButton button) {
654
        DropDown c = new DropDownButton(button);
655
        return c;
656
    }
657

    
658
    @Override
659
    public DropDown createDropDown(JComponent component) {
660
        DropDown c = new DropDownLabel(component);
661
        return c;
662
    }
663

    
664
    @Override
665
    public CompoundIcon createCompoundIcon(Icon... icons) {
666
        DefaultCompoundIcon i = new DefaultCompoundIcon(icons);
667
        return i;
668
    }
669

    
670
    @Override
671
    public CompoundIcon createCompoundIcon(int orientation, Icon... icons) {
672
        DefaultCompoundIcon i = new DefaultCompoundIcon(orientation, icons);
673
        return i;
674
    }
675

    
676
    @Override
677
    public CompoundIcon createCompoundIcon(int orientation, int gap, Icon... icons) {
678
        DefaultCompoundIcon i = new DefaultCompoundIcon(orientation, gap, icons);
679
        return i;
680
    }
681

    
682
    @Override
683
    public CompoundIcon createCompoundIcon(int orientation, int gap, int alignmentX, int alignmentY, Icon... icons) {
684
        DefaultCompoundIcon i = new DefaultCompoundIcon(orientation, gap, alignmentX, alignmentY, icons);
685
        return i;
686
    }
687

    
688
    @Override
689
    public BookmarksController createBookmarksController(Bookmarks bookmarks, JButton button) {
690
        BookmarksController controller;
691
        controller = new DefaultBookmarksController(bookmarks, button);
692
        return controller;
693
    }
694

    
695
    @Override
696
    public HistoryController createHistoryController(History history, JButton button) {
697
        DefaultHistoryController controller;
698
        controller = new DefaultHistoryController(history, button);
699
        return controller;
700
    }
701

    
702
    @Override
703
    public FilteredTableModel createFilteredTableModel(TableModel tableModel, int filterColumn) {
704
        FilteredTableModelImpl model = new FilteredTableModelImpl(tableModel, filterColumn);
705
        return model;
706
    }
707

    
708
    @Override
709
    public JLabel createTitledSeparator(String title, int height, int titlePosition, int titleJustification) {
710
        TitledSeparator c = new TitledSeparator(title, height, titlePosition, titleJustification);
711
        return c;
712
    }
713

    
714
    @Override
715
    public JLabel createTitledSeparator(String title) {
716
        TitledSeparator c = new TitledSeparator(
717
                title,
718
                2,
719
                TitledBorder.DEFAULT_POSITION,
720
                TitledBorder.DEFAULT_JUSTIFICATION
721
        );
722
        return c;
723
    }
724

    
725
    @Override
726
    public FilteredListModel createFilteredListModel() {
727
        FilteredListModel model = new FilteredListModelImpl(null);
728
        return model;
729
    }
730

    
731
    @Override
732
    public FilteredTreeModel createFilteredTreeModel(JTree tree) {
733
        FilteredTreeModel model = new FilteredTreeModelImpl(tree.getModel());
734
        return model;
735
    }
736

    
737
    @Override
738
    public FilteredListController createFilteredListController(JList list, JTextComponent text, JButton button) {
739
        FilteredListController flc = new DefaultFilteredListController(list, text, button);
740
        return flc;
741
    }
742

    
743
    @Override
744
    public FilteredTreeController createFilteredTreeController(JTree list, JTextComponent text, JButton button) {
745
        FilteredTreeController ftc = new DefaultFilteredTreeController(list, text, button);
746
        return ftc;
747
    }
748

    
749
    @Override
750
    public JWebBrowser createJWebBrowser() {
751
        return this.webBrowserfactory.create();
752
    }
753

    
754
    @Override
755
    public void registerJWebBrowserFactory(JWebBrowserFactory factory) {
756
        this.webBrowserfactory = factory;
757
    }
758

    
759
    public JWebBrowserFactory getJWebBrowserFactory() {
760
        return this.webBrowserfactory;
761
    }
762

    
763
    @Override
764
    public DataTypePickerController createDataTypePickerController(JComboBox cboDataType, JButton btnDataType, boolean allowNull) {
765
        return new DataTypePickerControllerImpl(cboDataType, btnDataType, allowNull);
766
    }
767

    
768
  @Override
769
  public TableColumnAdjuster createTableColumnAdjuster(JTable table) {
770
    return TableColumnAdjusterImpl.install(table);
771
  }
772

    
773
    @Override
774
    public MessageBarController createMessageBarController(JLabel txtLabel, int timeDuration) {
775
       return new MessageBarControllerImpl(txtLabel, timeDuration);
776
    }
777

    
778
    @Override
779
    public DropDown createDropDownIcon(JLabel lblNull) {
780
        return new DropDownLabelIcon(lblNull);
781
    }
782

    
783
    /**
784
     * Stores the provided text data on the clipboard.
785
     * 
786
     * @param data
787
     *            An String containing the data to be stored
788
     *            on the clipboard.
789
     */
790
    @Override
791
    public void putInClipboard(String data) {
792
        StringSelection ss = new StringSelection(data);
793

    
794
        Toolkit.getDefaultToolkit().getSystemClipboard().setContents(ss, ss);
795
    }
796

    
797
    /**
798
     * Gets text data from the Clipboard, if available.
799
     * 
800
     * @return An String containing the clipboard's data, or <code>null</code>
801
     *         if the data was not available.
802
     */
803
    @Override
804
    public String getFromClipboard() {
805
        
806
        try {
807
            Transferable t = Toolkit.getDefaultToolkit()
808
                    .getSystemClipboard()
809
                    .getContents(null);
810
            if(t.isDataFlavorSupported(DataFlavor.stringFlavor)) {
811
                return (String) (t.getTransferData(DataFlavor.stringFlavor));
812
            }
813
        } catch (Exception e) {
814
            return null;
815
        }
816
        return null;
817
    }
818
}