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

History | View | Annotate | Download (14 KB)

1

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

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

    
47

    
48
public class DefaultToolsSwingManager implements ToolsSwingManager {
49

    
50
    private Dimension maxPhysicalSizeOfBufferedImage;
51

    
52
    @Override
53
    public ActionListenerSupport createActionListenerSupport() {
54
        return new DefaultActionListenerSupport();
55
    }
56

    
57
    @Override
58
    public JListWithCheckbox createJListWithCheckbox(JList wrappedList) {
59
        return new DefaultJListWithCheckbox(wrappedList);
60
    }
61

    
62
    @Override
63
    public void setTreeModel(JComboBox comboBox, TreeModel aTreeModel) {
64
        TreeComboUtils.setTreeModel(comboBox, aTreeModel);
65
    }
66

    
67
    @Override
68
    public ComboBoxModel createComboBoxModel(TreeModel treeModel) {
69
        return TreeComboUtils.createComboBoxModel(treeModel);
70
    }
71

    
72

    
73
    @Override
74
    public BufferedImage createBufferedImage(int w, int h, int type) {
75
        if(getMaxPhysicalSizeOfBufferedImage().getWidth() < w || getMaxPhysicalSizeOfBufferedImage().getHeight() < h){
76
            return createVirtualBufferedImage(w,h,type);
77
        }
78
        return new BufferedImage(w,h,type);
79
    }
80

    
81
    @Override
82
    public BufferedImage createVirtualBufferedImage(int w, int h, int type) {
83
        return VirtualBufferedImageHelper.createVirtualBufferedImage(w, h, type);
84
    }
85

    
86
    @Override
87
    public BufferedImage copyBufferedImage(BufferedImage img) {
88
        WritableRaster sourceRaster = img.getRaster();
89

    
90
        BufferedImage newImage;
91
        if(sourceRaster.getDataBuffer() instanceof VirtualDataBuffer ){
92
            newImage = VirtualBufferedImageHelper.createVirtualBufferedImage(
93
                img.getWidth(),
94
                img.getHeight(),
95
                img.getSampleModel(),
96
                img.getColorModel()
97
            );
98
        } else {
99
            newImage = createBufferedImage(img.getWidth(), img.getHeight(), img.getType());
100
        }
101

    
102
        WritableRaster raster = newImage.getRaster();
103
        img.copyData(raster);
104
        return newImage;
105
    }
106

    
107
    @Override
108
    public void setMaxPhysicalSizeOfBufferedImage(Dimension dimension) {
109
        this.maxPhysicalSizeOfBufferedImage = dimension;
110
    }
111

    
112
    @Override
113
    public Dimension getMaxPhysicalSizeOfBufferedImage() {
114
        if(this.maxPhysicalSizeOfBufferedImage == null){
115
            this.maxPhysicalSizeOfBufferedImage = new Dimension(2000, 2000);
116
        }
117
        return this.maxPhysicalSizeOfBufferedImage;
118
    }
119

    
120
    @Override
121
    public ColorChooserController createColorChooserController(JTextField txtLabel, JButton btnShowDialog, JSlider sldAlpha, boolean allowNull) {
122
        return new DefaultColorChooserController(txtLabel, btnShowDialog, sldAlpha, allowNull);
123
    }
124

    
125
    @Override
126
    public ColorChooserController createColorChooserController(JTextField txtLabel, JButton btnShowDialog) {
127
        return new DefaultColorChooserController(txtLabel, btnShowDialog);
128
    }
129

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

    
135
    @Override
136
    public Color alphaBlendingWithOpaqueBackground(Color bgColor, Color fgColor) {
137
        // https://en.wikipedia.org/wiki/Alpha_compositing#Alpha_blending
138
        Color src = fgColor;
139
        Color dst = bgColor;
140

    
141
        // double outa = 1;
142
        double srca = src.getAlpha() / 255.0;
143
        double srca_1 = (1 - srca);
144

    
145
        Color color = new Color(
146
            (int)(src.getRed()  * srca + dst.getRed()  * srca_1) & 0xff,
147
            (int)(src.getGreen()* srca + dst.getGreen()* srca_1) & 0xff,
148
            (int)(src.getBlue() * srca + dst.getBlue() * srca_1) & 0xff
149
        );
150
        return color;
151
    }
152

    
153
    @Override
154
    public Color opaqueColor(Color src) {
155
        // https://en.wikipedia.org/wiki/Alpha_compositing#Alpha_blending
156
        double srca = src.getAlpha() / 255.0;
157
        double srca_1 = (1 - srca);
158

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

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

    
215
    @Override
216
    public void translate(JLabel component) {
217
        I18nManager i18n = ToolsLocator.getI18nManager();
218
        String s = component.getText();
219
        if( !StringUtils.isEmpty(s) ) {
220
            component.setText(i18n.getTranslation(s));
221
        }
222
        s = component.getToolTipText();
223
        if( !StringUtils.isEmpty(s) ) {
224
            component.setToolTipText(i18n.getTranslation(s));
225
        }
226
    }
227

    
228
    @Override
229
    public void translate(JTabbedPane component) {
230
        I18nManager i18n = ToolsLocator.getI18nManager();
231

    
232
        for( int i=0; i<component.getTabCount(); i++) {
233
            String text = component.getTitleAt(i);
234
            if( !StringUtils.isEmpty(text) ) {
235
                component.setTitleAt(i, i18n.getTranslation(text));
236
            }
237
            text = component.getToolTipTextAt(i);
238
            if( !StringUtils.isEmpty(text) ) {
239
                component.setToolTipTextAt(i, i18n.getTranslation(text));
240
            }
241
        }
242
    }
243
    
244
    @Override
245
    public void setDefaultPopupMenu(final JTextComponent component) {
246
        this.setDefaultPopupMenu(component, null);
247
    }
248

    
249
    @Override
250
    public void setDefaultPopupMenu(final JTextComponent component, String title) {
251
        JPopupMenu popupMenu = new JPopupMenu();
252
        I18nManager i18nManager = ToolsLocator.getI18nManager();
253

    
254
        Action copyAction = component.getActionMap().get(DefaultEditorKit.copyAction);
255
        Action cutAction = component.getActionMap().get(DefaultEditorKit.cutAction);
256
        Action pasteAction = component.getActionMap().get(DefaultEditorKit.pasteAction);
257
        Action selectAllAction = component.getActionMap().get(DefaultEditorKit.selectAllAction);
258

    
259
        if (copyAction == null
260
                && cutAction == null
261
                && pasteAction == null
262
                && selectAllAction == null) {
263
            copyAction = component.getActionMap().get(i18nManager.getTranslation("copy"));
264
            cutAction = component.getActionMap().get(i18nManager.getTranslation("cut"));
265
            pasteAction = component.getActionMap().get(i18nManager.getTranslation("paste"));
266
            selectAllAction = component.getActionMap().get(i18nManager.getTranslation("SelectAll"));
267
        } else {
268
            copyAction.putValue(Action.NAME, i18nManager.getTranslation("copy"));
269
            cutAction.putValue(Action.NAME, i18nManager.getTranslation("cut"));
270
            pasteAction.putValue(Action.NAME, i18nManager.getTranslation("paste"));
271
            selectAllAction.putValue(Action.NAME, i18nManager.getTranslation("SelectAll"));
272
        }
273

    
274
        final String title2;
275
        if( title == null ) {
276
            title2 = i18nManager.getTranslation("text_editor");
277
        } else {
278
            title2 = title;
279
        }
280
        Action textEditorAction = new AbstractAction(i18nManager.getTranslation("text_editor")) {
281
            @Override
282
            public void actionPerformed(ActionEvent e) {
283
                DefaultZoomDialog dialog = new DefaultZoomDialog(title2, component.getText());
284
                dialog.setEditable(component.isEditable());
285
                dialog.setAlwaysOnTop(true);
286
                dialog.setVisible(true);
287
                if (component.isEditable() && component.isEnabled()) {
288
                    component.setText(dialog.getText());
289
                }
290
            }
291
        };
292
        popupMenu.add(textEditorAction);
293
        popupMenu.addSeparator();
294

    
295
        popupMenu.add(cutAction);
296
        popupMenu.add(copyAction);
297
        popupMenu.add(pasteAction);
298
        popupMenu.add(selectAllAction);
299

    
300
        component.setComponentPopupMenu(popupMenu);
301
    }
302

    
303
    @Override
304
    public void setDefaultPopupMenu(JComboBox component) {
305
        this.setDefaultPopupMenu((JTextComponent) component.getEditor().getEditorComponent(), null);
306
    }
307

    
308

    
309
    @Override
310
    public void setDefaultPopupMenu(JComboBox component, String title) {
311
        this.setDefaultPopupMenu((JTextComponent) component.getEditor().getEditorComponent(), title);
312
    }
313

    
314
    @Override
315
    public ChangeListenerHelper createChangeListenerHelper() {
316
        DefaultChangeListenerHelper x = new DefaultChangeListenerHelper();
317
        return x;
318
    }
319

    
320
    @Override
321
    public ColorPickerController createColorPickerController(JTextField txtLabel, JButton btnShowDialog, JSlider sldAlpha, boolean allowNull) {
322
        return new ColorPickerControllerImpl(txtLabel, btnShowDialog, sldAlpha, allowNull);
323
    }
324

    
325
    @Override
326
    public ColorPickerController createColorPickerController(JTextField txtLabel, JButton btnShowDialog) {
327
        return new ColorPickerControllerImpl(txtLabel, btnShowDialog);
328
    } 
329

    
330
    @Override
331
    public ColorPickerController createColorPickerController(JTextField txtLabel, JButton btnShowDialog, JSlider sldAlpha) {
332
        return new ColorPickerControllerImpl(txtLabel, btnShowDialog, sldAlpha);
333
    }
334

    
335
    @Override
336
    public DatePickerController createDatePickerController(JTextField txtDate, JButton btnDate) {
337
        return new DatePickerControllerImpl(txtDate, btnDate);
338
    }
339

    
340
    @Override
341
    public FilePickerController createFilePickerController(JTextField txtFile, JButton btnFile, String dialogTitle, String fileChooserID, File initialPath, boolean seticon) {
342
        return new FilePickerControllerImpl(txtFile, btnFile, dialogTitle, fileChooserID, initialPath, seticon);
343
    }
344

    
345
    @Override
346
    public FilePickerController createFilePickerController(JTextField txtFile, JButton btnFile) {
347
        return new FilePickerControllerImpl(txtFile, btnFile);
348
    }
349

    
350
    @Override
351
    public FilePickerController createFilePickerController(JTextField txtFile, JButton btnFile, String dialogTitle) {
352
        return new FilePickerControllerImpl(txtFile, btnFile, dialogTitle);
353
    }
354

    
355
    @Override
356
    public FolderPickerController createFolderPickerController(JTextField txtFile, JButton btnFile, String dialogTitle, String fileChooserID, File initialPath, boolean seticon) {
357
        return new FolderPickerControllerImpl(txtFile, btnFile, dialogTitle, fileChooserID, initialPath, seticon);
358
    }
359

    
360
    @Override
361
    public FolderPickerController createFolderPickerController(JTextField txtFile, JButton btnFile) {
362
        return new FolderPickerControllerImpl(txtFile, btnFile);
363
    }
364

    
365
    @Override
366
    public FolderPickerController createFolderPickerController(JTextField txtFile, JButton btnFile, String dialogTitle) {
367
        return new FolderPickerControllerImpl(txtFile, btnFile,dialogTitle);
368
    }
369
    
370
}