Bug 12816 fixed: Numbers pasted in editvar were not parsed according to locale
[scilab.git] / scilab / modules / ui_data / src / java / org / scilab / modules / ui_data / variableeditor / actions / PasteAction.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2010 - Calixte DENIZET
4  *
5  * This file must be used under the terms of the CeCILL.
6  * This source file is licensed as described in the file COPYING, which
7  * you should have received as part of this distribution.  The terms
8  * are also available at
9  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10  *
11  */
12
13 package org.scilab.modules.ui_data.variableeditor.actions;
14
15 import java.awt.Cursor;
16 import java.awt.Toolkit;
17 import java.awt.datatransfer.DataFlavor;
18 import java.awt.datatransfer.UnsupportedFlavorException;
19 import java.io.IOException;
20 import java.text.NumberFormat;
21 import java.text.ParsePosition;
22 import java.util.StringTokenizer;
23 import java.util.Vector;
24
25 import javax.swing.ImageIcon;
26 import javax.swing.JTable;
27
28 import org.scilab.modules.commons.gui.ScilabKeyStroke;
29 import org.scilab.modules.gui.bridge.menuitem.SwingScilabMenuItem;
30 import org.scilab.modules.gui.bridge.pushbutton.SwingScilabPushButton;
31 import org.scilab.modules.gui.events.callback.CommonCallBack;
32 import org.scilab.modules.gui.menuitem.MenuItem;
33 import org.scilab.modules.gui.menuitem.ScilabMenuItem;
34 import org.scilab.modules.gui.pushbutton.PushButton;
35 import org.scilab.modules.gui.pushbutton.ScilabPushButton;
36 import org.scilab.modules.gui.utils.ScilabSwingUtilities;
37 import org.scilab.modules.ui_data.datatable.SwingEditvarTableModel;
38 import org.scilab.modules.ui_data.variableeditor.SwingScilabVariableEditor;
39
40 /**
41  * PasteAction class
42  * @author Calixte DENIZET
43  */
44 @SuppressWarnings(value = { "serial" })
45 public final class PasteAction extends CommonCallBack {
46
47     private static final String KEY = "OSSCKEY V";
48     private static final String PASTE = "Paste";
49
50     private final SwingScilabVariableEditor editor;
51
52     /**
53      * Constructor
54      * @param editor the editor
55      * @param name the name of the action
56      */
57     public PasteAction(SwingScilabVariableEditor editor, String name) {
58         super(name);
59         this.editor = editor;
60     }
61
62     /**
63      * @param editor the editor
64      * @param table where to put the action
65      */
66     public static void registerAction(SwingScilabVariableEditor editor, JTable table) {
67         table.getActionMap().put(PASTE, new PasteAction(editor, PASTE));
68         table.getInputMap().put(ScilabKeyStroke.getKeyStroke(KEY), PASTE);
69     }
70
71     /**
72      * {@inheritDoc}
73      */
74     @Override
75     public void callBack() {
76         JTable table = editor.getCurrentTable();
77         int col = table.getSelectedColumn();
78         int row = table.getSelectedRow();
79
80         if (col == -1) {
81             col = 0;
82         }
83
84         if (row == -1) {
85             row = 0;
86         }
87
88         table.setColumnSelectionInterval(col, col);
89         table.setRowSelectionInterval(row, row);
90         String str = "";
91         editor.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
92         try {
93             str = (String) Toolkit.getDefaultToolkit().getSystemClipboard().getContents(this).getTransferData(DataFlavor.stringFlavor);
94         } catch (UnsupportedFlavorException ex1) {
95             System.err.println(ex1);
96         } catch (IOException ex2) {
97             System.err.println(ex2);
98         }
99
100         StringTokenizer rElems = new StringTokenizer(str, "\n");
101         int countRows = rElems.countTokens();
102         Vector vr = new Vector(countRows);
103         NumberFormat format = NumberFormat.getInstance();
104         ParsePosition position = new ParsePosition(0);
105         format.setParseIntegerOnly(false);
106         for (int i = 0; i < countRows; i++) {
107             StringTokenizer cElems = new StringTokenizer(rElems.nextToken(), "\t");
108             int countCols = cElems.countTokens();
109             Vector vc = new Vector(countCols);
110             for (int j = 0; j < countCols; j++) {
111                 String ss = cElems.nextToken();
112                 Number x = format.parse(ss, position);
113                 if (position.getIndex() == ss.length()) {
114                     vc.addElement(x.toString());
115                 } else {
116                     vc.addElement(ss);
117                 }
118                 position.setIndex(0);
119             }
120             vr.addElement(vc);
121         }
122
123         SwingEditvarTableModel model = (SwingEditvarTableModel) table.getModel();
124         int oldRows = model.getScilabMatrixRowCount();
125         int oldCols = model.getScilabMatrixColCount();
126
127         if (vr.size() == 1 && ((Vector) vr.get(0)).size() == 1 && row < oldRows && col < oldCols) {
128             model.setValueAtAndUpdate(true, true, ((Vector) vr.get(0)).get(0), row, col);
129         } else {
130             Vector oldVector = model.cloneDatas();
131             model.setValues(vr, row, col);
132             model.updateFullMatrix(oldVector, oldRows, oldCols);
133         }
134     }
135
136     /**
137      * Create a button for a tool bar
138      * @param editor the associated editor
139      * @param title tooltip for the button
140      * @return the button
141      */
142     public static PushButton createButton(SwingScilabVariableEditor editor, String title) {
143         PushButton button = ScilabPushButton.createPushButton();
144         ((SwingScilabPushButton) button.getAsSimplePushButton()).addActionListener(new PasteAction(editor, title));
145         button.setToolTipText(title);
146         ImageIcon imageIcon = new ImageIcon(ScilabSwingUtilities.findIcon("edit-paste"));
147         ((SwingScilabPushButton) button.getAsSimplePushButton()).setIcon(imageIcon);
148
149         return button;
150     }
151
152     /**
153      * Create a menu item
154      * @param editor the associated editor
155      * @param title the menu title
156      * @return the menu item
157      */
158     public static MenuItem createMenuItem(SwingScilabVariableEditor editor, String title) {
159         MenuItem menu = ScilabMenuItem.createMenuItem();
160         menu.setCallback(new PasteAction(editor, title));
161         menu.setText(title);
162         ((SwingScilabMenuItem) menu.getAsSimpleMenuItem()).setAccelerator(ScilabKeyStroke.getKeyStroke(KEY));
163
164         return menu;
165     }
166
167     /**
168      * Create a menu item as a SwingScilabMenuItem
169      * @param editor the associated editor
170      * @param title the menu title
171      * @return the menu item
172      */
173     public static SwingScilabMenuItem createJMenuItem(SwingScilabVariableEditor editor, String title) {
174         return (SwingScilabMenuItem) createMenuItem(editor, title).getAsSimpleMenuItem();
175     }
176 }