Statistics
| Revision:

svn-gvsig-desktop / trunk / libraries / libUIComponent / src / org / gvsig / gui / beans / listview / ListViewComponent.java @ 12716

History | View | Annotate | Download (23.8 KB)

1
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
2
 *
3
 * Copyright (C) 2005 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
package org.gvsig.gui.beans.listview;
20

    
21
import java.awt.Color;
22
import java.awt.Dimension;
23
import java.awt.Graphics;
24
import java.awt.Graphics2D;
25
import java.awt.Image;
26
import java.awt.Point;
27
import java.awt.Rectangle;
28
import java.awt.RenderingHints;
29
import java.awt.event.ActionEvent;
30
import java.awt.event.ActionListener;
31
import java.awt.event.FocusEvent;
32
import java.awt.event.FocusListener;
33
import java.awt.event.InputEvent;
34
import java.awt.event.KeyEvent;
35
import java.awt.event.KeyListener;
36
import java.awt.event.MouseEvent;
37
import java.awt.event.MouseListener;
38
import java.awt.event.MouseMotionListener;
39
import java.util.ArrayList;
40
import java.util.Iterator;
41

    
42
import javax.swing.ButtonGroup;
43
import javax.swing.JComponent;
44
import javax.swing.JMenu;
45
import javax.swing.JPopupMenu;
46
import javax.swing.JRadioButtonMenuItem;
47
import javax.swing.JScrollPane;
48
import javax.swing.JTextField;
49
import javax.swing.JViewport;
50
import javax.swing.event.AncestorEvent;
51
import javax.swing.event.AncestorListener;
52
import javax.swing.event.ListSelectionEvent;
53
import javax.swing.event.ListSelectionListener;
54

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

    
67
        /**
68
         * Lista de los tipos de vista existentes
69
         */
70
        private ArrayList   painters       = new ArrayList();
71
        private ArrayList   paintersMenu   = new ArrayList();
72

    
73
        /**
74
         * Lista de items
75
         */
76
        private ArrayList   items          = new ArrayList();
77

    
78
        /**
79
         * Selecciona el tipo de vista
80
         */
81
        private int         view           = 0;
82

    
83
        /**
84
         * Booleano para saber si se permite la multiselecci?n
85
         */
86
        private boolean     multiSelect    = false;
87

    
88
        private Image       image          = null;
89
        private int         width          = 0;
90
        private int         height         = 0;
91
        private Graphics2D  widgetGraphics = null;
92
        private JMenu       jMenu          = null;
93
        private ButtonGroup buttonGroup    = null;
94
        private JPopupMenu  jPopupMenu     = null;
95

    
96
        private JTextField  jRenameEdit    = null;
97

    
98

    
99
        private int         itemEdited     = -1;
100
        private int         lastSelected   = -1;
101
        private int         cursorPos      = -1;
102

    
103

    
104
        private boolean     editable       = false;
105

    
106
        private ArrayList   actionCommandListeners = new ArrayList();
107

    
108

    
109
        /**
110
         * Construye un <code>ListViewComponent</code>
111
         *
112
         */
113
        public ListViewComponent() {
114
                setFocusable(true);
115

    
116
                initialize();
117
        }
118

    
119
        /**
120
         * Inicializa el <code>ListViewComponent</code>
121
         */
122
        private void initialize() {
123
                addListViewPainter(new PaintList(items));
124
                addListViewPainter(new SmallIcon(items));
125
                addListViewPainter(new LargeIcon(items));
126

    
127
                addAncestorListener(this);
128

    
129
                addKeyListener(this);
130
                addMouseListener(this);
131
                addMouseMotionListener(this);
132
        }
133

    
134
        /**
135
         * Obtiene que vista se esta usando en el componente
136
         * @return
137
         */
138
        public int getView() {
139
                return view;
140
        }
141

    
142
        /**
143
         * Define que vista es la que se va a usar
144
         * @param view
145
         */
146
        public void setView(int view) {
147
                this.view = view;
148
        }
