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