1 /*
2  * Copyright (c) 1998-2009 ILIAS open source, Extended GPL, see docs/LICENSE
3  */
4 package de.ilias.services.filemanager.events;
5 
6 import de.ilias.services.filemanager.content.ListItem;
7 import de.ilias.services.filemanager.controller.MainController;
8 import java.util.Iterator;
9 import java.util.logging.Logger;
10 import javafx.event.Event;
11 import javafx.event.EventHandler;
12 import javafx.scene.Node;
13 import javafx.scene.control.ListView;
14 import javafx.scene.input.KeyCode;
15 import javafx.scene.input.KeyEvent;
16 
17 /**
18  * Class ListItemKeyEventHandler
19  *
20  * @author Stefan Meyer <smeyer.ilias@gmx.de>
21  */
22 public class ListItemKeyEventHandler extends ListItemEventHandler implements EventHandler<KeyEvent> {
23 
24 	protected static final Logger logger = Logger.getLogger(ListItemKeyEventHandler.class.getName());
25 
26 	private boolean multipleSelected = false;
27 
28 	/**
29 	 * Construcor
30 	 */
ListItemKeyEventHandler(ListItem item)31 	public ListItemKeyEventHandler(ListItem item) {
32 		super(item);
33 	}
34 
35 	/**
36 	 * Check if multiple items are selected
37 	 * @return
38 	 */
areMultipleSelected()39 	public boolean areMultipleSelected() {
40 		return this.multipleSelected;
41 	}
42 
43 	/**
44 	 * Handles key event
45 	 * @param ke
46 	 */
handle(KeyEvent ke)47 	public void handle(KeyEvent ke) {
48 
49 		if(ke.getEventType() == KeyEvent.KEY_RELEASED) {
50 			// open action
51 			if((ke.isControlDown() && ke.getCode() == KeyCode.O) || ke.getCode() == KeyCode.ENTER) {
52 				// Handle open action
53 				logger.info("Handling open action");
54 				this.initListItem(ke);
55 				if(!areMultipleSelected()) {
56 					this.handleOpenAction(true);
57 				}
58 				ke.consume();
59 				return;
60 			}
61 			if(ke.isControlDown() && ke.getCode() == KeyCode.R) {
62 				// Handle open action
63 				logger.info("Handling rename");
64 				this.initListItem(ke);
65 				if(!areMultipleSelected()) {
66 					this.handleRenameAction();
67 				}
68 				ke.consume();
69 				return;
70 
71 			}
72 			if(ke.isControlDown() && ke.getCode() == KeyCode.L) {
73 				// Handle revision state opening actions
74 				logger.info("Handling revision state editing");
75 				this.initListItem(ke);
76 				if(!areMultipleSelected()) {
77 					this.handleRevisionStateEditingAction();
78 				}
79 				ke.consume();
80 				return;
81 			}
82 			if(ke.isControlDown() && ke.getCode() == KeyCode.C) {
83 				// Handle open action
84 				logger.info("Handling copy to clipboard action");
85 				this.initListItem(ke);
86 				this.handleCopyToClipboard();
87 				ke.consume();
88 				return;
89 			}
90 			if(ke.isControlDown() && ke.getCode() == KeyCode.A) {
91 				logger.info("Select all");
92 				this.selectAllItems((ListView) ke.getSource());
93 				ke.consume();
94 				return;
95 			}
96 			if(ke.isShiftDown() && ke.isControlDown() && ke.getCode() == KeyCode.I) {
97 				logger.info("Invert selection");
98 				this.invertSelection((ListView) ke.getSource());
99 				ke.consume();
100 				return;
101 			}
102 			if(ke.isControlDown() && ke.getCode() == KeyCode.V) {
103 				logger.info("Handling paste");
104 				this.initListItem(ke);
105 				this.handlePasteAction();
106 				ke.consume();
107 				return;
108 			}
109 			if(ke.getCode() == KeyCode.DELETE) {
110 				logger.info("Handling delete");
111 				this.initListItem(ke);
112 				this.handleDeleteAction();
113 				ke.consume();
114 				return;
115 			}
116 		}
117 		ke.consume();
118 		return;
119 	}
120 
121 	/**
122 	 * init list item from key event
123 	 * @param ke
124 	 */
initListItem(KeyEvent ke)125 	protected void initListItem(KeyEvent ke) {
126 
127 		// container as default list item
128 		this.setListItem((ListItem)((Node) ke.getSource()).getUserData());
129 
130 		Iterator itemIte = ((ListView)ke.getSource()).getSelectionModel().getSelectedItems().iterator();
131 		int counter = 0;
132 		while(itemIte.hasNext()) {
133 			setListItem((ListItem) ((Node) itemIte.next()).getUserData());
134 			counter++;
135 		}
136 		if(counter > 1) {
137 			multipleSelected = true;
138 		}
139 	}
140 
141 }
142