149

    
150
        /**
151
         * Agrega una vista al componente
152
         * @param item
153
         */
154
        public void addListViewPainter(IListViewPainter item) {
155
                painters.add(item);
156

    
157
                JRadioButtonMenuItem jRadioButtonMenuItem = new JRadioButtonMenuItem();
158
                getButtonGroup().add(jRadioButtonMenuItem);
159

    
160
                jRadioButtonMenuItem.setText(item.getName());
161
                if (paintersMenu.size() == 0)
162
                        jRadioButtonMenuItem.setSelected(true);
163
                getJMenu().add(jRadioButtonMenuItem);
164

    
165
                jRadioButtonMenuItem.addActionListener(this);
166

    
167
                paintersMenu.add(jRadioButtonMenuItem);
168
        }
169

    
170
        /**
171
         * Agrega un item al componente
172
         * @param item
173
         */
174
        public void addItem(ListViewItem item) {
175
                addItem(item, false);
176
        }
177

    
178
        /**
179
         * Agrega un item al componente, si acceptRepeatNames es false no se aceptaran
180
         * nombres repetidos
181
         * @param item
182
         * @param acceptRepeatNames
183
         */
184
        public void addItem(ListViewItem item, boolean acceptRepeatNames) {
185
                items.add(item);
186
                if (!acceptRepeatNames)
187
                        changeName(item.getName(), items.size() - 1);
188

    
189
                viewItem(items.size() - 1);
190
        }
191

    
192
        /**
193
         * Agrega el item en la posicion especificada de la lista.
194
         * @param pos
195
         * @param item
196
         */
197
        public void addItem(int pos, ListViewItem item) {
198
                items.add(pos, item);
199
                changeName(item.getName(), pos);
200

    
201
                viewItem(pos);
202
        }
203

    
204
        /**
205
         * Agrega un item al componente
206
         * @param item
207
         */
208
        public void removeItem(int index) {
209
                items.remove(index);
210
                repaint();
211
        }
212

    
213
        /**
214
         * Borra todos los items seleccionados
215
         */
216
        public void removeSelecteds() {
217
                for (int i = (items.size()-1); i>=0; i--)
218
                        if (((ListViewItem) items.get(i)).isSelected())
219
                                items.remove(i);
220

    
221
                repaint();
222
        }
223

    
224
        /**
225
         * Devuelve un ArrayList con todos los items
226
         * @return
227
         */
228
        public ArrayList getItems() {
229
                return items;
230
        }
231

    
232
        private Graphics2D getWidgetGraphics() {
233
                getWidgetImage();
234
                return widgetGraphics;
235
        }
236

    
237
        private Image getWidgetImage() {
238
                int width2 = getVisibleRect().width;
239
                int height2 = getVisibleRect().height;
240
                if (width2 <= 0)
241
                        width2 = 1;
242
                if (height2 <= 0)
243
                        height2=1;
244

    
245
                if ((width != width2) || (height != height2)) {
246
                        image = createImage(width2, height2);
247
                        if (image == null)
248
                                return null;
249
                        widgetGraphics = (Graphics2D) image.getGraphics();
250
                }
251

    
252
                width = width2;
253
                height = height2;
254
                return image;
255
        }
256

    
257
        /**
258
         * Redibujar el componente en el graphics temporal
259
         */
260
        private void redrawBuffer() {
261
                if (getWidgetGraphics() == null)
262
                        return;
263

    
264
                /** desactivaci?n del anti-aliasing */
265
                getWidgetGraphics().setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
266
                getWidgetGraphics().setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);
267

    
268
                /** demanda de rendimiento r?pido */
269
                getWidgetGraphics().setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_SPEED);
270
                getWidgetGraphics().setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_SPEED);
271
                getWidgetGraphics().setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_OFF);
272
                getWidgetGraphics().setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_DISABLE);
273

    
274
                getWidgetGraphics().translate(-getVisibleRect().x, -getVisibleRect().y);
275
                getWidgetGraphics().setColor(Color.white);
