Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.library / org.gvsig.ui / src / main / java / org / gvsig / gui / beans / listview / ListViewComponent.java @ 40561

History | View | Annotate | Download (26 KB)

1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2013 gvSIG Association.
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 3
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 * For any additional information, do not hesitate to contact us
22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
23
 */
24
package org.gvsig.gui.beans.listview;
25

    
26
import java.awt.Color;
27
import java.awt.Dimension;
28
import java.awt.Graphics;
29
import java.awt.Graphics2D;
30
import java.awt.Image;
31
import java.awt.Point;
32
import java.awt.Rectangle;
33
import java.awt.RenderingHints;
34
import java.awt.color.ColorSpace;
35
import java.awt.event.ActionEvent;
36
import java.awt.event.ActionListener;
37
import java.awt.event.FocusEvent;
38
import java.awt.event.FocusListener;
39
import java.awt.event.InputEvent;
40
import java.awt.event.KeyEvent;
41
import java.awt.event.KeyListener;
42
import java.awt.event.MouseEvent;
43
import java.awt.event.MouseListener;
44
import java.awt.event.MouseMotionListener;
45
import java.awt.image.BufferedImage;
46
import java.awt.image.ColorConvertOp;
47
import java.util.ArrayList;
48
import java.util.Arrays;
49
import java.util.EventObject;
50
import java.util.Iterator;
51

    
52
import javax.swing.ButtonGroup;
53
import javax.swing.JComponent;
54
import javax.swing.JMenu;
55
import javax.swing.JPopupMenu;
56
import javax.swing.JRadioButtonMenuItem;
57
import javax.swing.JScrollPane;
58
import javax.swing.JTextField;
59
import javax.swing.JViewport;
60
import javax.swing.event.AncestorEvent;
61
import javax.swing.event.AncestorListener;
62

    
63
import org.gvsig.gui.beans.listview.painters.LargeIcon;
64
import org.gvsig.gui.beans.listview.painters.PaintList;
65
import org.gvsig.gui.beans.listview.painters.SmallIcon;
66
/**
67
 * Componente grafico para representar una lista de valores
68
 *
69
 * @version 28/06/2007
70
 * @author BorSanZa - Borja S?nchez Zamorano (borja.sanchez@iver.es)
71
 */
