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

History | View | Annotate | Download (17.6 KB)

1

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

    
4
import java.awt.BorderLayout;
5
import java.awt.Color;
6
import java.awt.Dimension;
7
import java.awt.event.ActionEvent;
8
import java.awt.event.ActionListener;
9
import java.awt.image.BufferedImage;
10
import java.awt.image.WritableRaster;
11
import java.beans.PropertyChangeEvent;
12
import java.beans.PropertyChangeListener;
13
import java.io.File;
14
import java.lang.reflect.InvocationTargetException;
15
import java.lang.reflect.Method;
16
import javax.swing.AbstractAction;
17
import javax.swing.AbstractButton;
18
import javax.swing.Action;
19
import javax.swing.ComboBoxModel;
20
import javax.swing.ImageIcon;
21
import javax.swing.JButton;
22
import javax.swing.JComboBox;
23
import javax.swing.JComponent;
24
import javax.swing.JLabel;
25
import javax.swing.JList;
26
import javax.swing.JMenuItem;
27
import javax.swing.JPopupMenu;
28
import javax.swing.JScrollPane;
29
import javax.swing.JSlider;
30
import javax.swing.JTabbedPane;
31
import javax.swing.JTextField;
32
import javax.swing.JViewport;
33
import javax.swing.text.DefaultEditorKit;
34
import javax.swing.text.JTextComponent;
35
import javax.swing.tree.TreeModel;
36
import org.apache.commons.lang3.StringUtils;
37
import org.gvsig.tools.ToolsLocator;
38
import org.gvsig.tools.i18n.I18nManager;
39
import org.gvsig.tools.swing.api.ActionListenerSupport;
40
import org.gvsig.tools.swing.api.ChangeListenerHelper;
41
import org.gvsig.tools.swing.api.ColorChooserController;
42
import org.gvsig.tools.swing.api.JListWithCheckbox;
43
import org.gvsig.tools.swing.api.ToolsSwingLocator;
44
import org.gvsig.tools.swing.api.ToolsSwingManager;
45
import org.gvsig.tools.swing.api.pickercontroller.ColorPickerController;
46
import org.gvsig.tools.swing.api.pickercontroller.DatePickerController;
47
import org.gvsig.tools.swing.api.pickercontroller.FilePickerController;
48
import org.gvsig.tools.swing.api.pickercontroller.FolderPickerController;
49
import org.gvsig.tools.swing.icontheme.IconTheme;
50
import org.gvsig.tools.swing.icontheme.IconThemeManager;
51
import org.gvsig.tools.swing.impl.bufferedImage.VirtualBufferedImageHelper;
52
import org.gvsig.tools.swing.impl.bufferedImage.VirtualBufferedImageHelper.VirtualDataBuffer;
53
import org.gvsig.tools.swing.impl.pickercontroller.ColorPickerControllerImpl;
54
import org.gvsig.tools.swing.impl.pickercontroller.DatePickerControllerImpl;
55
import org.gvsig.tools.swing.impl.pickercontroller.FilePickerControllerImpl;
56
import org.gvsig.tools.swing.impl.pickercontroller.FolderPickerControllerImpl;
57

    
58

    
59
public class DefaultToolsSwingManager implements ToolsSwingManager {
60

    
61
    private Dimension maxPhysicalSizeOfBufferedImage;
62

    
63
    @Override
64
    public ActionListenerSupport createActionListenerSupport() {
65
        return new DefaultActionListenerSupport();
66
    }
67

    
68
    @Override
69
    public JListWithCheckbox createJListWithCheckbox(JList wrappedList) {
70
        return new DefaultJListWithCheckbox(wrappedList);
71
    }
72

    
73
    @Override
74
    public void setTreeModel(JComboBox comboBox, TreeModel aTreeModel) {
75
        TreeComboUtils.setTreeModel(comboBox, aTreeModel);
76
    }
77

    
78
    @Override
79
    public ComboBoxModel createComboBoxModel(TreeModel treeModel) {
80
        return TreeComboUtils.createComboBoxModel(treeModel);
81
    }
82

    
83

    
84
    @Override
85
    public BufferedImage createBufferedImage(int w, int h, int type) {
86
        if(getMaxPhysicalSizeOfBufferedImage().getWidth() < w || getMaxPhysicalSizeOfBufferedImage().getHeight() < h){
87
            return createVirtualBufferedImage(w,h,type);
88
        }
89
        return new BufferedImage(w,h,type);
90
    }
91

    
92
    @Override
93
    public BufferedImage createVirtualBufferedImage(int w, int h, int type) {
94
        return VirtualBufferedImageHelper.createVirtualBufferedImage(w, h, type);
95
    }
96

    
97
    @Override
98
    public BufferedImage copyBufferedImage(BufferedImage img) {
99
        WritableRaster sourceRaster = img.getRaster();
100

    
101
        BufferedImage newImage;
102
        if(sourceRaster.getDataBuffer() instanceof VirtualDataBuffer ){
103
            newImage = VirtualBufferedImageHelper.createVirtualBufferedImage(
104
                img.getWidth(),
105
                img.getHeight(),
106
                img.getSampleModel(),
107
                img.getColorModel()
108
            );
109
        } else {
110
            newImage = createBufferedImage(img.getWidth(), img.getHeight(), img.getType());
111
        }
112

    
113
        WritableRaster raster = newImage.getRaster();
114
        img.copyData(raster);
115
        return newImage;
116
    }
117

    
118
    @Override
119
    public void setMaxPhysicalSizeOfBufferedImage(Dimension dimension) {
120
        this.maxPhysicalSizeOfBufferedImage = dimension;
121
    }
122

    
123
    @Override
124
    public Dimension getMaxPhysicalSizeOfBufferedImage() {
125
        if(this.maxPhysicalSizeOfBufferedImage == null){
126
            this.maxPhysicalSizeOfBufferedImage = new Dimension(2000, 2000);
127
        }
128
        return this.maxPhysicalSizeOfBufferedImage;
129
    }
130

    
131
    @Override
132
    public ColorChooserController createColorChooserController(JTextField txtLabel, JButton btnShowDialog, JSlider sldAlpha, boolean allowNull) {
133
        return new DefaultColorChooserController(txtLabel, btnShowDialog, sldAlpha, allowNull);
134
    }
135

    
136
    @Override
137
    public ColorChooserController createColorChooserController(JTextField txtLabel, JButton btnShowDialog) {
138
        return new DefaultColorChooserController(txtLabel, btnShowDialog);
139
    }
140

    
141
    @Override
142
    public ColorChooserController createColorChooserController(JTextField txtLabel, JButton btnShowDialog, JSlider sldAlpha) {
143
        return new DefaultColorChooserController(txtLabel, btnShowDialog, sldAlpha);
144
    }
145

    
146
    @Override
147
    public Color alphaBlendingWithOpaqueBackground(Color bgColor, Color fgColor) {
148
        // https://en.wikipedia.org/wiki/Alpha_compositing#Alpha_blending
149
        Color src = fgColor;
150
        Color dst = bgColor;
151

    
152
        // double outa = 1;
153
        double srca = src.getAlpha() / 255.0;
154
        double srca_1 = (1 - srca);
155

    
156
        Color color = new Color(
157
            (int)(src.getRed()  * srca + dst.getRed()  * srca_1) & 0xff,
158
            (int)(src.getGreen()* srca + dst.getGreen()* srca_1) & 0xff,
159
            (int)(src.getBlue() * srca + dst.getBlue() * srca_1) & 0xff
160
        );
161
        return color;
162
    }
163

    
164
    @Override
165
    public Color opaqueColor(Color src) {
166
        // https://en.wikipedia.org/wiki/Alpha_compositing#Alpha_blending
167
        double srca = src.getAlpha() / 255.0;
168
        double srca_1 = (1 - srca);
169

    
170
        Color color = new Color(
171
            (int)(src.getRed()  * srca + 255  * srca_1) & 0xff,
172
            (int)(src.getGreen()* srca + 255 * srca_1) & 0xff,
173
            (int)(src.getBlue() * srca + 255 * srca_1) & 0xff
174
        );
175
        return color;
176
    }
177

    
178
    private Object call(Object obj, String name, Object... params) {
179
        Class[] types = null;
180
        if( params != null ) {
181
            types = new Class[params.length];
182
            for (int i = 0; i < params.length; i++) {
183
                types[i] = params[i].getClass();
184
            }
185
        }
186
        Method method;
187
        try {
188
            method = obj.getClass().getMethod(name, types);
189
            Object r = method.invoke(obj, params);
190
            return r;
191
        } catch (NoSuchMethodException | 
192
                SecurityException | 
193
                IllegalAccessException | 
194
                IllegalArgumentException | 
195
                InvocationTargetException ex) {
196
        }
197
        return  null;
198
    }
199
    
200
    @Override
201
    public void translate(JComponent component) {
202
        I18nManager i18n = ToolsLocator.getI18nManager();
203
        String s = (String) call(component, "getText", (Object[]) null);
204
        if( !StringUtils.isEmpty(s) ) {
205
            call(component,"setText",i18n.getTranslation(s));
206
        }
207
        s = (String) call(component, "getToolTipText", (Object[]) null);
208
        if( !StringUtils.isEmpty(s) ) {
209
            call(component,"setToolTipText",i18n.getTranslation(s));
210
        }
211
    }
212
    
213
    @Override
214
    public void translate(AbstractButton component) {
215
        I18nManager i18n = ToolsLocator.getI18nManager();
216
        String s = component.getText();
217
        if( !StringUtils.isEmpty(s) ) {
218
            component.setText(i18n.getTranslation(s));
219
        }
220
        s = component.getToolTipText();
221
        if( !StringUtils.isEmpty(s) ) {
222
            component.setToolTipText(i18n.getTranslation(s));
223
        }
224
    }
225

    
226
    @Override
227
    public void translate(JLabel component) {
228
        I18nManager i18n = ToolsLocator.getI18nManager();
229
        String s = component.getText();
230
        if( !StringUtils.isEmpty(s) ) {
231
            component.setText(i18n.getTranslation(s));
232
        }
233
        s = component.getToolTipText();
234
        if( !StringUtils.isEmpty(s) ) {
235
            component.setToolTipText(i18n.getTranslation(s));
236
        }
237
    }
238

    
239
    @Override
240
    public void translate(JTabbedPane component) {
241
        I18nManager i18n = ToolsLocator.getI18nManager();
242

    
243
        for( int i=0; i<component.getTabCount(); i++) {
244
            String text = component.getTitleAt(i);
245
            if( !StringUtils.isEmpty(text) ) {
246
                component.setTitleAt(i, i18n.getTranslation(text));
247
            }
248
            text = component.getToolTipTextAt(i);
249
            if( !StringUtils.isEmpty(text) ) {
250
                component.setToolTipTextAt(i, i18n.getTranslation(text));
251
            }
252
        }
253
    }
254
    
255
    @Override
256
    public void setDefaultPopupMenu(final JTextComponent component) {
257
        this.setDefaultPopupMenu(component, null);
258
    }
259

    
260
    @Override
261
    public void setDefaultPopupMenu(final JTextComponent component, String title) {
262
        JPopupMenu popupMenu = new JPopupMenu();
263
        I18nManager i18nManager = ToolsLocator.getI18nManager();
264

    
265
        Action copyAction = component.getActionMap().get(DefaultEditorKit.copyAction);
266
        Action cutAction = component.getActionMap().get(DefaultEditorKit.cutAction);
267
        Action pasteAction = component.getActionMap().get(DefaultEditorKit.pasteAction);
268
        Action selectAllAction = component.getActionMap().get(DefaultEditorKit.selectAllAction);
269

    
270
        if (copyAction == null
271
                && cutAction == null
272
                && pasteAction == null
273
                && selectAllAction == null) {
274
            copyAction = component.getActionMap().get(i18nManager.getTranslation("copy"));
275
            cutAction = component.getActionMap().get(i18nManager.getTranslation("cut"));
276
            pasteAction = component.getActionMap().get(i18nManager.getTranslation("paste"));
277
            selectAllAction = component.getActionMap().get(i18nManager.getTranslation("SelectAll"));
278
        } else {
279
            copyAction.putValue(Action.NAME, i18nManager.getTranslation("copy"));
280
            cutAction.putValue(Action.NAME, i18nManager.getTranslation("cut"));
281
            pasteAction.putValue(Action.NAME, i18nManager.getTranslation("paste"));
282
            selectAllAction.putValue(Action.NAME, i18nManager.getTranslation("SelectAll"));
283
        }
284

    
285
        final String title2;
286
        if( title == null ) {
287
            title2 = i18nManager.getTranslation("text_editor");
288
        } else {
289
            title2 = title;
290
        }
291
        Action textEditorAction = new AbstractAction(i18nManager.getTranslation("text_editor")) {
292
            @Override
293
            public void actionPerformed(ActionEvent e) {
294
                DefaultZoomDialog dialog = new DefaultZoomDialog(title2, component.getText());
295
                dialog.setEditable(component.isEditable());
296
                dialog.setAlwaysOnTop(true);
297
                dialog.setVisible(true);
298
                if (component.isEditable() && component.isEnabled()) {
299
                    component.setText(dialog.getText());
300
                }
301
            }
302
        };
303
        final JMenuItem menuCut = new JMenuItem(cutAction);
304
        final JMenuItem menuPaste = new JMenuItem(pasteAction);
305
        
306
        popupMenu.add(textEditorAction);
307
        popupMenu.addSeparator();
308

    
309
        popupMenu.add(menuCut);
310
        popupMenu.add(copyAction);
311
        popupMenu.add(menuPaste);
312
        popupMenu.add(selectAllAction);
313
        
314
        if( component.isEnabled() && component.isEditable() ) {
315
            menuCut.setEnabled(true);
316
            menuPaste.setEnabled(true);
317
        } else {
318
            menuCut.setEnabled(false);
319
            menuPaste.setEnabled(false);
320
        }
321
        component.addPropertyChangeListener(new PropertyChangeListener() {
322
            @Override
323
            public void propertyChange(PropertyChangeEvent evt) {
324
                if( evt==null ) {
325
                    return;
326
                }
327
                if( evt.getPropertyName().equalsIgnoreCase("enabled") ) {
328
                    boolean enabled = component.isEnabled();
329
                    menuCut.setEnabled(enabled);
330
                    menuPaste.setEnabled(enabled);
331
                } else if( evt.getPropertyName().equalsIgnoreCase("editable") ) {
332
                    boolean editable = component.isEditable();
333
                    menuCut.setEnabled(editable);
334
                    menuPaste.setEnabled(editable);
335
                }
336
            }
337
        });
338
        component.setComponentPopupMenu(popupMenu);
339
    }
340

    
341
    @Override
342
    public void setDefaultPopupMenu(JComboBox component) {
343
        this.setDefaultPopupMenu((JTextComponent) component.getEditor().getEditorComponent(), null);
344
    }
345

    
346

    
347
    @Override
348
    public void setDefaultPopupMenu(JComboBox component, String title) {
349
        this.setDefaultPopupMenu((JTextComponent) component.getEditor().getEditorComponent(), title);
350
    }
351

    
352
    @Override
353
    public ChangeListenerHelper createChangeListenerHelper() {
354
        DefaultChangeListenerHelper x = new DefaultChangeListenerHelper();
355
        return x;
356
    }
357

    
358
    @Override
359
    public ColorPickerController createColorPickerController(JTextField txtLabel, JButton btnShowDialog, JSlider sldAlpha, boolean allowNull) {
360
        return new ColorPickerControllerImpl(txtLabel, btnShowDialog, sldAlpha, allowNull);
361
    }
362

    
363
    @Override
364
    public ColorPickerController createColorPickerController(JTextField txtLabel, JButton btnShowDialog) {
365
        return new ColorPickerControllerImpl(txtLabel, btnShowDialog);
366
    } 
367

    
368
    @Override
369
    public ColorPickerController createColorPickerController(JTextField txtLabel, JButton btnShowDialog, JSlider sldAlpha) {
370
        return new ColorPickerControllerImpl(txtLabel, btnShowDialog, sldAlpha);
371
    }
372

    
373
    @Override
374
    public DatePickerController createDatePickerController(JTextField txtDate, JButton btnDate) {
375
        return new DatePickerControllerImpl(txtDate, btnDate);
376
    }
377

    
378
    @Override
379
    public FilePickerController createFilePickerController(JTextField txtFile, JButton btnFile, String dialogTitle, String fileChooserID, File initialPath, boolean seticon) {
380
        return new FilePickerControllerImpl(txtFile, btnFile, dialogTitle, fileChooserID, initialPath, seticon);
381
    }
382

    
383
    @Override
384
    public FilePickerController createFilePickerController(JTextField txtFile, JButton btnFile) {
385
        return new FilePickerControllerImpl(txtFile, btnFile);
386
    }
387

    
388
    @Override
389
    public FilePickerController createFilePickerController(JTextField txtFile, JButton btnFile, String dialogTitle) {
390
        return new FilePickerControllerImpl(txtFile, btnFile, dialogTitle);
391
    }
392

    
393
    @Override
394
    public FolderPickerController createFolderPickerController(JTextField txtFile, JButton btnFile, String dialogTitle, String fileChooserID, File initialPath, boolean seticon) {
395
        return new FolderPickerControllerImpl(txtFile, btnFile, dialogTitle, fileChooserID, initialPath, seticon);
396
    }
397

    
398
    @Override
399
    public FolderPickerController createFolderPickerController(JTextField txtFile, JButton btnFile) {
400
        return new FolderPickerControllerImpl(txtFile, btnFile);
401
    }
402

    
403
    @Override
404
    public FolderPickerController createFolderPickerController(JTextField txtFile, JButton btnFile, String dialogTitle) {
405
        return new FolderPickerControllerImpl(txtFile, btnFile,dialogTitle);
406
    }
407

    
408
    @Override
409
    public void removeBorder(JComponent component) {
410
        try {
411
            component.setBorder(null);
412
            JComponent p1 = (JComponent) component.getParent();
413
            if( p1 instanceof JViewport ) {
414
                p1 = (JComponent) component.getParent();
415
            }
416
            if( p1 instanceof JScrollPane ) {
417
                JScrollPane scrollPanel = (JScrollPane) component.getParent();
418
                scrollPanel.setBorder(null);
419
            }
420
        } catch(Exception ex) {
421
            
422
        }
423
    }
424

    
425
    protected ImageIcon getIcon(String name) {
426
        IconThemeManager iconThemeManager = ToolsSwingLocator.getIconThemeManager();
427
        IconTheme theme = iconThemeManager.getCurrent();
428
        ImageIcon icon = theme.get(name);
429
        return icon;
430
    }
431

    
432
    @Override
433
    public void addClearButton(JTextField text) {
434
        this.addClearButton(text, null);
435
    }
436

    
437
    @Override
438
    public void addClearButton(final JTextField text,  final ActionListener action) {
439
        final JButton btnClear = new JButton(getIcon("picker-cleartext"));
440
        btnClear.setBorderPainted( false );
441
        btnClear.setFocusPainted( false );
442
        btnClear.setContentAreaFilled( false );        
443
        btnClear.setOpaque(false);        
444
        if( action == null ) {
445
            btnClear.addActionListener(new ActionListener() {
446
                @Override
447
                public void actionPerformed(ActionEvent e) {
448
                    text.setText("");
449
                }
450
            });        
451
        } else {
452
            btnClear.addActionListener(action);
453
        }
454
        text.setLayout(new BorderLayout());
455
        text.add(btnClear, BorderLayout.EAST);
456
        text.addPropertyChangeListener(new PropertyChangeListener() {
457
            @Override
458
            public void propertyChange(PropertyChangeEvent evt) {
459
                if( evt!=null && evt.getPropertyName().equalsIgnoreCase("enabled") ) {
460
                    boolean enabled = text.isEnabled();
461
                    btnClear.setEnabled(enabled);
462
                }
463
            }
464
        });
465
    }
466
}