276
                getWidgetGraphics().fillRect(getVisibleRect().x, getVisibleRect().y, getVisibleRect().width, getVisibleRect().height);
277

    
278
                ((IListViewPainter) painters.get(view)).paint((Graphics2D) getWidgetGraphics(), getVisibleRect());
279
                getWidgetGraphics().translate(getVisibleRect().x, getVisibleRect().y);
280
        }
281

    
282
        public void paint(Graphics g) {
283
                redrawBuffer();
284

    
285
                if (image != null)
286
                        g.drawImage(image, getVisibleRect().x, getVisibleRect().y, this);
287

    
288
                Dimension size = getPreferredSize();
289
                Dimension aux = ((IListViewPainter) painters.get(view)).getPreferredSize();
290
                if (!size.equals(aux)) {
291
                        setPreferredSize(aux);
292
                        setSize(aux);
293
                }
294

    
295
                if (getParent() instanceof JViewport) {
296
                        JViewport jViewport = (JViewport) getParent();
297
                        if (jViewport.getParent() instanceof JScrollPane) {
298
                                if (items.size() > 0)
299
                                        ((JScrollPane) jViewport.getParent()).getVerticalScrollBar().setUnitIncrement(((ListViewItem) items.get(0)).getItemRectangle().height);
300
                        }
301
                }
302
        }
303

    
304
        public boolean isMultiSelect() {
305
                return multiSelect;
306
        }
307

    
308
        public void setMultiSelect(boolean multiSelect) {
309
                if (multiSelect == false) {
310
                        for (int i = 0; i<items.size(); i++)
311
                                ((ListViewItem) items.get(i)).setSelected(false);
312
                        if ((lastSelected != -1) && (lastSelected < items.size()))
313
                                ((ListViewItem) items.get(lastSelected)).setSelected(true);
314
                }
315

    
316
                this.multiSelect = multiSelect;
317
                repaint();
318
        }
319

    
320
        private int getItem(int x, int y) {
321
                Point point = new Point(x, y);
322
                Rectangle rectangle = null;
323
                for (int i = 0; i < items.size(); i++) {
324
                        rectangle = ((ListViewItem) items.get(i)).getItemRectangle();
325
                        if ((rectangle != null) && (rectangle.getBounds().contains(point)))
326
                                return i;
327
                }
328

    
329
                return -1;
330
        }
331

    
332
        /*
333
         * (non-Javadoc)
334
         * @see java.awt.event.MouseListener#mousePressed(java.awt.event.MouseEvent)
335
         */
336
        public void mousePressed(MouseEvent e) {
337
                requestFocus();
338

    
339
                try {
340
                        if ((e.getModifiers() & InputEvent.BUTTON1_MASK) != InputEvent.BUTTON1_MASK)
341
                                return;
342

    
343
                        cursorPos = getItem(e.getX(), e.getY());
344
                        viewItem(cursorPos);
345
                        if (cursorPos == -1)
346
                                return;
347

    
348
                        if (isMultiSelect()) {
349
                                if ((e.getModifiers() & InputEvent.SHIFT_MASK) == InputEvent.SHIFT_MASK) {
350
                                        int pos1 = cursorPos;
351
                                        int pos2 = lastSelected;
352
                                        if (pos2 < pos1) {
353
                                                pos1 = lastSelected;
354
                                                pos2 = cursorPos;
355
                                        }
356

    
357
                                        if ((e.getModifiers() & InputEvent.CTRL_MASK) != InputEvent.CTRL_MASK)
358
                                                for (int i = 0; i < items.size(); i++)
359
                                                        ((ListViewItem) items.get(i)).setSelected(false);
360

    
361
                                        for (int i = pos1; i <= pos2; i++)
362
                                                ((ListViewItem) items.get(i)).setSelected(true);
363
                                        return;
364
                                }
365

    
366
                                lastSelected = cursorPos;
367

    
368
                                if ((e.getModifiers() & InputEvent.CTRL_MASK) == InputEvent.CTRL_MASK) {
369
                                        ((ListViewItem) items.get(cursorPos)).setSelected(!((ListViewItem) items.get(cursorPos)).isSelected());
370
                                        return;
371
                                }
372

    
373
                                for (int i = 0; i < items.size(); i++)
374
                                        ((ListViewItem) items.get(i)).setSelected(false);
375

    
376
                                ((ListViewItem) items.get(cursorPos)).setSelected(true);
377
                        } else {
378
                                boolean selected = true;
379

    
380
                                lastSelected = cursorPos;
381

    
382
                                if ((e.getModifiers() & InputEvent.CTRL_MASK) == InputEvent.CTRL_MASK)
383
                                        selected = !((ListViewItem) items.get(cursorPos)).isSelected();
384

    
385
                                for (int i = 0; i < items.size(); i++)
386
                                        ((ListViewItem) items.get(i)).setSelected(false);
387

    
388
                                ((ListViewItem) items.get(cursorPos)).setSelected(selected);
389
                        }
390
                } finally {
391
                        repaint();
392
                }
393
        }