72
public class ListViewComponent extends JComponent implements MouseListener, MouseMotionListener, ActionListener, KeyListener, FocusListener, AncestorListener {
73
        private static final long serialVersionUID = 6177600314634665863L;
74

    
75
        /**
76
         * Lista de los tipos de vista existentes
77
         */
78
        private ArrayList<IListViewPainter> painters = new ArrayList<IListViewPainter>();
79
        private ArrayList<JRadioButtonMenuItem> paintersMenu = new ArrayList<JRadioButtonMenuItem>();
80

    
81
        /**
82
         * Lista de items
83
         */
84
        private ArrayList<ListViewItem> items = new ArrayList<ListViewItem>();
85

    
86
        /**
87
         * Selecciona el tipo de vista
88
         */
89
        private int         view           = 0;
90

    
91
        /**
92
         * Booleano para saber si se permite la multiselecci?n
93
         */
94
        private boolean     multiSelect    = false;
95

    
96
        private Image       image          = null;
97
        private int         width          = 0;
98
        private int         height         = 0;
99
        private Graphics2D  widgetGraphics = null;
100
        private JMenu       jMenu          = null;
101
        private ButtonGroup buttonGroup    = null;
102
        private JPopupMenu  jPopupMenu     = null;
103

    
104
        private JTextField  jRenameEdit    = null;
105

    
106

    
107
        private int         itemEdited     = -1;
108
        private int         lastSelected   = -1;
109
        private int         cursorPos      = -1;
110

    
111

    
112
        private boolean     editable       = false;
113

    
114
        private ArrayList<ListViewListener> actionCommandListeners = new ArrayList<ListViewListener>();
115

    
116
        private ListViewItem  lastSelectedItem = null;
117

    
118
        /**
119
         * Construye un <code>ListViewComponent</code>
120
         *
121
         */
122
        public ListViewComponent() {
123
                setFocusable(true);
124

    
125
                initialize();
126
        }
127

    
128
        /**
129
         * Inicializa el <code>ListViewComponent</code>
130
         */
131
        private void initialize() {
132
                addListViewPainter(new PaintList(items));
133
                addListViewPainter(new SmallIcon(items));
134
                addListViewPainter(new LargeIcon(items));
135

    
136
                addAncestorListener(this);
137

    
138
                addKeyListener(this);
139
                addMouseListener(this);
140
                addMouseMotionListener(this);
141
        }
142

    
143
        /**
144
         * Obtiene que vista se esta usando en el componente
145
         * @return
146
         */
147
        public int getView() {
148
                return view;
149
        }
150

    
151
        /**
152
         * Define que vista es la que se va a usar
153
         * @param view
154
         */
155
        public void setView(int view) {
156
                this.view = view;
157
        }
158

    
159
        /**
160
         * Agrega una vista al componente
161
         * @param item
162
         */
163
        public void addListViewPainter(IListViewPainter item) {
164
                painters.add(item);
165

    
166
                JRadioButtonMenuItem jRadioButtonMenuItem = new JRadioButtonMenuItem();
167
                getButtonGroup().add(jRadioButtonMenuItem);
168

    
169
                jRadioButtonMenuItem.setText(item.getName());
170
                if (paintersMenu.size() == 0)
171
                        jRadioButtonMenuItem.setSelected(true);
172
                getJMenu().add(jRadioButtonMenuItem);
173

    
174
                jRadioButtonMenuItem.addActionListener(this);
175

    
176
                paintersMenu.add(jRadioButtonMenuItem);
177
        }
178
        
179
        /**
180
         * Sorts the specified array of objects into ascending order
181
         */
182
        public void sort() {
183
                Object[] list = items.toArray();
184
                Arrays.sort(list);
185
                items.clear();
186
                for (int i = 0; i < list.length; i++) 
187
                        items.add((ListViewItem)list[i]);
188
        }
189

    
190
        /**
191
         * Agrega un item al componente
192
         * @param item
193
         */
194
        public void addItem(ListViewItem item) {
195
                addItem(item, false);
196
        }
197

    
198
        /**
199
         * Agrega un item al componente, si acceptRepeatNames es false no se aceptaran
200
         * nombres repetidos
201
         * @param item
202
         * @param acceptRepeatNames
203
         */
204
        public void addItem(ListViewItem item, boolean acceptRepeatNames) {
205
                items.add(item);
206
                if (!acceptRepeatNames)
207
                        changeName(item.getName(), items.size() - 1);
208

    
209
                viewItem(items.size() - 1);
210
        }
211

    
212
        /**
213
         * Agrega el item en la posicion especificada de la lista.
214
         * @param pos
215
         * @param item
216
         */
217
        public void addItem(int pos, ListViewItem item) {
218
                items.add(pos, item);
219
                changeName(item.getName(), pos);
220

    
221
                viewItem(pos);
222
        }
223

    
224
        /**
225
         * Agrega un item al componente
226
         * @param item
227
         */
228
        public void removeItem(int index) {
229
                items.remove(index);
230
                repaint();
231
        }
232

    
233
        /**
234
         * Borra todos los items seleccionados
235
         */
236
        public void removeSelecteds() {
237
                for (int i = (items.size()-1); i>=0; i--)
238
                        if (((ListViewItem) items.get(i)).isSelected())
239
                                items.remove(i);
240

    
241
                repaint();
242
        }
243

    
244
        /**
245
         * Devuelve un ArrayList con todos los items
246
         * @return
247
         */
248
        @SuppressWarnings("unchecked")
249
        public ArrayList getItems() {
250
                return items;
251
        }
252

    
253
        private Graphics2D getWidgetGraphics() {
254
                getWidgetImage();
255
                return widgetGraphics;
256
        }
257

    
258
        private Image getWidgetImage() {
259
                int width2 = getVisibleRect().width;
260
                int height2 = getVisibleRect().height;
261
                if (width2 <= 0)
262
                        width2 = 1;
263
                if (height2 <= 0)
264
                        height2=1;
265

    
266
                if ((width != width2) || (height != height2)) {
267
                        image = createImage(width2, height2);
268
                        if (image == null)
269
                                return null;
270
                        widgetGraphics = (Graphics2D) image.getGraphics();
271
                }
272

    
273
                width = width2;
274
                height = height2;
275
                return image;
276
        }
277

    
278
        /**
279
         * Redibujar el componente en el graphics temporal
280
         */
281
        private void redrawBuffer() {
282
                if (getWidgetGraphics() == null)
283
                        return;
284

    
285
                /** desactivaci?n del anti-aliasing */
286
                getWidgetGraphics().setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
287
                getWidgetGraphics().setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);
288

    
289
                /** demanda de rendimiento r?pido */
290
                getWidgetGraphics().setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_SPEED);
