20 package net.sf.gridarta.gui.dialog.gomap;
22 import java.awt.BorderLayout;
23 import java.awt.Component;
24 import java.awt.Dialog.ModalityType;
25 import java.awt.Window;
26 import java.awt.event.MouseEvent;
27 import java.awt.event.MouseListener;
28 import java.awt.event.WindowEvent;
29 import java.awt.event.WindowListener;
30 import java.io.IOException;
31 import java.util.Collection;
32 import java.util.Comparator;
33 import java.util.List;
34 import java.util.TreeSet;
35 import javax.swing.JComponent;
36 import javax.swing.JDialog;
37 import javax.swing.JList;
38 import javax.swing.JPanel;
39 import javax.swing.JScrollPane;
40 import javax.swing.JTextField;
41 import javax.swing.ListSelectionModel;
42 import javax.swing.ScrollPaneConstants;
43 import javax.swing.SwingUtilities;
44 import javax.swing.border.EmptyBorder;
45 import javax.swing.event.DocumentEvent;
46 import javax.swing.event.DocumentListener;
47 import javax.swing.text.JTextComponent;
60 import net.
sf.japi.swing.action.ActionBuilder;
61 import net.
sf.japi.swing.action.ActionBuilderFactory;
62 import net.
sf.japi.swing.action.ActionMethod;
63 import org.jetbrains.annotations.NotNull;
75 private static final ActionBuilder
ACTION_BUILDER = ActionBuilderFactory.getInstance().getActionBuilder(
"net.sf.gridarta");
87 private final JTextComponent
input;
125 public int compare(@NotNull
final MapFile o1, @NotNull
final MapFile o2) {
131 return name2 ==
null ? 0 : -1;
138 final int cmp = name1.compareToIgnoreCase(name2);
139 return cmp == 0 ? o1.getFile().compareTo(o2.getFile()) : cmp;
153 public void valueAdded(@NotNull
final MapFile value) {
158 public void valueRemoved(@NotNull
final MapFile value) {
163 public void nameChanged() {
168 public void pendingChanged() {
173 public void indexingFinished() {
189 public void windowOpened(
final WindowEvent e) {
198 public void windowClosing(
final WindowEvent e) {
203 public void windowClosed(
final WindowEvent e) {
211 public void windowIconified(
final WindowEvent e) {
216 public void windowDeiconified(
final WindowEvent e) {
221 public void windowActivated(
final WindowEvent e) {
226 public void windowDeactivated(
final WindowEvent e) {
240 public void change() {
245 SwingUtilities.invokeLater(() -> {
266 input =
new JTextField();
277 final DocumentListener documentListener =
new DocumentListener() {
280 public void changedUpdate(@NotNull
final DocumentEvent e) {
285 public void insertUpdate(@NotNull
final DocumentEvent e) {
290 public void removeUpdate(@NotNull
final DocumentEvent e) {
295 input.getDocument().addDocumentListener(documentListener);
298 final JComponent inputPanel =
new JPanel(
new BorderLayout());
299 inputPanel.add(label, BorderLayout.NORTH);
300 inputPanel.add(
input, BorderLayout.CENTER);
301 inputPanel.setBorder(
new EmptyBorder(3, 3, 3, 3));
303 list.setFocusable(
false);
304 final Component scrollPane =
new JScrollPane(
list, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
306 list.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
307 final MouseListener mouseListener =
new MouseListener() {
310 public void mouseClicked(
final MouseEvent e) {
315 public void mousePressed(
final MouseEvent e) {
316 if (e.getClickCount() > 1) {
322 public void mouseReleased(
final MouseEvent e) {
327 public void mouseEntered(
final MouseEvent e) {
332 public void mouseExited(
final MouseEvent e) {
337 list.addMouseListener(mouseListener);
339 dialog =
new JDialog(parent);
340 dialog.setResizable(
false);
342 dialog.setLocationRelativeTo(parent);
343 dialog.setUndecorated(
true);
344 dialog.setLayout(
new BorderLayout());
345 dialog.add(inputPanel, BorderLayout.NORTH);
346 dialog.add(scrollPane, BorderLayout.CENTER);
347 dialog.setModalityType(ModalityType.DOCUMENT_MODAL);
362 final String mapName =
input.getText();
363 if (mapName.isEmpty()) {
370 sortedMaps.addAll(maps);
373 for (
final MapFile map : sortedMaps) {
377 list.setSelectedIndex(0);
378 list.ensureIndexIsVisible(0);
406 final int index =
list.getMinSelectionIndex();
407 final int newIndex = (index > 0 ? index :
listModel.size()) - 1;
408 list.setSelectedIndex(newIndex);
409 list.ensureIndexIsVisible(newIndex);
417 final int index =
list.getMaxSelectionIndex() + 1;
418 final int newIndex = index <
listModel.size() ? index : 0;
419 list.setSelectedIndex(newIndex);
420 list.ensureIndexIsVisible(newIndex);
428 final int index =
list.getMinSelectionIndex();
429 final int firstIndex =
list.getFirstVisibleIndex();
431 if (firstIndex == -1) {
433 }
else if (index == -1) {
434 newIndex = firstIndex;
435 }
else if (index > firstIndex) {
436 newIndex = firstIndex;
438 newIndex = Math.max(firstIndex - (
list.getLastVisibleIndex() - firstIndex), 0);
440 list.setSelectedIndex(newIndex);
441 list.ensureIndexIsVisible(newIndex);
449 final int index =
list.getMaxSelectionIndex();
450 final int lastIndex =
list.getLastVisibleIndex();
452 if (lastIndex == -1) {
454 }
else if (index == -1) {
455 newIndex = lastIndex;
456 }
else if (index < lastIndex) {
457 newIndex = lastIndex;
459 newIndex = Math.min(lastIndex + (lastIndex -
list.getFirstVisibleIndex()),
listModel.size() - 1);
461 list.setSelectedIndex(newIndex);
462 list.ensureIndexIsVisible(newIndex);
470 final int newIndex = 0;
471 list.setSelectedIndex(newIndex);
472 list.ensureIndexIsVisible(newIndex);
480 final int newIndex =
listModel.size() - 1;
481 list.setSelectedIndex(newIndex);
482 list.ensureIndexIsVisible(newIndex);
490 final int index =
list.getMinSelectionIndex();
492 final int newIndex = (index > 0 ? index :
listModel.size()) - 1;
493 list.addSelectionInterval(newIndex, newIndex);
494 list.ensureIndexIsVisible(newIndex);
503 final int index =
list.getMaxSelectionIndex();
505 final int newIndex = index + 1;
506 list.addSelectionInterval(newIndex, newIndex);
507 list.ensureIndexIsVisible(newIndex);
516 final List<MapFile> selectedValues =
list.getSelectedValuesList();
517 boolean result =
false;
518 for (
final MapFile selectedValue : selectedValues) {
522 }
catch (
final IOException ex) {