394

    
395
        /**
396
         * Establece que un item debe estar visible en la vista
397
         * @param pos
398
         */
399
        private void viewItem(int pos) {
400
                if ((pos == -1) || (items.size()==0))
401
                        return;
402
                redrawBuffer();
403
                Dimension aux = ((IListViewPainter) painters.get(view)).getPreferredSize();
404
                setPreferredSize(aux);
405
                setSize(aux);
406

    
407
                if (pos < 0)
408
                        pos = 0;
409

    
410
                if (pos >= items.size())
411
                        pos = items.size() - 1;
412

    
413
                if (getParent() instanceof JViewport) {
414
                        JViewport jViewport = (JViewport) getParent();
415

    
416
                        if (jViewport.getParent() instanceof JScrollPane) {
417
                                ListViewItem lvi = ((ListViewItem) items.get(pos));
418
                                Rectangle rectangle = (Rectangle) lvi.getItemRectangle().clone();
419
                                if (rectangle == null)
420
                                        return;
421
                                rectangle.setLocation((int) rectangle.getX() - getVisibleRect().x, (int) rectangle.getY() - getVisibleRect().y);
422
                                jViewport.scrollRectToVisible(rectangle);
423
                                ((JScrollPane)jViewport.getParent()).getVerticalScrollBar().paintImmediately(((JScrollPane)jViewport.getParent()).getVerticalScrollBar().getVisibleRect());
424
                        }
425
                }
426
        }
427

    
428
        public void mouseDragged(MouseEvent e) {
429
                if ((e.getModifiers() & InputEvent.BUTTON1_MASK) != InputEvent.BUTTON1_MASK)
430
                        return;
431

    
432
                if (isMultiSelect()) {
433
                        if ((e.getModifiers() & InputEvent.SHIFT_MASK) == InputEvent.SHIFT_MASK)
434
                                return;
435
                        if ((e.getModifiers() & InputEvent.CTRL_MASK) == InputEvent.CTRL_MASK)
436
                                return;
437
                }
438

    
439
                int itemSelected = getItem(e.getX(), e.getY());
440

    
441
                if (itemSelected == -1)
442
                        return;
443

    
444
                lastSelected = itemSelected;
445
                cursorPos = itemSelected;
446

    
447
                for (int i = 0; i<items.size(); i++)
448
                        ((ListViewItem) items.get(i)).setSelected(false);
449

    
450
                ((ListViewItem) items.get(itemSelected)).setSelected(true);
451

    
452
                repaint();
453

    
454
                viewItem(itemSelected);
455
        }
456

    
457
        private JPopupMenu getPopupMenu() {
458
                if (jPopupMenu == null) {
459
                        jPopupMenu = new JPopupMenu();
460
                        getJMenu().setText("View");
461

    
462
                        jPopupMenu.add(getJMenu());
463
                }
464
                return jPopupMenu;
465
        }
