1 /* Copyright (C) 2005-2011 Fabio Riccardi */
2 
3 package com.lightcrafts.ui.browser.view;
4 
5 import com.lightcrafts.platform.Platform;
6 import com.lightcrafts.ui.browser.model.ImageDatum;
7 
8 import javax.swing.event.MouseInputListener;
9 import java.awt.*;
10 import java.awt.event.MouseEvent;
11 import java.util.Collections;
12 
13 class ImageBrowserMouseListener implements MouseInputListener {
14 
15     private AbstractImageBrowser browser;
16     private ImageBrowserSelectionModel selection;
17     private ImageDatumControl controller;
18 
ImageBrowserMouseListener( AbstractImageBrowser browser, ImageBrowserSelectionModel selection, ImageDatumControl controller )19     ImageBrowserMouseListener(
20         AbstractImageBrowser browser,
21         ImageBrowserSelectionModel selection,
22         ImageDatumControl controller
23     ) {
24         this.browser = browser;
25         this.selection = selection;
26         this.controller = controller;
27     }
28 
mouseClicked(MouseEvent event)29     public void mouseClicked(MouseEvent event) {
30         if (controller.isControllerEvent(event)) {
31             controller.handleEvent(event);
32         }
33         else if (event.getClickCount() == 2) {
34             Point p = event.getPoint();
35             int index = browser.getIndex(p);
36             ImageDatum datum = browser.getImageDatum(index);
37             if (datum != null) {
38                 browser.notifyDoubleClicked(datum);
39             }
40         }
41     }
42 
mousePressed(MouseEvent event)43     public void mousePressed(MouseEvent event) {
44         browser.requestFocusInWindow();
45 
46         if (controller.isControllerEvent(event)) {
47             controller.handleEvent(event);
48         }
49         else {
50             // Identify which ImageDatum got the click:
51             Point p = event.getPoint();
52             int index = browser.getIndex(p);
53             if (index < 0) {
54                 selection.clearSelected();
55                 return;
56             }
57             ImageDatum datum = browser.getImageDatum(index);
58 
59             // Scroll that ImageDatum's thumbnail into full view:
60             Rectangle bounds = browser.getBounds(index);
61             browser.scrollRectToVisible(bounds);
62 
63             // This is ctrl-click on windows/linux, command-click on
64             // mac, filtering out synthetic command-clicks from multi-
65             // button mice.
66             boolean isCtrlDown = ((! Platform.isMac()) && event.isControlDown()) ||
67                      (Platform.isMac() && event.isMetaDown() && ! event.isPopupTrigger());
68 
69             // Figure out how to update the selection state:
70             if (event.isShiftDown()) {
71                 browser.addContinuousSelected(datum, isCtrlDown);
72             }
73             else if (isCtrlDown) {
74                 if (selection.isSelected(datum)) {
75                     selection.removeSelected(datum);
76                 }
77                 else {
78                     selection.addSelected(datum);
79                 }
80                 selection.setLeadSelected(datum, false);
81             }
82             else {
83                 if (
84                     event.isPopupTrigger() ||
85                     (Platform.isWindows() && (event.getButton() != MouseEvent.BUTTON1))
86                 ) {
87                     // A popup trigger on a selected ImageDatum does nothing
88                     // to selection, but a popup trigger on an unselected
89                     // ImageDatum selects it and unselects everything else.
90                     if (! selection.isSelected(datum)) {
91                         selection.setSelected(Collections.singletonList(datum));
92 
93                         selection.setLeadSelected(datum, false);
94                     }
95                 }
96                 else if (! selection.isSelected(datum)) {
97                     // All other mouse presses select only the ImageDatum.
98                     selection.setLeadSelected(datum, true);
99                 }
100             }
101         }
102         if (event.isPopupTrigger()) {
103             browser.showPopup(event);
104         }
105     }
106 
mouseReleased(MouseEvent event)107     public void mouseReleased(MouseEvent event) {
108         if (controller.isControllerEvent(event)) {
109             controller.handleEvent(event);
110         }
111         else if (event.isPopupTrigger()) {
112             browser.showPopup(event);
113         }
114     }
115 
mouseEntered(MouseEvent e)116     public void mouseEntered(MouseEvent e) {
117     }
118 
mouseExited(MouseEvent event)119     public void mouseExited(MouseEvent event) {
120         // This means, "don't control any ImageDatum"
121         controller.setIndex(-1);
122     }
123 
mouseDragged(MouseEvent event)124     public void mouseDragged(MouseEvent event) {
125         if (controller.isControllerEvent(event)) {
126             controller.handleEvent(event);
127         }
128     }
129 
mouseMoved(MouseEvent event)130     public void mouseMoved(MouseEvent event) {
131         if (controller.isControllerEvent(event)) {
132             controller.handleEvent(event);
133         }
134     }
135 }
136