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 @ 2339

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

    
86
public class DefaultToolsSwingManager implements ToolsSwingManager {
87
    private static final String CLEAR_BUTTON_NAME = "ClearButton";
88
    
89

    
90
    private Dimension maxPhysicalSizeOfBufferedImage;
91
    private JWebBrowserFactory webBrowserfactory;
92

    
93
    @Override
94
    public ActionListenerSupport createActionListenerSupport() {
95
        return new DefaultActionListenerSupport();
96
    }
97

    
98
    @Override
99
    public JListWithCheckbox createJListWithCheckbox(JList wrappedList) {
100
        return new DefaultJListWithCheckbox(wrappedList);
101
    }
102

    
103
    @Override
104
    public void setTreeModel(JComboBox comboBox, TreeModel aTreeModel) {
105
        TreeComboUtils.setTreeModel(comboBox, aTreeModel);
106
    }
107

    
108
    @Override
109
    public ComboBoxModel createComboBoxModel(TreeModel treeModel) {
110
        return TreeComboUtils.createComboBoxModel(treeModel);
111
    }
112

    
113
    @Override
114
    public BufferedImage createBufferedImage(int w, int h, int type) {
115
        if (getMaxPhysicalSizeOfBufferedImage().getWidth() < w || getMaxPhysicalSizeOfBufferedImage().getHeight() < h) {
116
            return createVirtualBufferedImage(w, h, type);
117
        }
118
        return new BufferedImage(w, h, type);
119
    }
120

    
121
    @Override
122
    public BufferedImage createVirtualBufferedImage(int w, int h, int type) {
123
        return VirtualBufferedImageHelper.createVirtualBufferedImage(w, h, type);
124
    }
125

    
126
    @Override
127
    public BufferedImage copyBufferedImage(BufferedImage img) {
128
        WritableRaster sourceRaster = img.getRaster();
129

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

    
142
        WritableRaster raster = newImage.getRaster();
143
        img.copyData(raster);
144
        return newImage;
145
    }
146

    
147
    @Override
148
    public void setMaxPhysicalSizeOfBufferedImage(Dimension dimension) {
149
        this.maxPhysicalSizeOfBufferedImage = dimension;
150
    }
151

    
152
    @Override
153
    public Dimension getMaxPhysicalSizeOfBufferedImage() {
154
        if (this.maxPhysicalSizeOfBufferedImage == null) {
155
            this.maxPhysicalSizeOfBufferedImage = new Dimension(2000, 2000);
156
        }
157
        return this.maxPhysicalSizeOfBufferedImage;
158
    }
159

    
160
    @Override
161
    public ColorChooserController createColorChooserController(JTextComponent txtLabel, JButton btnShowDialog, JSlider sldAlpha, boolean allowNull) {
162
        return new DefaultColorChooserController(txtLabel, btnShowDialog, sldAlpha, allowNull);
163
    }
164

    
165
    @Override
166
    public ColorChooserController createColorChooserController(JTextComponent txtLabel, JButton btnShowDialog) {
167
        return new DefaultColorChooserController(txtLabel, btnShowDialog);
168
    }
169

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

    
175
    @Override
176
    public Color alphaBlendingWithOpaqueBackground(Color bgColor, Color fgColor) {
177
        // https://en.wikipedia.org/wiki/Alpha_compositing#Alpha_blending
178
        Color src = fgColor;
179
        Color dst = bgColor;
180

    
181
        // double outa = 1;
182
        double srca = src.getAlpha() / 255.0;
183
        double srca_1 = (1 - srca);
184

    
185
        Color color = new Color(
186
                (int) (src.getRed() * srca + dst.getRed() * srca_1) & 0xff,
187
                (int) (src.getGreen() * srca + dst.getGreen() * srca_1) & 0xff,
188
                (int) (src.getBlue() * srca + dst.getBlue() * srca_1) & 0xff
189
        );
190
        return color;
191
    }
192

    
193
    @Override
194
    public Color opaqueColor(Color src) {
195
        // https://en.wikipedia.org/wiki/Alpha_compositing#Alpha_blending
196
        double srca = src.getAlpha() / 255.0;
197
        double srca_1 = (1 - srca);
198

    
199
        Color color = new Color(
200
                (int) (src.getRed() * srca + 255 * srca_1) & 0xff,
201
                (int) (src.getGreen() * srca + 255 * srca_1) & 0xff,
202
                (int) (src.getBlue() * srca + 255 * srca_1) & 0xff
203
        );
204
        return color;
205
    }
206

    
207
    private Object call(Object obj, String name, Object... params) {
208
        Class[] types = null;
209
        if (params != null) {
210
            types = new Class[params.length];
211
            for (int i = 0; i < params.length; i++) {
212
                types[i] = params[i].getClass();
213
            }
214
        }
215
        Method method;
216
        try {
217
            method = obj.getClass().getMethod(name, types);
218
            Object r = method.invoke(obj, params);
219
            return r;
220
        } catch (NoSuchMethodException
221
                | SecurityException
222
                | IllegalAccessException
223
                | IllegalArgumentException
224
                | InvocationTargetException ex) {
225
        }
226
        return null;
227
    }
228

    
229
    @Override
230
    public void translate(JComponent component) {
231
        I18nManager i18n = ToolsLocator.getI18nManager();
232
        String text = (String) call(component, "getText", (Object[]) null);
233
        if (!StringUtils.isEmpty(text)) {
234
            call(component, "setText", i18n.getTranslation(text));
235
        }
236
        text = (String) call(component, "getToolTipText", (Object[]) null);
237
        if (!StringUtils.isEmpty(text)) {
238
            text = i18n.getTranslation(text);
239
            call(component, "setToolTipText", toHTML(text));
240
        }
241
    }
242

    
243
    @Override
244
    public void translate(AbstractButton component) {
245
        I18nManager i18n = ToolsLocator.getI18nManager();
246
        String text=  component.getText();
247
        if (!StringUtils.isEmpty(text)) {
248
            component.setText(i18n.getTranslation(text));
249
        }
250
        text = component.getToolTipText();
251
        if (!StringUtils.isEmpty(text)) {
252
            text = i18n.getTranslation(text);
253
            component.setToolTipText(toHTML(text));
254
        }
255
    }
256

    
257
    @Override
258
    public void translate(JLabel component) {
259
        I18nManager i18n = ToolsLocator.getI18nManager();
260
        String text = component.getText();
261
        if (!StringUtils.isEmpty(text)) {
262
            component.setText(i18n.getTranslation(text));
263
        }
264
        text = component.getToolTipText();
265
        if (!StringUtils.isEmpty(text)) {
266
            text = i18n.getTranslation(text);
267
            component.setToolTipText(toHTML(text));
268
        }
269
    }
270

    
271
    @Override
272
    public void translate(JTabbedPane component) {
273
        I18nManager i18n = ToolsLocator.getI18nManager();
274

    
275
        for (int i = 0; i < component.getTabCount(); i++) {
276
            String text = component.getTitleAt(i);
277
            if (!StringUtils.isEmpty(text)) {
278
                component.setTitleAt(i, i18n.getTranslation(text));
279
            }
280
            text = component.getToolTipTextAt(i);
281
            if (!StringUtils.isEmpty(text)) {
282
                text = i18n.getTranslation(text);
283
                component.setToolTipTextAt(i, toHTML(text));
284
            }
285
        }
286
    }
287

    
288
    private String toHTML(String s) {
289
      s = StringUtils.replace(s, "\n", "<br>");
290
      s = StringUtils.replace(s, "<html>", "");
291
      s = StringUtils.replace(s, "</html>", "");
292
      s = "<html>"+s+"</html>";
293
      return s;
294
    }
295
    
296
    @Override
297
    public void setDefaultPopupMenu(final JTextComponent component) {
298
        this.setDefaultPopupMenu(component, null);
299
    }
300

    
301
    @Override
302
    public void setDefaultPopupMenu(final JTextComponent component, String title) {
303
        JPopupMenu popupMenu = new JPopupMenu();
304
        I18nManager i18nManager = ToolsLocator.getI18nManager();
305

    
306
        Action copyAction = component.getActionMap().get(DefaultEditorKit.copyAction);
307
        Action cutAction = component.getActionMap().get(DefaultEditorKit.cutAction);
308
        Action pasteAction = component.getActionMap().get(DefaultEditorKit.pasteAction);
309
        Action selectAllAction = component.getActionMap().get(DefaultEditorKit.selectAllAction);
310

    
311
        if (copyAction == null
312
                && cutAction == null
313
                && pasteAction == null
314
                && selectAllAction == null) {
315
            copyAction = component.getActionMap().get(i18nManager.getTranslation("copy"));
316
            cutAction = component.getActionMap().get(i18nManager.getTranslation("cut"));
317
            pasteAction = component.getActionMap().get(i18nManager.getTranslation("paste"));
318
            selectAllAction = component.getActionMap().get(i18nManager.getTranslation("SelectAll"));
319
        } else {
320
            copyAction.putValue(Action.NAME, i18nManager.getTranslation("copy"));
321
            cutAction.putValue(Action.NAME, i18nManager.getTranslation("cut"));
322
            pasteAction.putValue(Action.NAME, i18nManager.getTranslation("paste"));
323
            selectAllAction.putValue(Action.NAME, i18nManager.getTranslation("SelectAll"));
324
        }
325

    
326
        final String title2;
327
        if (title == null) {
328
            title2 = i18nManager.getTranslation("text_editor");
329
        } else {
330
            title2 = title;
331
        }
332
        Action textEditorAction = new AbstractAction(i18nManager.getTranslation("text_editor")) {
333
            @Override
334
            public void actionPerformed(ActionEvent e) {
335
                DefaultZoomDialog dialog = new DefaultZoomDialog(component, title2, component.getText());
336
                dialog.setEditable(component.isEditable());
337
                dialog.setAlwaysOnTop(true);
338
                dialog.setVisible(true);
339
                if (component.isEditable() && component.isEnabled()) {
340
                    component.setText(dialog.getText());
341
                }
342
            }
343
        };
344
        final JMenuItem menuCut = new JMenuItem(cutAction);
345
        final JMenuItem menuPaste = new JMenuItem(pasteAction);
346

    
347
        popupMenu.add(textEditorAction);
348
        popupMenu.addSeparator();
349

    
350
        popupMenu.add(menuCut);
351
        popupMenu.add(copyAction);
352
        popupMenu.add(menuPaste);
353
        popupMenu.add(selectAllAction);
354

    
355
        if (component.isEnabled() && component.isEditable()) {
356
            menuCut.setEnabled(true);
357
            menuPaste.setEnabled(true);
358
        } else {
359
            menuCut.setEnabled(false);
360
            menuPaste.setEnabled(false);
361
        }
362
        component.addPropertyChangeListener((PropertyChangeEvent evt) -> {
363
          if (evt == null) {
364
            return;
365
          }
366
          if (evt.getPropertyName().equalsIgnoreCase("enabled")) {
367
            boolean enabled = component.isEnabled();
368
            menuCut.setEnabled(enabled);
369
            menuPaste.setEnabled(enabled);
370
          } else if (evt.getPropertyName().equalsIgnoreCase("editable")) {
371
            boolean editable = component.isEditable();
372
            menuCut.setEnabled(editable);
373
            menuPaste.setEnabled(editable);
374
          }
375
        });
376
        component.setComponentPopupMenu(popupMenu);
377
    }
378

    
379
    public String showZoomDialog(Component parent, String title, String text, boolean editable) {
380
        DefaultZoomDialog dialog = new DefaultZoomDialog(parent, title, text);
381
        dialog.setEditable(editable);
382
        dialog.setAlwaysOnTop(true);
383
        dialog.setVisible(true);
384
        if (editable) {
385
            return dialog.getText();
386
        }
387
        return text;
388
    }
389
    
390
    @Override
391
    public void setDefaultPopupMenu(JComboBox component) {
392
        this.setDefaultPopupMenu((JTextComponent) component.getEditor().getEditorComponent(), null);
393
    }
394

    
395
    @Override
396
    public void setDefaultPopupMenu(JComboBox component, String title) {
397
        this.setDefaultPopupMenu((JTextComponent) component.getEditor().getEditorComponent(), title);
398
    }
399

    
400
    @Override
401
    public ChangeListenerHelper createChangeListenerHelper() {
402
        DefaultChangeListenerHelper x = new DefaultChangeListenerHelper();
403
        return x;
404
    }
405

    
406
    @Override
407
    public ColorPickerController createColorPickerController(JTextComponent txtLabel, JButton btnShowDialog, JSlider sldAlpha, boolean allowNull) {
408
        return new ColorPickerControllerImpl(txtLabel, btnShowDialog, sldAlpha, allowNull);
409
    }
410

    
411
    @Override
412
    public ColorPickerController createColorPickerController(JTextComponent txtLabel, JButton btnShowDialog) {
413
        return new ColorPickerControllerImpl(txtLabel, btnShowDialog);
414
    }
415

    
416
    @Override
417
    public ColorPickerController createColorPickerController(JTextComponent txtLabel, JButton btnShowDialog, JSlider sldAlpha) {
418
        return new ColorPickerControllerImpl(txtLabel, btnShowDialog, sldAlpha);
419
    }
420

    
421
    @Override
422
    public DatePickerController createDatePickerController(JTextComponent txtDate, JButton btnDate) {
423
        return new DatePickerControllerImpl(txtDate, btnDate);
424
    }
425

    
426
    @Override
427
    public FilePickerController createFilePickerController(JTextComponent txtFile, JButton btnFile, String dialogTitle, String fileChooserID, File initialPath, boolean seticon) {
428
        return new FilePickerControllerImpl(txtFile, btnFile, dialogTitle, fileChooserID, initialPath, seticon);
429
    }
430

    
431
    @Override
432
    public FilePickerController createFilePickerController(JTextComponent txtFile, JButton btnFile) {
433
        return new FilePickerControllerImpl(txtFile, btnFile);
434
    }
435

    
436
    @Override
437
    public PickerController<byte[]> createByteArrayPickerController(JTextComponent txtText, JButton btnUpload, JButton btnDownload, String fileChooserID, File initialPath) {
438
        return new BytearrayPickerControllerImpl(txtText, btnUpload, btnDownload, fileChooserID, initialPath);
439
    }
440

    
441
    @Override
442
    public PickerController<byte[]> createByteArrayPickerController(JTextComponent txtText, JButton btnUpload, JButton btnDownload) {
443
        return new BytearrayPickerControllerImpl(txtText, btnUpload, btnDownload, null, null);
444
    }
445

    
446
    @Override
447
    public FilePickerController createFilePickerController(JTextComponent txtFile, JButton btnFile, String dialogTitle) {
448
        return new FilePickerControllerImpl(txtFile, btnFile, dialogTitle);
449
    }
450

    
451
    @Override
452
    public FolderPickerController createFolderPickerController(JTextComponent txtFile, JButton btnFile, String dialogTitle, String fileChooserID, File initialPath, boolean seticon) {
453
        return new FolderPickerControllerImpl(txtFile, btnFile, dialogTitle, fileChooserID, initialPath, seticon);
454
    }
455

    
456
    @Override
457
    public FolderPickerController createFolderPickerController(JTextComponent txtFile, JButton btnFile) {
458
        return new FolderPickerControllerImpl(txtFile, btnFile);
459
    }
460

    
461
    @Override
462
    public FolderPickerController createFolderPickerController(JTextComponent txtFile, JButton btnFile, String dialogTitle) {
463
        return new FolderPickerControllerImpl(txtFile, btnFile, dialogTitle);
464
    }
465

    
466
    @Override
467
    public void removeBorder(JComponent component) {
468
        try {
469
            component.setBorder(null);
470
            JComponent p1 = (JComponent) component.getParent();
471
            if (p1 instanceof JViewport) {
472
                p1 = (JComponent) component.getParent();
473
            }
474
            if (p1 instanceof JScrollPane) {
475
                JScrollPane scrollPanel = (JScrollPane) component.getParent();
476
                scrollPanel.setBorder(null);
477
            }
478
        } catch (Exception ex) {
479

    
480
        }
481
    }
482

    
483
    protected ImageIcon getIcon(String name) {
484
        IconThemeManager iconThemeManager = ToolsSwingLocator.getIconThemeManager();
485
        IconTheme theme = iconThemeManager.getCurrent();
486
        ImageIcon icon = theme.get(name);
487
        return icon;
488
    }
489

    
490
    @Override
491
    public void addClearButton(JTextComponent text) {
492
        this.addClearButton(text, null);
493
    }
494

    
495
    @Override
496
    public void addClearButton(JComboBox combo) {
497
        try {
498
            JTextComponent text = (JTextComponent) combo.getEditor().getEditorComponent();
499
            this.addClearButton(text, null);
500
        } catch (Throwable th) {
501
            // Si no puede a?adir el boton no hace nada.
502
        }
503
    }
504
    public boolean hasClearButton(final JComboBox combo) {
505
        try {
506
            JTextComponent text = (JTextComponent) combo.getEditor().getEditorComponent();
507
            return this.hasClearButton(text);
508
        } catch (Throwable th) {
509
            return false;
510
        }
511
    }
512

    
513
    public void removeClearButton(final JComboBox combo) {
514
        try {
515
            JTextComponent text = (JTextComponent) combo.getEditor().getEditorComponent();
516
            this.removeClearButton(text);
517
        } catch (Throwable th) {
518
            // Si no puede a?adir el boton no hace nada.
519
        }
520
    }
521
    
522
    public boolean hasClearButton(final JTextComponent text) {
523
        for (Component component : text.getComponents()) {
524
            if( component instanceof JButton && 
525
                    StringUtils.equalsIgnoreCase(CLEAR_BUTTON_NAME, component.getName()) ) {
526
                return true;
527
            }
528
        }
529
        return false;
530
    }
531
    
532
    public void removeClearButton(final JTextComponent text) {
533
        for (Component component : text.getComponents()) {
534
            if( component instanceof JButton && 
535
                    StringUtils.equalsIgnoreCase(CLEAR_BUTTON_NAME, component.getName()) ) {
536
                text.remove(component);
537
                return;
538
            }
539
        }
540
    }
541
    
542
    @Override
543
    public void addClearButton(final JTextComponent text, final ActionListener action) {
544
        JPanel panel = new JPanel();
545
        final JButton btnClear = new JButton(getIcon("picker-cleartext"));
546
        panel.setBorder(BorderFactory.createEmptyBorder(0,0,0,0));
547
        btnClear.setBorderPainted(false);
548
        btnClear.setBorder(BorderFactory.createEmptyBorder(0,1,0,2));
549
        btnClear.setBorderPainted(false);
550
        btnClear.setFocusPainted(false);
551
        btnClear.setContentAreaFilled(false);
552
        btnClear.setOpaque(false);
553
        btnClear.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
554
        btnClear.setName(CLEAR_BUTTON_NAME);
555
        if (action == null) {
556
            btnClear.addActionListener((ActionEvent e) -> {
557
              text.setText("");
558
            });
559
        } else {
560
            btnClear.addActionListener(action);
561
        }
562
        panel.setOpaque(false);
563
        panel.setLayout(new BorderLayout());
564
        panel.add(btnClear, BorderLayout.NORTH);
565
        text.setLayout(new BorderLayout());
566
        text.add(panel, BorderLayout.EAST);
567
        
568
        text.addPropertyChangeListener((PropertyChangeEvent evt) -> {
569
          if (evt == null) {
570
            return;
571
          }
572
          if (evt.getPropertyName().equalsIgnoreCase("enabled")) {
573
            boolean enabled = text.isEnabled();
574
            btnClear.setEnabled(enabled);
575
          } else if (evt.getPropertyName().equalsIgnoreCase("editable")) {
576
            boolean editable = text.isEditable();
577
            btnClear.setEnabled(editable);
578
          }
579
        });
580
    }
581

    
582
    @Override
583
    public SimpleImage createSimpleImage() {
584
        SimpleImage x = new DefaultSimpleImage();
585
        return x;
586
    }
587

    
588
    @Override
589
    public SimpleImage createSimpleImage(Object source) {
590
        SimpleImage x = new DefaultSimpleImage(source);
591
        return x;
592
    }
593

    
594
    @Override
595
    public DropDown createDropDown(JComboBox combo) {
596
        DropDown c = new DropDownComboBox(combo);
597
        return c;
598
    }
599

    
600
    @Override
601
    public DropDown createDropDown(JLabel label) {
602
        DropDown c = new DropDownLabel(label);
603
        return c;
604
    }
605

    
606
    @Override
607
    public DropDown createDropDown(AbstractButton button) {
608
        DropDown c = new DropDownButton(button);
609
        return c;
610
    }
611

    
612
    @Override
613
    public DropDown createDropDown(JComponent component) {
614
        DropDown c = new DropDownLabel(component);
615
        return c;
616
    }
617

    
618
    @Override
619
    public CompoundIcon createCompoundIcon(Icon... icons) {
620
        DefaultCompoundIcon i = new DefaultCompoundIcon(icons);
621
        return i;
622
    }
623

    
624
    @Override
625
    public CompoundIcon createCompoundIcon(int orientation, Icon... icons) {
626
        DefaultCompoundIcon i = new DefaultCompoundIcon(orientation, icons);
627
        return i;
628
    }
629

    
630
    @Override
631
    public CompoundIcon createCompoundIcon(int orientation, int gap, Icon... icons) {
632
        DefaultCompoundIcon i = new DefaultCompoundIcon(orientation, gap, icons);
633
        return i;
634
    }
635

    
636
    @Override
637
    public CompoundIcon createCompoundIcon(int orientation, int gap, int alignmentX, int alignmentY, Icon... icons) {
638
        DefaultCompoundIcon i = new DefaultCompoundIcon(orientation, gap, alignmentX, alignmentY, icons);
639
        return i;
640
    }
641

    
642
    @Override
643
    public BookmarksController createBookmarksController(Bookmarks bookmarks, JButton button) {
644
        BookmarksController controller;
645
        controller = new DefaultBookmarksController(bookmarks, button);
646
        return controller;
647
    }
648

    
649
    @Override
650
    public HistoryController createHistoryController(History history, JButton button) {
651
        DefaultHistoryController controller;
652
        controller = new DefaultHistoryController(history, button);
653
        return controller;
654
    }
655

    
656
    @Override
657
    public FilteredTableModel createFilteredTableModel(TableModel tableModel, int filterColumn) {
658
        FilteredTableModelImpl model = new FilteredTableModelImpl(tableModel, filterColumn);
659
        return model;
660
    }
661

    
662
    @Override
663
    public JLabel createTitledSeparator(String title, int height, int titlePosition, int titleJustification) {
664
        TitledSeparator c = new TitledSeparator(title, height, titlePosition, titleJustification);
665
        return c;
666
    }
667

    
668
    @Override
669
    public JLabel createTitledSeparator(String title) {
670
        TitledSeparator c = new TitledSeparator(
671
                title,
672
                2,
673
                TitledBorder.DEFAULT_POSITION,
674
                TitledBorder.DEFAULT_JUSTIFICATION
675
        );
676
        return c;
677
    }
678

    
679
    @Override
680
    public FilteredListModel createFilteredListModel() {
681
        FilteredListModel model = new FilteredListModelImpl(null);
682
        return model;
683
    }
684

    
685
    @Override
686
    public FilteredTreeModel createFilteredTreeModel(JTree tree) {
687
        FilteredTreeModel model = new FilteredTreeModelImpl(tree.getModel());
688
        return model;
689
    }
690

    
691
    @Override
692
    public FilteredListController createFilteredListController(JList list, JTextComponent text, JButton button) {
693
        FilteredListController flc = new DefaultFilteredListController(list, text, button);
694
        return flc;
695
    }
696

    
697
    @Override
698
    public FilteredTreeController createFilteredTreeController(JTree list, JTextComponent text, JButton button) {
699
        FilteredTreeController ftc = new DefaultFilteredTreeController(list, text, button);
700
        return ftc;
701
    }
702

    
703
    @Override
704
    public JWebBrowser createJWebBrowser() {
705
        return this.webBrowserfactory.create();
706
    }
707

    
708
    @Override
709
    public void registerJWebBrowserFactory(JWebBrowserFactory factory) {
710
        this.webBrowserfactory = factory;
711
    }
712

    
713
    public JWebBrowserFactory getJWebBrowserFactory() {
714
        return this.webBrowserfactory;
715
    }
716

    
717
    @Override
718
    public DataTypePickerController createDataTypePickerController(JComboBox cboDataType, JButton btnDataType, boolean allowNull) {
719
        return new DataTypePickerControllerImpl(cboDataType, btnDataType, allowNull);
720
    }
721

    
722
  @Override
723
  public TableColumnAdjuster createTableColumnAdjuster(JTable table) {
724
    return TableColumnAdjusterImpl.install(table);
725
  }
726

    
727
    @Override
728
    public MessageBarController createMessageBarController(JLabel txtLabel, int timeDuration) {
729
       return new MessageBarControllerImpl(txtLabel, timeDuration);
730
    }
731

    
732
    
733
}