Statistics
| Revision:

svn-gvsig-desktop / trunk / extensions / extCAD / src / com / iver / cit / gvsig / CADExtension.java @ 10254

History | View | Annotate | Download (13.4 KB)

1 3712 caballero
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
2
 *
3
 * Copyright (C) 2004 IVER T.I. and Generalitat Valenciana.
4
 *
5
 * This program is free software; you can redistribute it and/or
6
 * modify it under the terms of the GNU General Public License
7
 * as published by the Free Software Foundation; either version 2
8
 * of the License, or (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with this program; if not, write to the Free Software
17
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
18
 *
19
 * For more information, contact:
20
 *
21
 *  Generalitat Valenciana
22
 *   Conselleria d'Infraestructures i Transport
23
 *   Av. Blasco Ib??ez, 50
24
 *   46010 VALENCIA
25
 *   SPAIN
26
 *
27
 *      +34 963862235
28
 *   gvsig@gva.es
29
 *      www.gvsig.gva.es
30
 *
31
 *    or
32
 *
33
 *   IVER T.I. S.A
34
 *   Salamanca 50
35
 *   46005 Valencia
36
 *   Spain
37
 *
38
 *   +34 963163400
39
 *   dac@iver.es
40
 */
41
package com.iver.cit.gvsig;
42
43 4210 fjp
import java.awt.KeyEventPostProcessor;
44
import java.awt.KeyboardFocusManager;
45 3712 caballero
import java.awt.event.ActionEvent;
46 3883 caballero
import java.awt.event.ActionListener;
47 3712 caballero
import java.awt.event.KeyEvent;
48 3883 caballero
import java.awt.event.MouseEvent;
49 3712 caballero
import java.util.HashMap;
50
51
import javax.swing.AbstractAction;
52 3883 caballero
import javax.swing.JMenuItem;
53
import javax.swing.JPopupMenu;
54 6528 caballero
import javax.swing.JTable;
55 5817 fjp
import javax.swing.KeyStroke;
56 4815 fjp
import javax.swing.text.JTextComponent;
57 3712 caballero
58
import com.iver.andami.PluginServices;
59
import com.iver.andami.plugins.Extension;
60
import com.iver.cit.gvsig.fmap.MapControl;
61 4950 caballero
import com.iver.cit.gvsig.fmap.layers.FLayer;
62
import com.iver.cit.gvsig.fmap.layers.FLyrAnnotation;
63 5845 fjp
import com.iver.cit.gvsig.gui.accelerators.ForceCursorAccelerator;
64
import com.iver.cit.gvsig.gui.accelerators.GridAccelerator;
65
import com.iver.cit.gvsig.gui.accelerators.OrtoAccelerator;
66
import com.iver.cit.gvsig.gui.accelerators.RefentAccelerator;
67 3712 caballero
import com.iver.cit.gvsig.gui.cad.CADTool;
68
import com.iver.cit.gvsig.gui.cad.CADToolAdapter;
69 3883 caballero
import com.iver.cit.gvsig.gui.cad.tools.CopyCADTool;
70
import com.iver.cit.gvsig.gui.cad.tools.RotateCADTool;
71
import com.iver.cit.gvsig.gui.cad.tools.ScaleCADTool;
72 5884 caballero
import com.iver.cit.gvsig.gui.cad.tools.SymmetryCADTool;
73 7304 caballero
import com.iver.cit.gvsig.project.documents.view.gui.View;
74 8929 caballero
import com.iver.cit.gvsig.project.documents.view.snapping.Snapping;
75 7674 caballero
import com.iver.cit.gvsig.project.documents.view.toc.MenuEntry;
76 4892 caballero
import com.iver.utiles.console.JConsole;
77 3712 caballero
import com.iver.utiles.console.ResponseListener;
78 5478 caballero
import com.iver.utiles.console.jedit.JEditTextArea;
79 5115 caballero
80 3712 caballero
/**
81 5115 caballero
 * Extensi?n dedicada a controlar las diferentes operaciones sobre el editado de
82
 * una capa.
83 3712 caballero
 *
84
 * @author Vicente Caballero Navarro
85
 */
86 5005 jorpiell
public class CADExtension extends Extension {
87 6174 caballero
        private static HashMap adapters=new HashMap();
88 4950 caballero
89 5115 caballero
        private static View view;
90 4950 caballero
91 5115 caballero
        private MapControl mapControl;
92 6192 caballero
        private static CADToolAdapter adapter=null;
93 4950 caballero
94 5115 caballero
        public static CADToolAdapter getCADToolAdapter() {
95 6880 cesar
                com.iver.andami.ui.mdiManager.IWindow view=PluginServices.getMDIManager().getActiveWindow();
96 6174 caballero
                if (view instanceof View) {
97
                        View v=(View)view;
98 7546 caballero
                        if (!adapters.containsKey(v.getModel())) {
99
                                adapters.put(v.getModel(),new CADToolAdapter());
100 6174 caballero
                        }
101 7546 caballero
                        adapter=(CADToolAdapter)adapters.get(v.getModel());
102 6192 caballero
                        return adapter;
103 6174 caballero
                }
104 6192 caballero
                return adapter;
105 6174 caballero
106 5115 caballero
        }
107 4950 caballero
108 5115 caballero
        /**
109
         * @see com.iver.andami.plugins.IExtension#initialize()
110
         */
111
        public void initialize() {
112 5478 caballero
113 5793 fjp
                // Registramos los Popup menus:
114 7674 caballero
        MenuEntry.register();
115 8929 caballero
        Snapping.register();
116 5373 fjp
                // Fijamos que los s?mbolos de dibujo tengan outline
117
                // TODO: Esto se debe configurar en el cuadro de di?logo de preferencias
118
                CADTool.drawingSymbol.setOutlined(true);
119
                CADTool.drawingSymbol.setOutlineColor(CADTool.drawingSymbol.getColor().darker());
120
                CADTool.modifySymbol.setOutlined(true);
121
                CADTool.modifySymbol.setOutlineColor(CADTool.modifySymbol.getColor().darker());
122
                CADTool.selectSymbol.setOutlined(true);
123
                CADTool.selectSymbol.setOutlineColor(CADTool.selectSymbol.getColor().darker());
124 3712 caballero
125 5478 caballero
126 5115 caballero
                CopyCADTool copy = new CopyCADTool();
127
                RotateCADTool rotate = new RotateCADTool();
128
                ScaleCADTool scale = new ScaleCADTool();
129 5884 caballero
                SymmetryCADTool symmetry=new SymmetryCADTool();
130 5115 caballero
                addCADTool("_copy", copy);
131
                addCADTool("_rotate", rotate);
132
                addCADTool("_scale", scale);
133 5884 caballero
                addCADTool("_symmetry", symmetry);
134
        // Registramos las teclas de acceso r?pido que vamos a usar.
135 5959 caballero
136 5845 fjp
                KeyStroke key = KeyStroke.getKeyStroke(KeyEvent.VK_F3, 0);
137 5959 caballero
                RefentAccelerator accRef = new RefentAccelerator();
138 5845 fjp
                PluginServices.registerKeyStroke(key, accRef);
139 5115 caballero
140 5845 fjp
                key = KeyStroke.getKeyStroke(KeyEvent.VK_F8, 0);
141 5959 caballero
                OrtoAccelerator accOrto = new OrtoAccelerator();
142 5845 fjp
                PluginServices.registerKeyStroke(key, accOrto);
143
144
                key = KeyStroke.getKeyStroke(KeyEvent.VK_F7, 0);
145 5959 caballero
                GridAccelerator accGrid = new GridAccelerator();
146 5845 fjp
                PluginServices.registerKeyStroke(key, accGrid);
147
148
                key = KeyStroke.getKeyStroke(KeyEvent.VK_F9, 0);
149 5959 caballero
                ForceCursorAccelerator accForce = new ForceCursorAccelerator();
150 5845 fjp
                PluginServices.registerKeyStroke(key, accForce);
151 5959 caballero
152
153 5115 caballero
                KeyboardFocusManager kfm = KeyboardFocusManager
154
                                .getCurrentKeyboardFocusManager();
155
                kfm.addKeyEventPostProcessor(new myKeyEventPostProcessor());
156
        }
157
158
        /**
159
         * @see com.iver.andami.plugins.IExtension#execute(java.lang.String)
160
         */
161
        public void execute(String s) {
162
                initFocus();
163
164
                if (s.equals("_spline") || s.equals("_copy")
165
                                || s.equals("_equidistance") || s.equals("_matriz")
166
                                || s.equals("_symmetry") || s.equals("_rotate")
167
                                || s.equals("_stretch") || s.equals("_scale")
168
                                || s.equals("_extend") || s.equals("_trim")
169 5884 caballero
                                || s.equals("_unit")
170 5115 caballero
                                || s.equals("_chaflan") || s.equals("_join")) {
171
                        setCADTool(s, true);
172
                }
173 6174 caballero
                CADToolAdapter cta=getCADToolAdapter();
174
                cta.configureMenu();
175 5115 caballero
        }
176
177
        public static void addCADTool(String name, CADTool c) {
178 6174 caballero
                CADToolAdapter.addCADTool(name, c);
179 3712 caballero
        }
180 5115 caballero
181
        public static void setCADTool(String text, boolean showCommand) {
182 6174 caballero
                CADToolAdapter cta=getCADToolAdapter();
183
                CADTool ct=cta.getCADTool(text);
184
185 5115 caballero
                if (ct == null)
186
                        throw new RuntimeException("No such cad tool");
187 6713 caballero
                cta.initializeFlatness();
188
                cta.initializeGrid();
189 6174 caballero
                cta.setCadTool(ct);
190 3712 caballero
                ct.init();
191 5115 caballero
                if (showCommand) {
192 6880 cesar
                        if (PluginServices.getMDIManager().getActiveWindow() instanceof View) {
193
                                View vista = (View) PluginServices.getMDIManager().getActiveWindow();
194 5959 caballero
                                vista.getConsolePanel().addText("\n" + ct.getName(),
195 5115 caballero
                                        JConsole.COMMAND);
196 6174 caballero
                                cta.askQuestion();
197 5959 caballero
                        }
198 4892 caballero
                }
199 5115 caballero
                // PluginServices.getMainFrame().setSelectedTool("SELECT");
200
                // PluginServices.getMainFrame().enableControls();
201 3712 caballero
        }
202
203 5115 caballero
        public static CADTool getCADTool() {
204 6174 caballero
                CADToolAdapter cta=getCADToolAdapter();
205
                return cta.getCadTool();
206 5115 caballero
        }
207
208
        /**
209
         * @see com.iver.andami.plugins.IExtension#isEnabled()
210
         */
211
        public boolean isEnabled() {
212 5560 fjp
                // initFocus();
213 5115 caballero
                return true;
214
        }
215
216
        /**
217
         * @see com.iver.andami.plugins.IExtension#isVisible()
218
         */
219
        public boolean isVisible() {
220
                if (EditionUtilities.getEditionStatus() == EditionUtilities.EDITION_STATUS_ONE_VECTORIAL_LAYER_ACTIVE_AND_EDITABLE) {
221 6880 cesar
                        view = (View) PluginServices.getMDIManager().getActiveWindow();
222 6604 caballero
                        mapControl = view.getMapControl();
223 5115 caballero
                        FLayer[] layers = mapControl.getMapContext().getLayers()
224
                                        .getActives();
225
                        if (!(layers[0] instanceof FLyrAnnotation)) {
226
                                return true;
227 4950 caballero
                        }
228 5115 caballero
                }
229 4950 caballero
                return false;
230 5115 caballero
        }
231
232 3712 caballero
        public MapControl getMapControl() {
233 6174 caballero
                return getEditionManager().getMapControl();
234 3712 caballero
        }
235
236 5115 caballero
        class KeyAction extends AbstractAction {
237
238 3712 caballero
                private String key;
239
240 5115 caballero
                public KeyAction(String key) {
241 3712 caballero
                        this.key = key;
242
                }
243
244 5115 caballero
                /*
245
                 * (non-Javadoc)
246
                 *
247 3712 caballero
                 * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
248
                 */
249
                public void actionPerformed(ActionEvent e) {
250
                        view.focusConsole(key);
251
                }
252
253
        }
254
255 5115 caballero
        class MyAction extends AbstractAction {
256 3712 caballero
                private String actionCommand;
257
258 5115 caballero
                public MyAction(String command) {
259 3712 caballero
                        actionCommand = command;
260
                }
261
262
                /**
263
                 * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
264
                 */
265
                public void actionPerformed(ActionEvent e) {
266 6174 caballero
                        CADToolAdapter cta=getCADToolAdapter();
267
                        cta.keyPressed(actionCommand);
268 3712 caballero
                }
269
270
        }
271 4432 caballero
272 4210 fjp
        /**
273
         * @author fjp
274
         *
275 5115 caballero
         * La idea es usar esto para recibir lo que el usuario escribe y enviarlo a
276
         * la consola de la vista para que salga por all?.
277 4210 fjp
         */
278 5115 caballero
        private class myKeyEventPostProcessor implements KeyEventPostProcessor {
279 3712 caballero
280 4210 fjp
                public boolean postProcessKeyEvent(KeyEvent e) {
281 4748 fjp
                        // System.out.println("KeyEvent e = " + e);
282 6174 caballero
                        CADToolAdapter cta=getCADToolAdapter();
283
                        if ((cta == null) || (view == null))
284 5115 caballero
                                return false;
285
286 7832 jmvivo
                        if (cta.getMapControl() == null){
287
                                return false;
288
                        }
289
290 5115 caballero
                        if (e.getID() != KeyEvent.KEY_RELEASED)
291
                                return false;
292
                        if (!(e.getComponent() instanceof JTextComponent)) {
293
                                if (e.getKeyCode() == KeyEvent.VK_DELETE)
294 6174 caballero
                                        cta.keyPressed("eliminar");
295 5115 caballero
                                else if (e.getKeyCode() == KeyEvent.VK_ESCAPE)
296 6174 caballero
                                        cta.keyPressed("escape");
297 5115 caballero
                                else if (e.getKeyCode() == KeyEvent.VK_ENTER) {
298
                                        // TODO: REVISAR ESTO CUANDO VIENE UN INTRO DESDE UN
299
                                        // JTEXTAREA
300
                                        // QUE NO ES EL DE CONSOLA
301 6528 caballero
                                        if (!(e.getSource() instanceof JTable))
302
                                                view.focusConsole("");
303 5115 caballero
                                }
304 5839 fjp
                                else if ((!e.isActionKey())) {
305 5227 caballero
                                                //if (Character.isLetterOrDigit(e.getKeyChar())) {
306 5115 caballero
                                                        Character keyChar = new Character(e.getKeyChar());
307
                                                        if (e.getComponent().getName() != null) {
308
                                                                System.out
309
                                                                                .println("Evento de teclado desde el componente "
310
                                                                                                + e.getComponent().getName());
311
                                                                if (!e.getComponent().getName().equals(
312
                                                                                "CADConsole")) {
313
                                                                        view.focusConsole(keyChar + "");
314
                                                                }
315
                                                        } else {
316
                                                                if (!(e.getComponent() instanceof JTextComponent)) {
317
                                                                        view.focusConsole(keyChar + "");
318
                                                                }
319
                                                        }
320 5227 caballero
                                                //}
321 5839 fjp
                                        }
322 5115 caballero
                                }
323 4210 fjp
                        return false;
324
                }
325 4432 caballero
326 4210 fjp
        }
327
328 5115 caballero
        /*
329
         * private void registerKeyStrokes(){ for (char key = '0'; key <= '9';
330
         * key++){ Character keyChar = new Character(key);
331
         * mapControl.getInputMap(MapControl.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(key),
332
         * keyChar); mapControl.getActionMap().put(keyChar, new
333
         * KeyAction(keyChar+"")); } for (char key = 'a'; key <= 'z'; key++){
334
         * Character keyChar = new Character(key);
335
         * mapControl.getInputMap(MapControl.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(key),
336
         * keyChar); mapControl.getActionMap().put(keyChar, new
337
         * KeyAction(keyChar+"")); } for (char key = 'A'; key <= 'Z'; key++){
338
         * Character keyChar = new Character(key);
339
         * mapControl.getInputMap(MapControl.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(key),
340
         * keyChar); mapControl.getActionMap().put(keyChar, new
341
         * KeyAction(keyChar+"")); }
342
         * //this.getInputMap(WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER,
343
         * 0), "enter"); //this.getActionMap().put("enter", new MyAction("enter"));
344
         * Character keyChar = new
345
         * Character(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0).getKeyChar());
346
         * mapControl.getInputMap(MapControl.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER,
347
         * 0),keyChar); mapControl.getActionMap().put(keyChar, new KeyAction(""));
348
         *  // El espacio como si fuera INTRO Character keyCharSpace = new
349
         * Character(' ');
350
         * mapControl.getInputMap(MapControl.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke('
351
         * '), keyCharSpace); mapControl.getActionMap().put(keyCharSpace, new
352
         * KeyAction(""));
353
         *
354
         *  }
355
         */
356
        private static JPopupMenu popup = new JPopupMenu();
357 4432 caballero
358 5115 caballero
        public static void clearMenu() {
359 3883 caballero
                popup.removeAll();
360
        }
361
362 5115 caballero
        public static void addMenuEntry(String text) {
363 3883 caballero
                JMenuItem menu = new JMenuItem(text);
364
                menu.setActionCommand(text);
365
                menu.setEnabled(true);
366
                menu.setVisible(true);
367
                menu.addActionListener(new ActionListener() {
368
                        public void actionPerformed(ActionEvent e) {
369 6174 caballero
                                CADToolAdapter cta=getCADToolAdapter();
370
                                cta.transition(e.getActionCommand());
371 3883 caballero
                        }
372
                });
373
374
                popup.add(menu);
375
        }
376 5115 caballero
377 3883 caballero
        public static void showPopup(MouseEvent e) {
378 5115 caballero
                popup.show(e.getComponent(), e.getX(), e.getY());
379
        }
380
381 3883 caballero
        public static View getView() {
382
                return view;
383
        }
384 4147 fjp
385 7832 jmvivo
        public static void clearView() {
386
                view = null;
387
        }
388
389 4147 fjp
        /**
390
         * @return Returns the editionManager.
391
         */
392
        public static EditionManager getEditionManager() {
393 6174 caballero
                CADToolAdapter cta=getCADToolAdapter();
394
                return cta.getEditionManager();
395 4147 fjp
        }
396 5115 caballero
397
        public static CADTool[] getCADTools() {
398 6174 caballero
                return CADToolAdapter.getCADTools();
399 4892 caballero
        }
400 4899 caballero
401 5115 caballero
        public static void initFocus() {
402 6880 cesar
                view = (View) PluginServices.getMDIManager().getActiveWindow();
403 6604 caballero
                MapControl mapControl = view.getMapControl();
404 6174 caballero
                CADToolAdapter cta=getCADToolAdapter();
405 5164 caballero
                if (!mapControl.getNamesMapTools().containsKey("cadtooladapter")){
406 5874 fjp
                        // StatusBarListener sbl=new StatusBarListener(view.getMapControl());
407
                        // mapControl.addMapTool("cadtooladapter",  new Behavior[]{adapter,new MouseMovementBehavior(sbl)});
408 6174 caballero
                        mapControl.addMapTool("cadtooladapter", cta);
409 5164 caballero
                }
410 5560 fjp
                // view.getMapControl().setTool("cadtooladapter");
411 5478 caballero
                JEditTextArea jeta=view.getConsolePanel().getTxt();
412
                jeta.requestFocusInWindow();
413
                jeta.setCaretPosition(jeta.getText().length());
414 5257 caballero
415 5115 caballero
                view.addConsoleListener("cad", new ResponseListener() {
416
                        public void acceptResponse(String response) {
417 6174 caballero
                                CADToolAdapter cta=getCADToolAdapter();
418
                                cta.textEntered(response);
419 5115 caballero
                                // TODO:
420
                                // FocusManager fm=FocusManager.getCurrentManager();
421
                                // fm.focusPreviousComponent(mapControl);
422
                                /*
423
                                 * if (popup.isShowing()){ popup.setVisible(false); }
424
                                 */
425
426
                        }
427
                });
428 6174 caballero
                cta.getEditionManager().setMapControl(mapControl);
429 5115 caballero
                view.getMapControl().setTool("cadtooladapter");
430 4899 caballero
        }
431 3712 caballero
}