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

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.JTextArea;
32
import javax.swing.JTextField;
33
import javax.swing.JViewport;
34
import javax.swing.text.DefaultEditorKit;
35
import javax.swing.text.JTextComponent;
36
import javax.swing.tree.TreeModel;
37
import org.apache.commons.lang3.StringUtils;
38
import org.gvsig.tools.ToolsLocator;
39
import org.gvsig.tools.i18n.I18nManager;
40
import org.gvsig.tools.swing.api.ActionListenerSupport;
41
import org.gvsig.tools.swing.api.ChangeListenerHelper;
42
import org.gvsig.tools.swing.api.ColorChooserController;
43
import org.gvsig.tools.swing.api.JListWithCheckbox;
44
import org.gvsig.tools.swing.api.ToolsSwingLocator;
45
import org.gvsig.tools.swing.api.ToolsSwingManager;
46
import org.gvsig.tools.swing.api.pickercontroller.ColorPickerController;
47
import org.gvsig.tools.swing.api.pickercontroller.DatePickerController;
48
import org.gvsig.tools.swing.api.pickercontroller.FilePickerController;
49
import org.gvsig.tools.swing.api.pickercontroller.FolderPickerController;
50
import org.gvsig.tools.swing.icontheme.IconTheme;
51
import org.gvsig.tools.swing.icontheme.IconThemeManager;
52
import org.gvsig.tools.swing.impl.bufferedImage.VirtualBufferedImageHelper;
53
import org.gvsig.tools.swing.impl.bufferedImage.VirtualBufferedImageHelper.VirtualDataBuffer;
54
import org.gvsig.tools.swing.impl.pickercontroller.ColorPickerControllerImpl;
55
import org.gvsig.tools.swing.impl.pickercontroller.DatePickerControllerImpl;
56
import org.gvsig.tools.swing.impl.pickercontroller.FilePickerControllerImpl;
57
import org.gvsig.tools.swing.impl.pickercontroller.FolderPickerControllerImpl;
58

    
59

    
60
public class DefaultToolsSwingManager implements ToolsSwingManager {
61

    
62
    private Dimension maxPhysicalSizeOfBufferedImage;
63

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

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

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

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

    
84

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
347

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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