466

    
467
        public void mouseReleased(MouseEvent e) {
468
                if ((e.getModifiers() & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK)
469
                        getPopupMenu().show(this, e.getX (), e.getY () );
470

    
471
                if ((e.getModifiers() & InputEvent.BUTTON1_MASK) == InputEvent.BUTTON1_MASK) {
472
                        fireSelectionValueChanged(1, 1, false);
473
                }
474
        }
475

    
476
        public void mouseMoved(MouseEvent e) {
477
                int itemSelected = getItem(e.getX(), e.getY());
478

    
479
                if (itemSelected == -1) {
480
                        setToolTipText(null);
481
                        return;
482
                }
483
                if (((ListViewItem) items.get(itemSelected)).isShowTooltip())
484
                        setToolTipText(((ListViewItem) items.get(itemSelected)).getName());
485
                else
486
                        setToolTipText(null);
487
        }
488

    
489
        private ButtonGroup getButtonGroup() {
490
                if (buttonGroup == null)
491
                        buttonGroup = new ButtonGroup();
492
                return buttonGroup;
493
        }
494

    
495
        private JMenu getJMenu() {
496
                if (jMenu == null)
497
                        jMenu = new JMenu();
498
                return jMenu;
499
        }
500

    
501
        /*
502
         * (non-Javadoc)
503
         * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
504
         */
505
        public void actionPerformed(ActionEvent e) {
506
                int pos = paintersMenu.indexOf(e.getSource());
507
                view = pos;
508
                viewItem(cursorPos);
509
        }
510

    
511
        /**
512
         * Returns an array of the values for the selected cells. The returned values
513
         * are sorted in increasing index order.
514
         *
515
         * @return the selected values or an empty list if nothing is selected
516
         */
517
        public ListViewItem[] getSelectedValues() {
518
                int cont = 0;
519
                for (int i = 0; i < items.size(); i++) {
520
                        if (((ListViewItem) items.get(i)).isSelected())
521
                                cont++;
522
                }
523
                ListViewItem[] values = new ListViewItem[cont];
524
                cont = 0;
525
                for (int i = 0; i < items.size(); i++) {
526
                        if (((ListViewItem) items.get(i)).isSelected()) {
527
                                values[cont] = (ListViewItem) items.get(i);
528
                                cont++;
529
                        }
530
                }
531

    
532
                return values;
533
        }
534

    
535
        /**
536
         * Returns the first selected index; returns -1 if there is no selected item.
537
         *
538
         * @return the value of <code>getMinSelectionIndex</code>
539
         */
540
        public int getSelectedIndex() {
541
                for (int i = 0; i < items.size(); i++) {
542
                        if (((ListViewItem) items.get(i)).isSelected())
543
                                return i;
544
                }
545
                return -1;
546
        }
547

    
548

    
549
        /**
550
         * Select the index value
551
         *
552
         * @return the value of <code>getMinSelectionIndex</code>
553
         */
554
        public void setSelectedIndex(int value) {
555
                if (value < 0)
556
                        value = 0;
557
                if (value >= items.size())
558
                        value = items.size() - 1;
559
                for (int i = 0; i < items.size(); i++) {
560
                        ((ListViewItem) items.get(i)).setSelected(i == value);
561
                }
562
                viewItem(value);
563
                update(getGraphics());
564
        }
565

    
566
        /**
567
         * Returns the first selected value, or <code>null</code> if the selection
568
         * is empty.
569
         *
570
         * @return the first selected value
571
         */
572
        public ListViewItem getSelectedValue() {
573
                for (int i = 0; i < items.size(); i++) {
574
                        if (((ListViewItem) items.get(i)).isSelected())
575
                                return (ListViewItem) items.get(i);
576
                }
577
                return null;
578
        }
579

    
580
        /**
581
         * Returns an array of all of the selected indices in increasing order.
582
         *
583
         * @return all of the selected indices, in increasing order
584
         */
585
        public int[] getSelectedIndices() {
586
                int cont = 0;
587
                for (int i = 0; i < items.size(); i++) {
588
                        if (((ListViewItem) items.get(i)).isSelected())
589
                                cont++;
590
                }
591
                int[] values = new int[cont];
592
                cont = 0;
593
                for (int i = 0; i < items.size(); i++) {
594
                        if (((ListViewItem) items.get(i)).isSelected()) {
595
                                values[cont] = i;
596
                                cont++;
597
                        }
598
                }
599

    
600
                return values;
601
        }
602

    
603
        /**
604
         * A?adir un listener a la lista de eventos
605
         * @param listener
606
         */
607
        public void addListSelectionListener(ListSelectionListener listener) {
608
                if (!actionCommandListeners.contains(listener))
609
                        actionCommandListeners.add(listener);
610
        }
611

    
612
        /**
613
         * Borrar un listener de la lista de eventos
614
         * @param listener
615
         */
616
        public void removeListSelectionListener(ListSelectionListener listener) {
617
                actionCommandListeners.remove(listener);
618
        }
619

    
620
        /**
621
         * Invocar a los eventos asociados al componente
622
         */
623
        private void fireSelectionValueChanged(int firstIndex, int lastIndex, boolean isAdjusting) {
624
                Iterator acIterator = actionCommandListeners.iterator();
625
                ListSelectionEvent e = null;
626
                while (acIterator.hasNext()) {
627
                        ListSelectionListener listener = (ListSelectionListener) acIterator.next();
628
                        if (e == null)
629
                                e = new ListSelectionEvent(this, firstIndex, lastIndex, isAdjusting);
630
                        listener.valueChanged(e);
631
                }
632
        }
633

    
634
        public void renameItem(int item) {
635
                if (!isEditable())
636
                        return;
637

    
638
                if ((item >= 0) && (item < items.size())) {
639
                        if (((ListViewItem) items.get(item)).isSelected()) {
640
                                Rectangle rectangle = ((ListViewItem) items.get(item)).getNameRectangle();
641

    
642
                                if (rectangle != null) {
643
                                        itemEdited = item;
644
                                        ((ListViewItem) items.get(itemEdited)).setSelected(false);
645
                                        repaint();
646
                                        this.setLayout(null);
647
                                        getJRenameEdit().setText(((ListViewItem) items.get(item)).getName());
648
                                        this.add(getJRenameEdit());
649
                                        getJRenameEdit().setBounds(rectangle);
650
                                        getJRenameEdit().addFocusListener(this);
651
                                        getJRenameEdit().addKeyListener(this);
652
                                        getJRenameEdit().requestFocus();
653
                                        getJRenameEdit().setSelectionStart(0);
654
                                        getJRenameEdit().setSelectionEnd(getJRenameEdit().getText().length());
655
                                }
656
                        }
657
                }
658
        }
659

    
660
        public JTextField getJRenameEdit() {
661
                if (jRenameEdit == null) {
662
                        jRenameEdit = new JTextField();
663
                }
664
                return jRenameEdit;
665
        }
666

    
667
        public void changeName(String newName, int pos) {
668
                newName = newName.trim();
669
                if (newName.length() == 0)
670
                        return;
671
                String newNameAux = newName;
672
                boolean isItem;
673
                int newNumber = 0;
674
                do {
675
                        isItem = false;
676
                        for (int i = 0; i < items.size(); i++) {
677
                                if ((i != pos) && (((ListViewItem) items.get(i)).getName().equals(newNameAux))) {
678
                                        isItem = true;
679
                                        newNumber++;
680
                                        newNameAux = newName + "_" + newNumber;
681
                                        break;
682
                                }
683
                        }
684
                } while (isItem);
685
                ((ListViewItem) items.get(pos)).setName(newNameAux);
686
        }
687

    
688
        public void closeRenameEdit() {
689
                if (jRenameEdit == null)
690
                        return;
691

    
692
                if (itemEdited != -1) {
693
                        changeName(getJRenameEdit().getText(), itemEdited);
694

    
695
                        ((ListViewItem) items.get(cursorPos)).setSelected(true);
696
                        itemEdited = -1;
697
                        repaint();
698
                }
699
                this.remove(getJRenameEdit());
700
                jRenameEdit = null;
701
                this.requestFocus();
702
        }
703

    
704
        /**
705
         * Mueve el cursor hacia abajo
706
         */
707
        private void moveDown() {
708
                int selItem = -1;
709

    
710
                for (int i = 0; i < items.size(); i++) {
711
                        if (cursorPos == i)
712
                                continue;
713
                        if (((ListViewItem) items.get(i)).getItemRectangle().y >= (((ListViewItem) items.get(cursorPos)).getItemRectangle().y + ((ListViewItem) items.get(cursorPos)).getItemRectangle().height)) {
714
                                if (((ListViewItem) items.get(i)).getItemRectangle().x == ((ListViewItem) items.get(cursorPos)).getItemRectangle().x) {
715
                                        selItem = i;
716
                                        break;
717
                                }
718
                        }
719
                }
720

    
721
                if (selItem != -1) {
722
                        cursorPos = selItem;
723
                        setSelectedIndex(selItem);
724
                }
725
        }
726

    
727
        /**
728
         * Mueve el cursor hacia la izquierda
729
         */
730
        private void moveLeft() {
731
                int selItem = -1;
732
                for (int i = items.size() - 1; i >= 0; i--) {
733
                        if (cursorPos == i)
734
                                continue;
735
                        if ((((ListViewItem) items.get(i)).getItemRectangle().x + ((ListViewItem) items.get(i)).getItemRectangle().width) <= ((ListViewItem) items.get(cursorPos)).getItemRectangle().x) {
736
                                if (((ListViewItem) items.get(i)).getItemRectangle().y == ((ListViewItem) items.get(cursorPos)).getItemRectangle().y) {
737
                                        selItem = i;
738
                                        break;
739
                                }
740
                        }
741
                }
742

    
743
                if (selItem != -1) {
744
                        cursorPos = selItem;
745
                        setSelectedIndex(selItem);
746
                }
747
        }
748

    
749
        /**
750
         * Mueve el cursor hacia la derecha
751
         */
752
        private void moveRight() {
753
                int selItem = -1;
754
                for (int i = 0; i < items.size(); i++) {
755
                        if (cursorPos == i)
756
                                continue;
757
                        if (((ListViewItem) items.get(i)).getItemRectangle().x >= (((ListViewItem) items.get(cursorPos)).getItemRectangle().x + ((ListViewItem) items.get(cursorPos)).getItemRectangle().width)) {
758
                                if (((ListViewItem) items.get(i)).getItemRectangle().y == ((ListViewItem) items.get(cursorPos)).getItemRectangle().y) {
759
                                        selItem = i;
760
                                        break;
761
                                }
762
                        }
763
                }
764

    
765
                if (selItem != -1) {
766
                        cursorPos = selItem;
767
                        setSelectedIndex(selItem);
768
                }
769
        }
770

    
771
        /**
772
         * Mueve el cursor hacia arriba
773
         */
774
        private void moveUp() {
775
                int selItem = -1;
776
                for (int i = items.size() - 1; i >= 0; i--) {
777
                        if (cursorPos == i)
778
                                continue;
779
                        if ((((ListViewItem) items.get(i)).getItemRectangle().y + ((ListViewItem) items.get(i)).getItemRectangle().height) <= ((ListViewItem) items.get(cursorPos)).getItemRectangle().y) {
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
        public void keyPressed(KeyEvent e) {
794
                if (e.getSource() == this) {
795
                        switch (e.getKeyCode()) {
796
                                case KeyEvent.VK_F2:
797
                                        renameItem(cursorPos);
798
                                        break;
799
                                case KeyEvent.VK_DOWN:
800
                                        moveDown();
801
                                        break;
802
                                case KeyEvent.VK_LEFT:
803
                                        moveLeft();
804
                                        break;
805
                                case KeyEvent.VK_RIGHT:
806
                                        moveRight();
807
                                        break;
808
                                case KeyEvent.VK_UP:
809
                                        moveUp();
810
                                        break;
811
                                case KeyEvent.VK_HOME:
812
                                        cursorPos = 0;
813
                                        setSelectedIndex(cursorPos);
814
                                        break;
815
                                case KeyEvent.VK_END:
816
                                        cursorPos = items.size() - 1;
817
                                        setSelectedIndex(cursorPos);
818
                                        break;
819
                                case KeyEvent.VK_PAGE_UP:
820
                                        if (items.size() > 0) {
821
                                                int cont = (int) Math.floor(this.getVisibleRect().getHeight() / ((ListViewItem) items.get(0)).getItemRectangle().height);
822
                                                for (int i = 0; i < cont; i++)
823
                                                        moveUp();
824
                                        }
825
                                        break;
826
                                case KeyEvent.VK_PAGE_DOWN:
827
                                        if (items.size() > 0) {
828
                                                int cont = (int) Math.floor(this.getVisibleRect().getHeight() / ((ListViewItem) items.get(0)).getItemRectangle().height);
829
                                                for (int i = 0; i < cont; i++)
830
                                                        moveDown();
831
                                        }
832
                                        break;
833
                        }
834
                        return;
835
                }
836
                if (e.getSource() == getJRenameEdit()) {
837
                        switch (e.getKeyCode()) {
838
                                case KeyEvent.VK_ESCAPE:
839
                                        getJRenameEdit().setText(((ListViewItem) items.get(itemEdited)).getName());
840
                                        closeRenameEdit();
841
                                        break;
842
                                case KeyEvent.VK_ENTER:
843
                                        closeRenameEdit();
844
                                        break;
845
                        }
846
                }
847
        }
848

    
849
        public void keyReleased(KeyEvent e) {
850
                switch (e.getKeyCode()) {
851
                        case KeyEvent.VK_DOWN:
852
                        case KeyEvent.VK_UP:
853
                        case KeyEvent.VK_LEFT:
854
                        case KeyEvent.VK_RIGHT:
855
                        case KeyEvent.VK_HOME:
856
                        case KeyEvent.VK_END:
857
                        case KeyEvent.VK_PAGE_UP:
858
                        case KeyEvent.VK_PAGE_DOWN:
859
                                fireSelectionValueChanged(cursorPos, cursorPos, false);
860
                                break;
861
                }
862
        }
863

    
864
        public void focusLost(FocusEvent e) {
865
                closeRenameEdit();
866
        }
867

    
868
        public void mouseClicked(MouseEvent e) {
869
                if (e.getSource() == this)
870
                        // Si es doble click y hay alg?n elemento seleccionado en la lista lo eliminamos
871
                        if (e.getClickCount() == 2) {
872
                                renameItem(cursorPos);
873
                        }
874
        }
875

    
876
        /**
877
         * Devuelve si se puede cambiar el nombre de los items
878
         * @return
879
         */
880
        public boolean isEditable() {
881
                return editable;
882
        }
883

    
884
        /**
885
         * Define si se puede cambiar el nombre de los items
886
         * @param editable
887
         */
888
        public void setEditable(boolean editable) {
889
                this.editable = editable;
890
        }
891

    
892
        /**
893
         * Quito los eventos del JScrollPane para gestionarlos yo
894
         */
895
        public void ancestorAdded(AncestorEvent event) {
896
                if (getParent() instanceof JViewport) {
897
                        JViewport jViewport = (JViewport) getParent();
898
                        if (jViewport.getParent() instanceof JScrollPane) {
899
                                ((JScrollPane) jViewport.getParent()).setActionMap(null);
900
                        }
901
                }
902
        }
903

    
904
        //[start] Codigo no usado
905
        public void mouseEntered(MouseEvent e) {}
906
        public void mouseExited(MouseEvent e) {}
907
        public void keyTyped(KeyEvent e) {}
908
        public void focusGained(FocusEvent e) {}
909
        public void ancestorMoved(AncestorEvent event) {}
910
        public void ancestorRemoved(AncestorEvent event) {}
911
        //[end]
912
}