Statistics
| Revision:

root / trunk / libraries / libUIComponent / src / org / gvsig / gui / beans / listview / ListViewComponent.java @ 12838

History | View | Annotate | Download (23.9 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.awt.image.ColorModel;
40
import java.util.ArrayList;
41
import java.util.Iterator;
42

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

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

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

    
75
        /**
76
         * Lista de items
77
         */
78
        private ArrayList   items          = new ArrayList();
79

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

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

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

    
98
        private JTextField  jRenameEdit    = null;
99

    
100

    
101
        private int         itemEdited     = -1;
102
        private int         lastSelected   = -1;
103
        private int         cursorPos      = -1;
104

    
105

    
106
        private boolean     editable       = false;
107

    
108
        private ArrayList   actionCommandListeners = new ArrayList();
109

    
110

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

    
118
                initialize();
119
        }
120

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

    
129
                addAncestorListener(this);
130

    
131
                addKeyListener(this);
132
                addMouseListener(this);
133
                addMouseMotionListener(this);
134
        }
135

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

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

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

    
159
                JRadioButtonMenuItem jRadioButtonMenuItem = new JRadioButtonMenuItem();
160
                getButtonGroup().add(jRadioButtonMenuItem);
161

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

    
167
                jRadioButtonMenuItem.addActionListener(this);
168

    
169
                paintersMenu.add(jRadioButtonMenuItem);
170
        }
171

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

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

    
191
                viewItem(items.size() - 1);
192
        }
193

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

    
203
                viewItem(pos);
204
        }
205

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

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

    
223
                repaint();
224
        }
225

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

    
234
        private Graphics2D getWidgetGraphics() {
235
                getWidgetImage();
236
                return widgetGraphics;
237
        }
238

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

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

    
254
                width = width2;
255
                height = height2;
256
                return image;
257
        }
258

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

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

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

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

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

    
284
        public void paint(Graphics g) {
285
                redrawBuffer();
286

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

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

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

    
306
        public boolean isMultiSelect() {
307
                return multiSelect;
308
        }
309

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

    
318
                this.multiSelect = multiSelect;
319
                repaint();
320
        }
321

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

    
331
                return -1;
332
        }
333

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

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

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

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

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

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

    
368
                                lastSelected = cursorPos;
369

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

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

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

    
382
                                lastSelected = cursorPos;
383

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

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

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

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

    
409
                if (pos < 0)
410
                        pos = 0;
411

    
412
                if (pos >= items.size())
413
                        pos = items.size() - 1;
414

    
415
                if (getParent() instanceof JViewport) {
416
                        JViewport jViewport = (JViewport) getParent();
417

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

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

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

    
441
                int itemSelected = getItem(e.getX(), e.getY());
442

    
443
                if (itemSelected == -1)
444
                        return;
445

    
446
                lastSelected = itemSelected;
447
                cursorPos = itemSelected;
448

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

    
452
                ((ListViewItem) items.get(itemSelected)).setSelected(true);
453

    
454
                repaint();
455

    
456
                viewItem(itemSelected);
457
        }
458

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

    
464
                        jPopupMenu.add(getJMenu());
465
                }
466
                return jPopupMenu;
467
        }
468

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

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

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

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

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

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

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

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

    
534
                return values;
535
        }
536

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

    
550

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

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

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

    
602
                return values;
603
        }
604

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

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

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

    
636
        public void renameItem(int item) {
637
                if (!isEditable())
638
                        return;
639

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

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

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

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

    
690
        public void closeRenameEdit() {
691
                if (jRenameEdit == null)
692
                        return;
693

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

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

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

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

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

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

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

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

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

    
773
        /**
774
         * Mueve el cursor hacia arriba
775
         */
776
        private void moveUp() {
777
                int selItem = -1;
778
                for (int i = items.size() - 1; i >= 0; i--) {
779
                        if (cursorPos == i)
780
                                continue;
781
                        if ((((ListViewItem) items.get(i)).getItemRectangle().y + ((ListViewItem) items.get(i)).getItemRectangle().height) <= ((ListViewItem) items.get(cursorPos)).getItemRectangle().y) {
782
                                if (((ListViewItem) items.get(i)).getItemRectangle().x == ((ListViewItem) items.get(cursorPos)).getItemRectangle().x) {
783
                                        selItem = i;
784
                                        break;
785
                                }
786
                        }
787
                }
788

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

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

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

    
866
        public void focusLost(FocusEvent e) {
867
                closeRenameEdit();
868
        }
869

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

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

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

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

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