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

History | View | Annotate | Download (16 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.io.File;
12
import java.lang.reflect.InvocationTargetException;
13
import java.lang.reflect.Method;
14
import javax.swing.AbstractAction;
15
import javax.swing.AbstractButton;
16
import javax.swing.Action;
17
import javax.swing.ComboBoxModel;
18
import javax.swing.ImageIcon;
19
import javax.swing.JButton;
20
import javax.swing.JComboBox;
21
import javax.swing.JComponent;
22
import javax.swing.JLabel;
23
import javax.swing.JList;
24
import javax.swing.JPopupMenu;
25
import javax.swing.JScrollPane;
26
import javax.swing.JSlider;
27
import javax.swing.JTabbedPane;
28
import javax.swing.JTextField;
29
import javax.swing.JViewport;
30
import javax.swing.text.DefaultEditorKit;
31
import javax.swing.text.JTextComponent;
32
import javax.swing.tree.TreeModel;
33
import org.apache.commons.lang3.StringUtils;
34
import org.gvsig.tools.ToolsLocator;
35
import org.gvsig.tools.i18n.I18nManager;
36
import org.gvsig.tools.swing.api.ActionListenerSupport;
37
import org.gvsig.tools.swing.api.ChangeListenerHelper;
38
import org.gvsig.tools.swing.api.ColorChooserController;
39
import org.gvsig.tools.swing.api.JListWithCheckbox;
40
import org.gvsig.tools.swing.api.ToolsSwingLocator;
41
import org.gvsig.tools.swing.api.ToolsSwingManager;
42
import org.gvsig.tools.swing.api.pickercontroller.ColorPickerController;
43
import org.gvsig.tools.swing.api.pickercontroller.DatePickerController;
44
import org.gvsig.tools.swing.api.pickercontroller.FilePickerController;
45
import org.gvsig.tools.swing.api.pickercontroller.FolderPickerController;
46
import org.gvsig.tools.swing.icontheme.IconTheme;
47
import org.gvsig.tools.swing.icontheme.IconThemeManager;
48
import org.gvsig.tools.swing.impl.bufferedImage.VirtualBufferedImageHelper;
49
import org.gvsig.tools.swing.impl.bufferedImage.VirtualBufferedImageHelper.VirtualDataBuffer;
50
import org.gvsig.tools.swing.impl.pickercontroller.ColorPickerControllerImpl;
51
import org.gvsig.tools.swing.impl.pickercontroller.DatePickerControllerImpl;
52
import org.gvsig.tools.swing.impl.pickercontroller.FilePickerControllerImpl;
53
import org.gvsig.tools.swing.impl.pickercontroller.FolderPickerControllerImpl;
54

    
55

    
56
public class DefaultToolsSwingManager implements ToolsSwingManager {
57

    
58
    private Dimension maxPhysicalSizeOfBufferedImage;
59

    
60
    @Override
61
    public ActionListenerSupport createActionListenerSupport() {
62
        return new DefaultActionListenerSupport();
63
    }
64

    
65
    @Override
66
    public JListWithCheckbox createJListWithCheckbox(JList wrappedList) {
67
        return new DefaultJListWithCheckbox(wrappedList);
68
    }
69

    
70
    @Override
71
    public void setTreeModel(JComboBox comboBox, TreeModel aTreeModel) {
72
        TreeComboUtils.setTreeModel(comboBox, aTreeModel);
73
    }
74

    
75
    @Override
76
    public ComboBoxModel createComboBoxModel(TreeModel treeModel) {
77
        return TreeComboUtils.createComboBoxModel(treeModel);
78
    }
79

    
80

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

    
89
    @Override
90
    public BufferedImage createVirtualBufferedImage(int w, int h, int type) {
91
        return VirtualBufferedImageHelper.createVirtualBufferedImage(w, h, type);
92
    }
93

    
94
    @Override
95
    public BufferedImage copyBufferedImage(BufferedImage img) {
96
        WritableRaster sourceRaster = img.getRaster();
97

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

    
110
        WritableRaster raster = newImage.getRaster();
111
        img.copyData(raster);
112
        return newImage;
113
    }
114

    
115
    @Override
116
    public void setMaxPhysicalSizeOfBufferedImage(Dimension dimension) {
117
        this.maxPhysicalSizeOfBufferedImage = dimension;
118
    }
119

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

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

    
133
    @Override
134
    public ColorChooserController createColorChooserController(JTextField txtLabel, JButton btnShowDialog) {
135
        return new DefaultColorChooserController(txtLabel, btnShowDialog);
136
    }
137

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

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

    
149
        // double outa = 1;
150
        double srca = src.getAlpha() / 255.0;
151
        double srca_1 = (1 - srca);
152

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

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

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

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

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

    
236
    @Override
237
    public void translate(JTabbedPane component) {
238
        I18nManager i18n = ToolsLocator.getI18nManager();
239

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

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

    
262
        Action copyAction = component.getActionMap().get(DefaultEditorKit.copyAction);
263
        Action cutAction = component.getActionMap().get(DefaultEditorKit.cutAction);
264
        Action pasteAction = component.getActionMap().get(DefaultEditorKit.pasteAction);
265
        Action selectAllAction = component.getActionMap().get(DefaultEditorKit.selectAllAction);
266

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

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

    
303
        popupMenu.add(cutAction);
304
        popupMenu.add(copyAction);
305
        popupMenu.add(pasteAction);
306
        popupMenu.add(selectAllAction);
307

    
308
        component.setComponentPopupMenu(popupMenu);
309
    }
310

    
311
    @Override
312
    public void setDefaultPopupMenu(JComboBox component) {
313
        this.setDefaultPopupMenu((JTextComponent) component.getEditor().getEditorComponent(), null);
314
    }
315

    
316

    
317
    @Override
318
    public void setDefaultPopupMenu(JComboBox component, String title) {
319
        this.setDefaultPopupMenu((JTextComponent) component.getEditor().getEditorComponent(), title);
320
    }
321

    
322
    @Override
323
    public ChangeListenerHelper createChangeListenerHelper() {
324
        DefaultChangeListenerHelper x = new DefaultChangeListenerHelper();
325
        return x;
326
    }
327

    
328
    @Override
329
    public ColorPickerController createColorPickerController(JTextField txtLabel, JButton btnShowDialog, JSlider sldAlpha, boolean allowNull) {
330
        return new ColorPickerControllerImpl(txtLabel, btnShowDialog, sldAlpha, allowNull);
331
    }
332

    
333
    @Override
334
    public ColorPickerController createColorPickerController(JTextField txtLabel, JButton btnShowDialog) {
335
        return new ColorPickerControllerImpl(txtLabel, btnShowDialog);
336
    } 
337

    
338
    @Override
339
    public ColorPickerController createColorPickerController(JTextField txtLabel, JButton btnShowDialog, JSlider sldAlpha) {
340
        return new ColorPickerControllerImpl(txtLabel, btnShowDialog, sldAlpha);
341
    }
342

    
343
    @Override
344
    public DatePickerController createDatePickerController(JTextField txtDate, JButton btnDate) {
345
        return new DatePickerControllerImpl(txtDate, btnDate);
346
    }
347

    
348
    @Override
349
    public FilePickerController createFilePickerController(JTextField txtFile, JButton btnFile, String dialogTitle, String fileChooserID, File initialPath, boolean seticon) {
350
        return new FilePickerControllerImpl(txtFile, btnFile, dialogTitle, fileChooserID, initialPath, seticon);
351
    }
352

    
353
    @Override
354
    public FilePickerController createFilePickerController(JTextField txtFile, JButton btnFile) {
355
        return new FilePickerControllerImpl(txtFile, btnFile);
356
    }
357

    
358
    @Override
359
    public FilePickerController createFilePickerController(JTextField txtFile, JButton btnFile, String dialogTitle) {
360
        return new FilePickerControllerImpl(txtFile, btnFile, dialogTitle);
361
    }
362

    
363
    @Override
364
    public FolderPickerController createFolderPickerController(JTextField txtFile, JButton btnFile, String dialogTitle, String fileChooserID, File initialPath, boolean seticon) {
365
        return new FolderPickerControllerImpl(txtFile, btnFile, dialogTitle, fileChooserID, initialPath, seticon);
366
    }
367

    
368
    @Override
369
    public FolderPickerController createFolderPickerController(JTextField txtFile, JButton btnFile) {
370
        return new FolderPickerControllerImpl(txtFile, btnFile);
371
    }
372

    
373
    @Override
374
    public FolderPickerController createFolderPickerController(JTextField txtFile, JButton btnFile, String dialogTitle) {
375
        return new FolderPickerControllerImpl(txtFile, btnFile,dialogTitle);
376
    }
377

    
378
    @Override
379
    public void removeBorder(JComponent component) {
380
        try {
381
            component.setBorder(null);
382
            JComponent p1 = (JComponent) component.getParent();
383
            if( p1 instanceof JViewport ) {
384
                p1 = (JComponent) component.getParent();
385
            }
386
            if( p1 instanceof JScrollPane ) {
387
                JScrollPane scrollPanel = (JScrollPane) component.getParent();
388
                scrollPanel.setBorder(null);
389
            }
390
        } catch(Exception ex) {
391
            
392
        }
393
    }
394

    
395
    protected ImageIcon getIcon(String name) {
396
        IconThemeManager iconThemeManager = ToolsSwingLocator.getIconThemeManager();
397
        IconTheme theme = iconThemeManager.getCurrent();
398
        ImageIcon icon = theme.get(name);
399
        return icon;
400
    }
401

    
402
    @Override
403
    public void addClearButton(JTextField text) {
404
        this.addClearButton(text, null);
405
    }
406

    
407
    @Override
408
    public void addClearButton(final JTextField text,  final ActionListener action) {
409
        JButton btnClear = new JButton(getIcon("picker-cleartext"));
410
        btnClear.setBorderPainted( false );
411
        btnClear.setFocusPainted( false );
412
        btnClear.setContentAreaFilled( false );        
413
        btnClear.setOpaque(false);        
414
        if( action == null ) {
415
            btnClear.addActionListener(new ActionListener() {
416
                @Override
417
                public void actionPerformed(ActionEvent e) {
418
                    text.setText("");
419
                }
420
            });        
421
        } else {
422
            btnClear.addActionListener(action);
423
        }
424
        text.setLayout(new BorderLayout());
425
        text.add(btnClear, BorderLayout.EAST);
426
    }
427
}