Statistics
| Revision:

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

History | View | Annotate | Download (25.2 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.color.ColorSpace;
30
import java.awt.event.ActionEvent;
31
import java.awt.event.ActionListener;
32
import java.awt.event.FocusEvent;
33
import java.awt.event.FocusListener;
34
import java.awt.event.InputEvent;
35
import java.awt.event.KeyEvent;
36
import java.awt.event.KeyListener;
37
import java.awt.event.MouseEvent;
38
import java.awt.event.MouseListener;
39
import java.awt.event.MouseMotionListener;
40
import java.awt.image.BufferedImage;
41
import java.awt.image.ColorConvertOp;
42
import java.util.ArrayList;
43
import java.util.EventObject;
44
import java.util.Iterator;
45

    
46
import javax.swing.ButtonGroup;
47
import javax.swing.JComponent;
48
import javax.swing.JMenu;
49
import javax.swing.JPopupMenu;
50
import javax.swing.JRadioButtonMenuItem;
51
import javax.swing.JScrollPane;
52
import javax.swing.JTextField;
53
import javax.swing.JViewport;
54
import javax.swing.event.AncestorEvent;
55
import javax.swing.event.AncestorListener;
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
                        if (isEnabled()) {
289
                                g.drawImage(image, getVisibleRect().x, getVisibleRect().y, this);
290
                        } else {
291
                                // Dibujar en escala de grises y aclarado para cuando esta inactivo
292
                          BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
293

    
294
                                Graphics big = bi.createGraphics();
295
                                big.drawImage(image, 0, 0, this);
296

    
297
                                ColorConvertOp colorConvert = new ColorConvertOp(ColorSpace.getInstance(ColorSpace.CS_GRAY), null);
298
                                colorConvert.filter(bi, bi);
299

    
300
                                big.setColor(new Color(255, 255, 255, 164));
301
                                big.fillRect(0, 0, width, height);
302

    
303
                                g.drawImage(bi, getVisibleRect().x, getVisibleRect().y, this);
304
                        }
305
                }
306
                
307

    
308
                Dimension size = getPreferredSize();
309
                Dimension aux = ((IListViewPainter) painters.get(view)).getPreferredSize();
310
                if (!size.equals(aux)) {
311
                        setPreferredSize(aux);
312
                        setSize(aux);
313
                }
314

    
315
                if (getParent() instanceof JViewport) {
316
                        JViewport jViewport = (JViewport) getParent();
317
                        if (jViewport.getParent() instanceof JScrollPane) {
318
                                if (items.size() > 0)
319
                                        ((JScrollPane) jViewport.getParent()).getVerticalScrollBar().setUnitIncrement(((ListViewItem) items.get(0)).getItemRectangle().height);
320
                        }
321
                }
322
        }
323

    
324
        public boolean isMultiSelect() {
325
                return multiSelect;
326
        }
327

    
328
        public void setMultiSelect(boolean multiSelect) {
329
                if (multiSelect == false) {
330
                        for (int i = 0; i<items.size(); i++)
331
                                ((ListViewItem) items.get(i)).setSelected(false);
332
                        if ((lastSelected != -1) && (lastSelected < items.size()))
333
                                ((ListViewItem) items.get(lastSelected)).setSelected(true);
334
                }
335

    
336
                this.multiSelect = multiSelect;
337
                repaint();
338
        }
339

    
340
        private int getItem(int x, int y) {
341
                Point point = new Point(x, y);
342
                Rectangle rectangle = null;
343
                for (int i = 0; i < items.size(); i++) {
344
                        rectangle = ((ListViewItem) items.get(i)).getItemRectangle();
345
                        if ((rectangle != null) && (rectangle.getBounds().contains(point)))
346
                                return i;
347
                }
348

    
349
                return -1;
350
        }
351

    
352
        /*
353
         * (non-Javadoc)
354
         * @see java.awt.event.MouseListener#mousePressed(java.awt.event.MouseEvent)
355
         */