291
                getWidgetGraphics().setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_SPEED);
292
                getWidgetGraphics().setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_OFF);
293
                getWidgetGraphics().setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_DISABLE);
294

    
295
                getWidgetGraphics().translate(-getVisibleRect().x, -getVisibleRect().y);
296
                getWidgetGraphics().setColor(Color.white);
297
                getWidgetGraphics().fillRect(getVisibleRect().x, getVisibleRect().y, getVisibleRect().width, getVisibleRect().height);
298

    
299
                ((IListViewPainter) painters.get(view)).paint((Graphics2D) getWidgetGraphics(), getVisibleRect());
300
                getWidgetGraphics().translate(getVisibleRect().x, getVisibleRect().y);
301
        }
302

    
303
        public void paint(Graphics g) {
304
                redrawBuffer();
305

    
306
                if (image != null) {
307
                        if (isEnabled()) {
308
                                g.drawImage(image, getVisibleRect().x, getVisibleRect().y, this);
309
                        } else {
310
                                // Dibujar en escala de grises y aclarado para cuando esta inactivo
311
                                BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
312

    
313
                                Graphics big = bi.createGraphics();
314
                                big.drawImage(image, 0, 0, this);
315

    
316
                                ColorConvertOp colorConvert = new ColorConvertOp(ColorSpace.getInstance(ColorSpace.CS_GRAY), null);
317
                                colorConvert.filter(bi, bi);
318

    
319
                                big.setColor(new Color(255, 255, 255, 164));
320
                                big.fillRect(0, 0, width, height);
321

    
322
                                g.drawImage(bi, getVisibleRect().x, getVisibleRect().y, this);
323
                        }
324
                }
325

    
326

    
327
                Dimension size = getPreferredSize();
328
                Dimension aux = ((IListViewPainter) painters.get(view)).getPreferredSize();
329
                if (!size.equals(aux)) {
330
                        setPreferredSize(aux);
331
                        setSize(aux);
332
                }
333

    
334
                if (getParent() instanceof JViewport) {
335
                        JViewport jViewport = (JViewport) getParent();
336
                        if (jViewport.getParent() instanceof JScrollPane) {
337
                                if (items.size() > 0)
338
                                        ((JScrollPane) jViewport.getParent()).getVerticalScrollBar().setUnitIncrement(((ListViewItem) items.get(0)).getItemRectangle().height);
339
                        }
340
                }
341
        }
342

    
343
        public boolean isMultiSelect() {
344
                return multiSelect;
345
        }
346

    
347
        public void setMultiSelect(boolean multiSelect) {
348
                if (multiSelect == false) {
349
                        for (int i = 0; i<items.size(); i++)
350
                                ((ListViewItem) items.get(i)).setSelected(false);
351
                        if ((lastSelected != -1) && (lastSelected < items.size()))
352
                                ((ListViewItem) items.get(lastSelected)).setSelected(true);
353
                }
354

    
355
                this.multiSelect = multiSelect;
356
                repaint();
357
        }
358

    
359
        private int getItem(int x, int y) {
360
                Point point = new Point(x, y);
361
                Rectangle rectangle = null;
362
                for (int i = 0; i < items.size(); i++) {
363
                        rectangle = ((ListViewItem) items.get(i)).getItemRectangle();
364
                        if ((rectangle != null) && (rectangle.getBounds().contains(point)))
365
                                return i;
366
                }
367

    
368
                return -1;
369
        }
370

    
371
        /*
372
         * (non-Javadoc)
373
         * @see java.awt.event.MouseListener#mousePressed(java.awt.event.MouseEvent)
374
         */