356
        public void mousePressed(MouseEvent e) {
357
                if (!isEnabled())
358
                        return;
359
                requestFocus();
360

    
361
                try {
362
                        if ((e.getModifiers() & InputEvent.BUTTON1_MASK) != InputEvent.BUTTON1_MASK)
363
                                return;
364

    
365
                        cursorPos = getItem(e.getX(), e.getY());
366
                        viewItem(cursorPos);
367
                        if (cursorPos == -1)
368
                                return;
369

    
370
                        if (isMultiSelect()) {
371
                                if ((e.getModifiers() & InputEvent.SHIFT_MASK) == InputEvent.SHIFT_MASK) {
372
                                        int pos1 = cursorPos;
373
                                        int pos2 = lastSelected;
374
                                        if (pos2 < pos1) {
375
                                                pos1 = lastSelected;
376
                                                pos2 = cursorPos;
377
                                        }
378

    
379
                                        if ((e.getModifiers() & InputEvent.CTRL_MASK) != InputEvent.CTRL_MASK)
380
                                                for (int i = 0; i < items.size(); i++)
381
                                                        ((ListViewItem) items.get(i)).setSelected(false);
382

    
383
                                        for (int i = pos1; i <= pos2; i++)
384
                                                ((ListViewItem) items.get(i)).setSelected(true);
385
                                        return;
386
                                }
387

    
388
                                lastSelected = cursorPos;
389

    
390
                                if ((e.getModifiers() & InputEvent.CTRL_MASK) == InputEvent.CTRL_MASK) {
391
                                        ((ListViewItem) items.get(cursorPos)).setSelected(!((ListViewItem) items.get(cursorPos)).isSelected());
392
                                        return;
393
                                }
394

    
395
                                for (int i = 0; i < items.size(); i++)
396
                                        ((ListViewItem) items.get(i)).setSelected(false);
397

    
398
                                ((ListViewItem) items.get(cursorPos)).setSelected(true);
399
                        } else {
400
                                boolean selected = true;
401

    
402
                                lastSelected = cursorPos;
403

    
404
                                if ((e.getModifiers() & InputEvent.CTRL_MASK) == InputEvent.CTRL_MASK)
405
                                        selected = !((ListViewItem) items.get(cursorPos)).isSelected();
406

    
407
                                for (int i = 0; i < items.size(); i++)
408
                                        ((ListViewItem) items.get(i)).setSelected(false);
409

    
410
                                ((ListViewItem) items.get(cursorPos)).setSelected(selected);
411
                        }
412
                } finally {
413
                        repaint();
414
                }
415
        }
416

    
417
        /**
418
         * Establece que un item debe estar visible en la vista
419
         * @param pos
420
         */
421
        private void viewItem(int pos) {
422
                if ((pos == -1) || (items.size()==0))
423
                        return;
424
                redrawBuffer();
425
                Dimension aux = ((IListViewPainter) painters.get(view)).getPreferredSize();
426
                setPreferredSize(aux);
427
                setSize(aux);
428

    
429
                if (pos < 0)
430
                        pos = 0;
431

    
432
                if (pos >= items.size())
433
                        pos = items.size() - 1;
434

    
435
                if (getParent() instanceof JViewport) {
436
                        JViewport jViewport = (JViewport) getParent();
437

    
438
                        if (jViewport.getParent() instanceof JScrollPane) {
439
                                ListViewItem lvi = ((ListViewItem) items.get(pos));
440
                                Rectangle rectangle = (Rectangle) lvi.getItemRectangle().clone();
441
                                if (rectangle == null)
442
                                        return;
443
                                rectangle.setLocation((int) rectangle.getX() - getVisibleRect().x, (int) rectangle.getY() - getVisibleRect().y);
444
                                jViewport.scrollRectToVisible(rectangle);
445
                                ((JScrollPane)jViewport.getParent()).getVerticalScrollBar().paintImmediately(((JScrollPane)jViewport.getParent()).getVerticalScrollBar().getVisibleRect());
446
                        }
447
                }
448
        }
449

    
450
        public void mouseDragged(MouseEvent e) {
451
                if (!isEnabled())
452
                        return;
453
                if ((e.getModifiers() & InputEvent.BUTTON1_MASK) != InputEvent.BUTTON1_MASK)
454
                        return;
455

    
456
                if (isMultiSelect()) {
457
                        if ((e.getModifiers() & InputEvent.SHIFT_MASK) == InputEvent.SHIFT_MASK)
458
                                return;
459
                        if ((e.getModifiers() & InputEvent.CTRL_MASK) == InputEvent.CTRL_MASK)
460
                                return;
461
                }
462

    
463
                int itemSelected = getItem(e.getX(), e.getY());
464

    
465
                if (itemSelected == -1)
466
                        return;
467

    
468
                lastSelected = itemSelected;
469
                cursorPos = itemSelected;
470

    
471
                for (int i = 0; i<items.size(); i++)
472
                        ((ListViewItem) items.get(i)).setSelected(false);
473

    
474
                ((ListViewItem) items.get(itemSelected)).setSelected(true);
475

    
476
                repaint();
477

    
478
                viewItem(itemSelected);
479
        }
480

    
481
        private JPopupMenu getPopupMenu() {
482
                if (jPopupMenu == null) {
483
                        jPopupMenu = new JPopupMenu();
484
                        getJMenu().setText("View");
485

    
486
                        jPopupMenu.add(getJMenu());
487
                }
488
                return jPopupMenu;
489
        }