375
        public void mousePressed(MouseEvent e) {
376
                if (!isEnabled())
377
                        return;
378
                requestFocus();
379

    
380
                try {
381
                        if ((e.getModifiers() & InputEvent.BUTTON1_MASK) != InputEvent.BUTTON1_MASK)
382
                                return;
383

    
384
                        cursorPos = getItem(e.getX(), e.getY());
385
                        viewItem(cursorPos);
386
                        if (cursorPos == -1)
387
                                return;
388

    
389
                        if (isMultiSelect()) {
390
                                if ((e.getModifiers() & InputEvent.SHIFT_MASK) == InputEvent.SHIFT_MASK) {
391
                                        int pos1 = cursorPos;
392
                                        int pos2 = lastSelected;
393
                                        if (pos2 < pos1) {
394
                                                pos1 = lastSelected;
395
                                                pos2 = cursorPos;
396
                                        }
397

    
398
                                        if ((e.getModifiers() & InputEvent.CTRL_MASK) != InputEvent.CTRL_MASK)
399
                                                for (int i = 0; i < items.size(); i++)
400
                                                        ((ListViewItem) items.get(i)).setSelected(false);
401

    
402
                                        for (int i = pos1; i <= pos2; i++)
403
                                                ((ListViewItem) items.get(i)).setSelected(true);
404
                                        return;
405
                                }
406

    
407
                                lastSelected = cursorPos;
408

    
409
                                if ((e.getModifiers() & InputEvent.CTRL_MASK) == InputEvent.CTRL_MASK) {
410
                                        ((ListViewItem) items.get(cursorPos)).setSelected(!((ListViewItem) items.get(cursorPos)).isSelected());
411
                                        return;
412
                                }
413

    
414
                                for (int i = 0; i < items.size(); i++)
415
                                        ((ListViewItem) items.get(i)).setSelected(false);
416

    
417
                                ((ListViewItem) items.get(cursorPos)).setSelected(true);
418
                        } else {
419
                                boolean selected = true;
420

    
421
                                lastSelected = cursorPos;
422

    
423
                                if ((e.getModifiers() & InputEvent.CTRL_MASK) == InputEvent.CTRL_MASK)
424
                                        selected = !((ListViewItem) items.get(cursorPos)).isSelected();
425

    
426
                                for (int i = 0; i < items.size(); i++)
427
                                        ((ListViewItem) items.get(i)).setSelected(false);
428

    
429
                                ((ListViewItem) items.get(cursorPos)).setSelected(selected);
430
                        }
431
                } finally {
432
                        repaint();
433
                }
434
        }
435

    
436
        /**
437
         * Establece que un item debe estar visible en la vista
438
         * @param pos
439
         */
440
        private void viewItem(int pos) {
441
                if ((pos == -1) || (items.size()==0))
442
                        return;
443
                redrawBuffer();
444
                Dimension aux = ((IListViewPainter) painters.get(view)).getPreferredSize();
445
                setPreferredSize(aux);
446
                setSize(aux);
447

    
448
                if (pos < 0)
449
                        pos = 0;
450

    
451
                if (pos >= items.size())
452
                        pos = items.size() - 1;
453

    
454
                if (getParent() instanceof JViewport) {
455
                        JViewport jViewport = (JViewport) getParent();
456

    
457
                        if (jViewport.getParent() instanceof JScrollPane) {
458
                                ListViewItem lvi = ((ListViewItem) items.get(pos));
459
                                Rectangle rectangle = (Rectangle) lvi.getItemRectangle().clone();
460
                                if (rectangle == null)
461
                                        return;
462
                                rectangle.setLocation((int) rectangle.getX() - getVisibleRect().x, (int) rectangle.getY() - getVisibleRect().y);
463
                                jViewport.scrollRectToVisible(rectangle);
464
                                ((JScrollPane)jViewport.getParent()).getVerticalScrollBar().paintImmediately(((JScrollPane)jViewport.getParent()).getVerticalScrollBar().getVisibleRect());
465
                        }
466
                }
467
        }
468

    
469
        public void mouseDragged(MouseEvent e) {
470
                if (!isEnabled())
471
                        return;
472
                if ((e.getModifiers() & InputEvent.BUTTON1_MASK) != InputEvent.BUTTON1_MASK)
473
                        return;
474

    
475
                if (isMultiSelect()) {
476
                        if ((e.getModifiers() & InputEvent.SHIFT_MASK) == InputEvent.SHIFT_MASK)
477
                                return;
478
                        if ((e.getModifiers() & InputEvent.CTRL_MASK) == InputEvent.CTRL_MASK)
479
                                return;
480
                }
481

    
482
                int itemSelected = getItem(e.getX(), e.getY());
483

    
484
                if (itemSelected == -1)
485
                        return;
486

    
487
                lastSelected = itemSelected;
488
                cursorPos = itemSelected;
489

    
490
                for (int i = 0; i<items.size(); i++)
491
                        ((ListViewItem) items.get(i)).setSelected(false);
492

    
493
                ((ListViewItem) items.get(itemSelected)).setSelected(true);
494

    
495
                repaint();
496

    
497
                viewItem(itemSelected);
498
        }
499

    
500
        private JPopupMenu getPopupMenu() {
501
                if (jPopupMenu == null) {
502
                        jPopupMenu = new JPopupMenu();
503
                        getJMenu().setText("View");
504

    
505
                        jPopupMenu.add(getJMenu());
506
                }
507
                return jPopupMenu;
508
        }