490

    
491
        public void mouseReleased(MouseEvent e) {
492
                if (!isEnabled())
493
                        return;
494
                if ((e.getModifiers() & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK)
495
                        getPopupMenu().show(this, e.getX (), e.getY () );
496

    
497
                if ((e.getModifiers() & InputEvent.BUTTON1_MASK) == InputEvent.BUTTON1_MASK) {
498
                        fireSelectionValueChanged();
499
                }
500
        }
501

    
502
        public void mouseMoved(MouseEvent e) {
503
                if (!isEnabled())
504
                        return;
505
                int itemSelected = getItem(e.getX(), e.getY());
506

    
507
                if (itemSelected == -1) {
508
                        setToolTipText(null);
509
                        return;
510
                }
511
                if (((ListViewItem) items.get(itemSelected)).isShowTooltip())
512
                        setToolTipText(((ListViewItem) items.get(itemSelected)).getName());
513
                else
514
                        setToolTipText(null);
515
        }
516

    
517
        private ButtonGroup getButtonGroup() {
518
                if (buttonGroup == null)
519
                        buttonGroup = new ButtonGroup();
520
                return buttonGroup;
521
        }
522

    
523
        private JMenu getJMenu() {
524
                if (jMenu == null)
525
                        jMenu = new JMenu();
526
                return jMenu;
527
        }
528

    
529
        /*
530
         * (non-Javadoc)
531
         * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
532
         */
533
        public void actionPerformed(ActionEvent e) {
534
                int pos = paintersMenu.indexOf(e.getSource());
535
                view = pos;
536
                viewItem(cursorPos);
537
        }
538

    
539
        /**
540
         * Returns an array of the values for the selected cells. The returned values
541
         * are sorted in increasing index order.
542
         *
543
         * @return the selected values or an empty list if nothing is selected
544
         */
545
        public ListViewItem[] getSelectedValues() {
546
                int cont = 0;
547
                for (int i = 0; i < items.size(); i++) {
548
                        if (((ListViewItem) items.get(i)).isSelected())
549
                                cont++;
550
                }
551
                ListViewItem[] values = new ListViewItem[cont];
552
                cont = 0;
553
                for (int i = 0; i < items.size(); i++) {
554
                        if (((ListViewItem) items.get(i)).isSelected()) {
555
                                values[cont] = (ListViewItem) items.get(i);
556
                                cont++;
557
                        }
558
                }
559

    
560
                return values;
561
        }
562

    
563
        /**
564
         * Returns the first selected index; returns -1 if there is no selected item.
565
         *
566
         * @return the value of <code>getMinSelectionIndex</code>
567
         */
568
        public int getSelectedIndex() {
569
                for (int i = 0; i < items.size(); i++) {
570
                        if (((ListViewItem) items.get(i)).isSelected())
571
                                return i;
572
                }
573
                return -1;
574
        }
575

    
576

    
577
        /**
578
         * Select the index value
579
         *
580
         * @return the value of <code>getMinSelectionIndex</code>
581
         */
582
        public void setSelectedIndex(int value) {
583
                if (value < 0)
584
                        value = 0;
585
                if (value >= items.size())
586
                        value = items.size() - 1;
587
                for (int i = 0; i < items.size(); i++) {
588
                        ((ListViewItem) items.get(i)).setSelected(i == value);
589
                }
590
                viewItem(value);
591
                update(getGraphics());
592
        }
593

    
594
        /**
595
         * Returns the first selected value, or <code>null</code> if the selection
596
         * is empty.
597
         *
598
         * @return the first selected value
599
         */
600
        public ListViewItem getSelectedValue() {
601
                for (int i = 0; i < items.size(); i++) {
602
                        if (((ListViewItem) items.get(i)).isSelected())
603
                                return (ListViewItem) items.get(i);
604
                }
605
                return null;
606
        }
607

    
608
        /**
609
         * Returns an array of all of the selected indices in increasing order.
610
         *
611
         * @return all of the selected indices, in increasing order
612
         */
613
        public int[] getSelectedIndices() {
614
                int cont = 0;
615
                for (int i = 0; i < items.size(); i++) {
616
                        if (((ListViewItem) items.get(i)).isSelected())
617
                                cont++;
618
                }
619
                int[] values = new int[cont];
620
                cont = 0;
621
                for (int i = 0; i < items.size(); i++) {
622
                        if (((ListViewItem) items.get(i)).isSelected()) {
623
                                values[cont] = i;
624
                                cont++;
625
                        }
626
                }
627

    
628
                return values;
629
        }
630

    
631
        /**
632
         * A?adir un listener a la lista de eventos
633
         * @param listener
634
         */
635
        public void addListSelectionListener(ListViewListener listener) {
636
                if (!actionCommandListeners.contains(listener))
637
                        actionCommandListeners.add(listener);
638
        }
639

    
640
        /**
641
         * Borrar un listener de la lista de eventos
642
         * @param listener
643
         */
644
        public void removeListSelectionListener(ListViewListener listener) {
645
                actionCommandListeners.remove(listener);
646
        }
647

    
648
        /**
649
         * Invocar a los eventos asociados al componente
650
         */
651
        private void fireSelectionValueChanged() {
652
                Iterator acIterator = actionCommandListeners.iterator();
653
                EventObject e = null;
654
                while (acIterator.hasNext()) {
655
                        ListViewListener listener = (ListViewListener) acIterator.next();
656
                        if (e == null)
657
                                e = new EventObject(this);
658
                        listener.actionValueChanged(e);
659
                }
660
        }
661

    
662
        /**
663
         * Invocar a los eventos asociados al componente
664
         */
665
        private void fireItemNameChanged(String oldName, String newName) {
666
                Iterator acIterator = actionCommandListeners.iterator();
667
                EventObject e = null;
668
                while (acIterator.hasNext()) {
669
                        ListViewListener listener = (ListViewListener) acIterator.next();
670
                        if (e == null)
671
                                e = new EventObject(this);
672
                        listener.actionItemNameChanged(e, oldName, newName);
673
                }
674
        }
675
        public void renameItem(int item) {
676
                if (!isEditable())
677
                        return;
678

    
679
                if ((item >= 0) && (item < items.size())) {
680
                        if (((ListViewItem) items.get(item)).isSelected()) {
681
                                Rectangle rectangle = ((ListViewItem) items.get(item)).getNameRectangle();
682

    
683
                                if (rectangle != null) {
684
                                        itemEdited = item;
685
                                        ((ListViewItem) items.get(itemEdited)).setSelected(false);
686
                                        repaint();
687
                                        this.setLayout(null);
688
                                        getJRenameEdit().setText(((ListViewItem) items.get(item)).getName());
689
                                        this.add(getJRenameEdit());
690
                                        getJRenameEdit().setBounds(rectangle);
691
                                        getJRenameEdit().addFocusListener(this);
692
                                        getJRenameEdit().addKeyListener(this);
693
                                        getJRenameEdit().requestFocus();
694
                                        getJRenameEdit().setSelectionStart(0);
695
                                        getJRenameEdit().setSelectionEnd(getJRenameEdit().getText().length());
696
                                }
697
                        }
698
                }
699
        }
700

    
701
        public JTextField getJRenameEdit() {
702
                if (jRenameEdit == null) {
703
                        jRenameEdit = new JTextField();
704
                }
705
                return jRenameEdit;
706
         }
707

    
708
        public void changeName(String newName, int pos) {
709
                newName = newName.trim();
710
                if (newName.length() == 0)
711
                        return;
712
                String newNameAux = newName;
713
                boolean isItem;
714
                int newNumber = 0;
715
                do {
716
                        isItem = false;
717
                        for (int i = 0; i < items.size(); i++) {
718
                                if ((i != pos) && (((ListViewItem) items.get(i)).getName().equals(newNameAux))) {
719
                                        isItem = true;
720
                                        newNumber++;
721
                                        newNameAux = newName + "_" + newNumber;
722
                                        break;
723
                                }
724
                        }
725
                } while (isItem);
726
                ((ListViewItem) items.get(pos)).setName(newNameAux);
727
        }
728

    
729
        public void closeRenameEdit() {
730
                if (jRenameEdit == null)
731
                        return;
732

    
733
                if (itemEdited != -1) {
734
                        String oldName = ((ListViewItem) items.get(itemEdited)).getName();
735

    
736
                        changeName(getJRenameEdit().getText(), itemEdited);
737

    
738
                        fireItemNameChanged(oldName, ((ListViewItem) items.get(itemEdited)).getName());
739

    
740
                        ((ListViewItem) items.get(cursorPos)).setSelected(true);
741
                        itemEdited = -1;
742
                        repaint();
743
                }
744
                this.remove(getJRenameEdit());
745
                jRenameEdit = null;
746
                this.requestFocus();
747
        }
748

    
749
        /**
750
         * Mueve el cursor hacia abajo
751
         */
752
        private void moveDown() {
753
                int selItem = -1;
754

    
755
                for (int i = 0; i < items.size(); i++) {
756
                        if (cursorPos == i)
757
                                continue;
758
                        if (((ListViewItem) items.get(i)).getItemRectangle().y >= (((ListViewItem) items.get(cursorPos)).getItemRectangle().y + ((ListViewItem) items.get(cursorPos)).getItemRectangle().height)) {
759
                                if (((ListViewItem) items.get(i)).getItemRectangle().x == ((ListViewItem) items.get(cursorPos)).getItemRectangle().x) {
760
                                        selItem = i;
761
                                        break;
762
                                }
763
                        }
764
                }
765

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

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

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

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

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

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

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

    
838
        public void keyPressed(KeyEvent e) {
839
                if (e.getSource() == this) {
840
                        switch (e.getKeyCode()) {
841
                                case KeyEvent.VK_F2:
842
                                        renameItem(cursorPos);
843
                                        break;
844
                                case KeyEvent.VK_DOWN:
845
                                        moveDown();
846
                                        break;
847
                                case KeyEvent.VK_LEFT:
848
                                        moveLeft();
849
                                        break;
850
                                case KeyEvent.VK_RIGHT:
851
                                        moveRight();
852
                                        break;
853
                                case KeyEvent.VK_UP:
854
                                        moveUp();
855
                                        break;
856
                                case KeyEvent.VK_HOME:
857
                                        cursorPos = 0;
858
                                        setSelectedIndex(cursorPos);
859
                                        break;
860
                                case KeyEvent.VK_END:
861
                                        cursorPos = items.size() - 1;
862
                                        setSelectedIndex(cursorPos);
863
                                        break;
864
                                case KeyEvent.VK_PAGE_UP:
865
                                        if (items.size() > 0) {
866
                                                int cont = (int) Math.floor(this.getVisibleRect().getHeight() / ((ListViewItem) items.get(0)).getItemRectangle().height);
867
                                                for (int i = 0; i < cont; i++)
868
                                                        moveUp();
869
                                        }
870
                                        break;
871
                                case KeyEvent.VK_PAGE_DOWN:
872
                                        if (items.size() > 0) {
873
                                                int cont = (int) Math.floor(this.getVisibleRect().getHeight() / ((ListViewItem) items.get(0)).getItemRectangle().height);
874
                                                for (int i = 0; i < cont; i++)
875
                                                        moveDown();
876
                                        }
877
                                        break;
878
                        }
879
                        return;
880
                }
881
                if (e.getSource() == getJRenameEdit()) {
882
                        switch (e.getKeyCode()) {
883
                                case KeyEvent.VK_ESCAPE:
884
                                        getJRenameEdit().setText(((ListViewItem) items.get(itemEdited)).getName());
885
                                        closeRenameEdit();
886
                                        break;
887
                                case KeyEvent.VK_ENTER:
888
                                        closeRenameEdit();
889
                                        break;
890
                        }
891
                }
892
        }
893

    
894
        public void keyReleased(KeyEvent e) {
895
                switch (e.getKeyCode()) {
896
                        case KeyEvent.VK_DOWN:
897
                        case KeyEvent.VK_UP:
898
                        case KeyEvent.VK_LEFT:
899
                        case KeyEvent.VK_RIGHT:
900
                        case KeyEvent.VK_HOME:
901
                        case KeyEvent.VK_END:
902
                        case KeyEvent.VK_PAGE_UP:
903
                        case KeyEvent.VK_PAGE_DOWN:
904
                                fireSelectionValueChanged();
905
                                break;
906
                }
907
        }
908

    
909
        public void focusLost(FocusEvent e) {
910
                closeRenameEdit();
911
        }
912

    
913
        public void mouseClicked(MouseEvent e) {
914
                if (!isEnabled())
915
                        return;
916
                if (e.getSource() == this)
917
                        // Si es doble click y hay alg?n elemento seleccionado en la lista lo eliminamos
918
                        if (e.getClickCount() == 2) {
919
                                renameItem(cursorPos);
920
                        }
921
        }
922

    
923
        /**
924
         * Devuelve si se puede cambiar el nombre de los items
925
         * @return
926
         */
927
        public boolean isEditable() {
928
                return editable;
929
        }
930

    
931
        /**
932
         * Define si se puede cambiar el nombre de los items
933
         * @param editable
934
         */
935
        public void setEditable(boolean editable) {
936
                this.editable = editable;
937
        }
938

    
939
        /**
940
         * Quito los eventos del JScrollPane para gestionarlos yo
941
         */
942
        public void ancestorAdded(AncestorEvent event) {
943
                if (getParent() instanceof JViewport) {
944
                        JViewport jViewport = (JViewport) getParent();
945
                        if (jViewport.getParent() instanceof JScrollPane) {
946
                                ((JScrollPane) jViewport.getParent()).setActionMap(null);
947
                        }
948
                }
949
        }
950

    
951
        /* (non-Javadoc)
952
   * @see javax.swing.JComponent#setEnabled(boolean)
953
   */
954
  public void setEnabled(boolean enabled) {
955
          super.setEnabled(enabled);
956
          update(getGraphics());
957
  }
958
        
959
        //[start] Codigo no usado
960
        public void mouseEntered(MouseEvent e) {}
961
        public void mouseExited(MouseEvent e) {}
962
        public void keyTyped(KeyEvent e) {}
963
        public void focusGained(FocusEvent e) {}
964
        public void ancestorMoved(AncestorEvent event) {}
965
        public void ancestorRemoved(AncestorEvent event) {}
966
        //[end]
967
}