509

    
510
        public void mouseReleased(MouseEvent e) {
511
                if (!isEnabled())
512
                        return;
513
                if ((e.getModifiers() & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK)
514
                        getPopupMenu().show(this, e.getX (), e.getY () );
515

    
516
                if ((e.getModifiers() & InputEvent.BUTTON1_MASK) == InputEvent.BUTTON1_MASK) {
517
                        fireSelectionValueChanged();
518
                }
519
        }
520

    
521
        public void mouseMoved(MouseEvent e) {
522
                if (!isEnabled())
523
                        return;
524
                int itemSelected = getItem(e.getX(), e.getY());
525

    
526
                if (itemSelected == -1) {
527
                        setToolTipText(null);
528
                        return;
529
                }
530
                if (((ListViewItem) items.get(itemSelected)).isShowTooltip())
531
                        setToolTipText(((ListViewItem) items.get(itemSelected)).getName());
532
                else
533
                        setToolTipText(null);
534
        }
535

    
536
        private ButtonGroup getButtonGroup() {
537
                if (buttonGroup == null)
538
                        buttonGroup = new ButtonGroup();
539
                return buttonGroup;
540
        }
541

    
542
        private JMenu getJMenu() {
543
                if (jMenu == null)
544
                        jMenu = new JMenu();
545
                return jMenu;
546
        }
547

    
548
        /*
549
         * (non-Javadoc)
550
         * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
551
         */
552
        public void actionPerformed(ActionEvent e) {
553
                int pos = paintersMenu.indexOf(e.getSource());
554
                view = pos;
555
                viewItem(cursorPos);
556
        }
557

    
558
        /**
559
         * Returns an array of the values for the selected cells. The returned values
560
         * are sorted in increasing index order.
561
         *
562
         * @return the selected values or an empty list if nothing is selected
563
         */
564
        public ListViewItem[] getSelectedValues() {
565
                int cont = 0;
566
                for (int i = 0; i < items.size(); i++) {
567
                        if (((ListViewItem) items.get(i)).isSelected())
568
                                cont++;
569
                }
570
                ListViewItem[] values = new ListViewItem[cont];
571
                cont = 0;
572
                for (int i = 0; i < items.size(); i++) {
573
                        if (((ListViewItem) items.get(i)).isSelected()) {
574
                                values[cont] = (ListViewItem) items.get(i);
575
                                cont++;
576
                        }
577
                }
578

    
579
                return values;
580
        }
581

    
582
        /**
583
         * Returns the first selected index; returns -1 if there is no selected item.
584
         *
585
         * @return the value of <code>getMinSelectionIndex</code>
586
         */
587
        public int getSelectedIndex() {
588
                for (int i = 0; i < items.size(); i++) {
589
                        if (((ListViewItem) items.get(i)).isSelected())
590
                                return i;
591
                }
592
                return -1;
593
        }
594

    
595

    
596
        /**
597
         * Select the index value
598
         *
599
         * @return the value of <code>getMinSelectionIndex</code>
600
         */
601
        public void setSelectedIndex(int value) {
602
                if (value < 0)
603
                        value = 0;
604
                if (value >= items.size())
605
                        value = items.size() - 1;
606
                for (int i = 0; i < items.size(); i++) {
607
                        ((ListViewItem) items.get(i)).setSelected(i == value);
608
                }
609
                lastSelectedItem = getSelectedValue();
610
                viewItem(value);
611
                update(getGraphics());
612
        }
613

    
614
        /**
615
         * Returns the first selected value, or <code>null</code> if the selection
616
         * is empty.
617
         *
618
         * @return the first selected value
619
         */
620
        public ListViewItem getSelectedValue() {
621
                for (int i = 0; i < items.size(); i++) {
622
                        if (((ListViewItem) items.get(i)).isSelected())
623
                                return (ListViewItem) items.get(i);
624
                }
625
                return null;
626
        }
627

    
628
        /**
629
         * Returns an array of all of the selected indices in increasing order.
630
         *
631
         * @return all of the selected indices, in increasing order
632
         */
633
        public int[] getSelectedIndices() {
634
                int cont = 0;
635
                for (int i = 0; i < items.size(); i++) {
636
                        if (((ListViewItem) items.get(i)).isSelected())
637
                                cont++;
638
                }
639
                int[] values = new int[cont];
640
                cont = 0;
641
                for (int i = 0; i < items.size(); i++) {
642
                        if (((ListViewItem) items.get(i)).isSelected()) {
643
                                values[cont] = i;
644
                                cont++;
645
                        }
646
                }
647

    
648
                return values;
649
        }
650

    
651
        /**
652
         * A?adir un listener a la lista de eventos
653
         * @param listener
654
         */
655
        public void addListSelectionListener(ListViewListener listener) {
656
                if (!actionCommandListeners.contains(listener))
657
                        actionCommandListeners.add(listener);
658
        }
659

    
660
        /**
661
         * Borrar un listener de la lista de eventos
662
         * @param listener
663
         */
664
        public void removeListSelectionListener(ListViewListener listener) {
665
                actionCommandListeners.remove(listener);
666
        }
667

    
668
        /**
669
         * Invocar a los eventos asociados al componente
670
         */
671
        private void fireSelectionValueChanged() {
672
                lastSelectedItem = getSelectedValue();
673
                Iterator<ListViewListener> acIterator = actionCommandListeners.iterator();
674
                EventObject e = null;
675
                while (acIterator.hasNext()) {
676
                        ListViewListener listener = acIterator.next();
677
                        if (e == null)
678
                                e = new EventObject(this);
679
                        listener.actionValueChanged(e);
680
                }
681
        }
682

    
683
        /**
684
         * Invocar a los eventos asociados al componente
685
         */
686
        private void fireItemNameChanged(String oldName, ListViewItem item) {
687
                Iterator<ListViewListener> acIterator = actionCommandListeners.iterator();
688
                EventObject e = null;
689
                while (acIterator.hasNext()) {
690
                        ListViewListener listener = acIterator.next();
691
                        if (e == null)
692
                                e = new EventObject(this);
693
                        listener.actionItemNameChanged(e, oldName, item);
694
                }
695
        }
696
        public void renameItem(int item) {
697
                if (!isEditable())
698
                        return;
699

    
700
                if ((item >= 0) && (item < items.size())) {
701
                        if (((ListViewItem) items.get(item)).isSelected()) {
702
                                Rectangle rectangle = ((ListViewItem) items.get(item)).getNameRectangle();
703

    
704
                                if (rectangle != null) {
705
                                        itemEdited = item;
706
                                        ((ListViewItem) items.get(itemEdited)).setSelected(false);
707
                                        repaint();
708
                                        this.setLayout(null);
709
                                        getJRenameEdit().setText(((ListViewItem) items.get(item)).getName());
710
                                        this.add(getJRenameEdit());
711
                                        getJRenameEdit().setBounds(rectangle);
712
                                        getJRenameEdit().addFocusListener(this);
713
                                        getJRenameEdit().addKeyListener(this);
714
                                        getJRenameEdit().requestFocus();
715
                                        getJRenameEdit().setSelectionStart(0);
716
                                        getJRenameEdit().setSelectionEnd(getJRenameEdit().getText().length());
717
                                }
718
                        }
719
                }
720
        }
721

    
722
        public JTextField getJRenameEdit() {
723
                if (jRenameEdit == null) {
724
                        jRenameEdit = new JTextField();
725
                }
726
                return jRenameEdit;
727
         }
728

    
729
        public void changeName(String newName, int pos) {
730
                newName = newName.trim();
731
                if (newName.length() == 0)
732
                        return;
733
                String newNameAux = newName;
734
                boolean isItem;
735
                int newNumber = 0;
736
                do {
737
                        isItem = false;
738
                        for (int i = 0; i < items.size(); i++) {
739
                                if ((i != pos) && (((ListViewItem) items.get(i)).getName().equals(newNameAux))) {
740
                                        isItem = true;
741
                                        newNumber++;
742
                                        newNameAux = newName + "_" + newNumber;
743
                                        break;
744
                                }
745
                        }
746
                } while (isItem);
747
                ((ListViewItem) items.get(pos)).setName(newNameAux);
748
        }
749

    
750
        public void closeRenameEdit() {
751
                if (jRenameEdit == null)
752
                        return;
753

    
754
                if (itemEdited != -1) {
755
                        String oldName = ((ListViewItem) items.get(itemEdited)).getName();
756

    
757
                        changeName(getJRenameEdit().getText(), itemEdited);
758

    
759
                        fireItemNameChanged(oldName, (ListViewItem) items.get(itemEdited));
760

    
761
                        ((ListViewItem) items.get(cursorPos)).setSelected(true);
762
                        itemEdited = -1;
763
                        repaint();
764
                }
765
                this.remove(getJRenameEdit());
766
                jRenameEdit = null;
767
                this.requestFocus();
768
        }
769

    
770
        /**
771
         * Mueve el cursor hacia abajo
772
         */
773
        private void moveDown() {
774
                int selItem = -1;
775

    
776
                for (int i = 0; i < items.size(); i++) {
777
                        if (cursorPos == i)
778
                                continue;
779
                        if (((ListViewItem) items.get(i)).getItemRectangle().y >= (((ListViewItem) items.get(cursorPos)).getItemRectangle().y + ((ListViewItem) items.get(cursorPos)).getItemRectangle().height)) {
780
                                if (((ListViewItem) items.get(i)).getItemRectangle().x == ((ListViewItem) items.get(cursorPos)).getItemRectangle().x) {
781
                                        selItem = i;
782
                                        break;
783
                                }
784
                        }
785
                }
786

    
787
                if (selItem != -1) {
788
                        cursorPos = selItem;
789
                        setSelectedIndex(selItem);
790
                }
791
        }
792

    
793
        /**
794
         * Mueve el cursor hacia la izquierda
795
         */
796
        private void moveLeft() {
797
                int selItem = -1;
798
                for (int i = items.size() - 1; i >= 0; i--) {
799
                        if (cursorPos == i)
800
                                continue;
801
                        if ((((ListViewItem) items.get(i)).getItemRectangle().x + ((ListViewItem) items.get(i)).getItemRectangle().width) <= ((ListViewItem) items.get(cursorPos)).getItemRectangle().x) {
802
                                if (((ListViewItem) items.get(i)).getItemRectangle().y == ((ListViewItem) items.get(cursorPos)).getItemRectangle().y) {
803
                                        selItem = i;
804
                                        break;
805
                                }
806
                        }
807
                }
808

    
809
                if (selItem != -1) {
810
                        cursorPos = selItem;
811
                        setSelectedIndex(selItem);
812
                }
813
        }
814

    
815
        /**
816
         * Mueve el cursor hacia la derecha
817
         */
818
        private void moveRight() {
819
                int selItem = -1;
820
                for (int i = 0; i < items.size(); i++) {
821
                        if (cursorPos == i)
822
                                continue;
823
                        if (((ListViewItem) items.get(i)).getItemRectangle().x >= (((ListViewItem) items.get(cursorPos)).getItemRectangle().x + ((ListViewItem) items.get(cursorPos)).getItemRectangle().width)) {
824
                                if (((ListViewItem) items.get(i)).getItemRectangle().y == ((ListViewItem) items.get(cursorPos)).getItemRectangle().y) {
825
                                        selItem = i;
826
                                        break;
827
                                }
828
                        }
829
                }
830

    
831
                if (selItem != -1) {
832
                        cursorPos = selItem;
833
                        setSelectedIndex(selItem);
834
                }
835
        }
836

    
837
        /**
838
         * Mueve el cursor hacia arriba
839
         */
840
        private void moveUp() {
841
                int selItem = -1;
842
                for (int i = items.size() - 1; i >= 0; i--) {
843
                        if (cursorPos == i)
844
                                continue;
845
                        if ((((ListViewItem) items.get(i)).getItemRectangle().y + ((ListViewItem) items.get(i)).getItemRectangle().height) <= ((ListViewItem) items.get(cursorPos)).getItemRectangle().y) {
846
                                if (((ListViewItem) items.get(i)).getItemRectangle().x == ((ListViewItem) items.get(cursorPos)).getItemRectangle().x) {
847
                                        selItem = i;
848
                                        break;
849
                                }
850
                        }
851
                }
852

    
853
                if (selItem != -1) {
854
                        cursorPos = selItem;
855
                        setSelectedIndex(selItem);
856
                }
857
        }
858

    
859
        public void keyPressed(KeyEvent e) {
860
                if (e.getSource() == this) {
861
                        switch (e.getKeyCode()) {
862
                                case KeyEvent.VK_F2:
863
                                        renameItem(cursorPos);
864
                                        break;
865
                                case KeyEvent.VK_DOWN:
866
                                        moveDown();
867
                                        break;
868
                                case KeyEvent.VK_LEFT:
869
                                        moveLeft();
870
                                        break;
871
                                case KeyEvent.VK_RIGHT:
872
                                        moveRight();
873
                                        break;
874
                                case KeyEvent.VK_UP:
875
                                        moveUp();
876
                                        break;
877
                                case KeyEvent.VK_HOME:
878
                                        cursorPos = 0;
879
                                        setSelectedIndex(cursorPos);
880
                                        break;
881
                                case KeyEvent.VK_END:
882
                                        cursorPos = items.size() - 1;
883
                                        setSelectedIndex(cursorPos);
884
                                        break;
885
                                case KeyEvent.VK_PAGE_UP:
886
                                        if (items.size() > 0) {
887
                                                int cont = (int) Math.floor(this.getVisibleRect().getHeight() / ((ListViewItem) items.get(0)).getItemRectangle().height);
888
                                                for (int i = 0; i < cont; i++)
889
                                                        moveUp();
890
                                        }
891
                                        break;
892
                                case KeyEvent.VK_PAGE_DOWN:
893
                                        if (items.size() > 0) {
894
                                                int cont = (int) Math.floor(this.getVisibleRect().getHeight() / ((ListViewItem) items.get(0)).getItemRectangle().height);
895
                                                for (int i = 0; i < cont; i++)
896
                                                        moveDown();
897
                                        }
898
                                        break;
899
                        }
900
                        return;
901
                }
902
                if (e.getSource() == getJRenameEdit()) {
903
                        switch (e.getKeyCode()) {
904
                                case KeyEvent.VK_ESCAPE:
905
                                        getJRenameEdit().setText(((ListViewItem) items.get(itemEdited)).getName());
906
                                        closeRenameEdit();
907
                                        break;
908
                                case KeyEvent.VK_ENTER:
909
                                        closeRenameEdit();
910
                                        break;
911
                        }
912
                }
913
        }
914

    
915
        public void keyReleased(KeyEvent e) {
916
                if (e.getSource() == this) {
917
                        switch (e.getKeyCode()) {
918
                                case KeyEvent.VK_DOWN:
919
                                case KeyEvent.VK_UP:
920
                                case KeyEvent.VK_LEFT:
921
                                case KeyEvent.VK_RIGHT:
922
                                case KeyEvent.VK_HOME:
923
                                case KeyEvent.VK_END:
924
                                case KeyEvent.VK_PAGE_UP:
925
                                case KeyEvent.VK_PAGE_DOWN:
926
                                        fireSelectionValueChanged();
927
                                        break;
928
                        }
929
                }
930
        }
931

    
932
        public void focusLost(FocusEvent e) {
933
                closeRenameEdit();
934
        }
935

    
936
        public void mouseClicked(MouseEvent e) {
937
                if (!isEnabled())
938
                        return;
939
                if (e.getSource() == this)
940
                        // Si es doble click y hay alg?n elemento seleccionado en la lista lo eliminamos
941
                        if (e.getClickCount() == 2) {
942
                                renameItem(cursorPos);
943
                        }
944
        }
945

    
946
        /**
947
         * Devuelve si se puede cambiar el nombre de los items
948
         * @return
949
         */
950
        public boolean isEditable() {
951
                return editable;
952
        }
953

    
954
        /**
955
         * Define si se puede cambiar el nombre de los items
956
         * @param editable
957
         */
958
        public void setEditable(boolean editable) {
959
                this.editable = editable;
960
        }
961

    
962
        /**
963
         * Quito los eventos del JScrollPane para gestionarlos yo
964
         */
965
        public void ancestorAdded(AncestorEvent event) {
966
                if (getParent() instanceof JViewport) {
967
                        JViewport jViewport = (JViewport) getParent();
968
                        if (jViewport.getParent() instanceof JScrollPane) {
969
                                ((JScrollPane) jViewport.getParent()).setActionMap(null);
970
                        }
971
                }
972
        }
973

    
974
        /**
975
         * Devuelve el ?ltimo item seleccionado. Solo el que provoco el evento.
976
         * @return
977
         */
978
        public ListViewItem getLastSelectedItem() {
979
                return lastSelectedItem;
980
        }
981

    
982
        /* (non-Javadoc)
983
         * @see javax.swing.JComponent#setEnabled(boolean)
984
         */
985
        public void setEnabled(boolean enabled) {
986
                super.setEnabled(enabled);
987
                update(getGraphics());
988
        }
989

    
990
        //[start] Codigo no usado
991
        public void mouseEntered(MouseEvent e) {}
992
        public void mouseExited(MouseEvent e) {}
993
        public void keyTyped(KeyEvent e) {}
994
        public void focusGained(FocusEvent e) {}
995
        public void ancestorMoved(AncestorEvent event) {}
996
        public void ancestorRemoved(AncestorEvent event) {}
997
        //[end]
998
}