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.action.ActionHandler;
7 import de.ilias.services.filemanager.content.ListItem;
8 import de.ilias.services.filemanager.content.LocalListItem;
9 import de.ilias.services.filemanager.content.RemoteListItem;
10 import de.ilias.services.filemanager.controller.MainController;
11 import de.ilias.services.filemanager.dialog.DeleteDialog;
12 import de.ilias.services.filemanager.dialog.RenameDialog;
13 import de.ilias.services.filemanager.dialog.RevisionStateDialog;
14 import java.awt.Desktop;
15 import java.io.File;
16 import java.io.IOException;
17 import java.util.ArrayList;
18 import java.util.Iterator;
19 import java.util.logging.Logger;
20 import javafx.collections.ObservableList;
21 import javafx.scene.Cursor;
22 import javafx.scene.Node;
23 import javafx.scene.control.ListView;
24 import javafx.scene.input.Clipboard;
25 
26 /**
27  * Class ListItemEventHandler
28  *
29  * @author Stefan Meyer <smeyer.ilias@gmx.de>
30  */
31 public class ListItemEventHandler
32 {
33 
34 	protected static final Logger logger = Logger.getLogger(ListItemEventHandler.class.getName());
35 
36 	private ListItem item = null;
37 
ListItemEventHandler(ListItem item)38 	public ListItemEventHandler(ListItem item) {
39 		this.item = item;
40 	}
41 
42 	/**
43 	 * set list item
44 	 * @param li
45 	 */
setListItem(ListItem li)46 	public void setListItem(ListItem li) {
47 
48 		this.item = li;
49 	}
50 
51 	/**
52 	 * set list item
53 	 * @return
54 	 */
getListItem()55 	public ListItem getListItem() {
56 		return this.item;
57 	}
58 
59 	/**
60 	 * Handle open action (triggered by mouse event or action event or key event)
61 	 * @param openContainer
62 	 */
handleOpenAction(boolean openContainer)63 	protected void handleOpenAction(boolean openContainer) {
64 
65 		// return if item is not readable
66 		if(!getListItem().isReadable()) {
67 			return;
68 		}
69 
70 		// Check if container and switch directory or open using explorer
71 		if (getListItem().isContainer()) {
72 
73 			if(openContainer && !(getListItem() instanceof RemoteListItem)) {
74 				Desktop desktop;
75 				try {
76 					desktop = Desktop.getDesktop();
77 					desktop.open(new File(getListItem().getAbsolutePath()));
78 				}
79 				catch (IOException ex) {
80 					logger.warning("Cannot open file " + getListItem().getTitle());
81 				}
82 			}
83 			else {
84 				MainController.getInstance().getRoot().setCursor(Cursor.WAIT);
85 				if(getListItem().isUpperLink()) {
86 					MainController.getInstance().switchDirectory(getListItem().getParent());
87 				}
88 				else {
89 					MainController.getInstance().switchDirectory(getListItem());
90 				}
91 				MainController.getInstance().getRoot().setCursor(Cursor.DEFAULT);
92 			}
93 			return;
94 		}
95 		else if (getListItem().isReadable() && !getListItem().getFileType().isEmpty()) {
96 
97 			// @todo check cursor settings
98 			MainController.getInstance().getRoot().setCursor(Cursor.WAIT);
99 
100 			if (getListItem() instanceof RemoteListItem) {
101 				MainController.getInstance().deliverRemoteItem(getListItem());
102 			}
103 			if (getListItem() instanceof LocalListItem) {
104 				Desktop desktop;
105 				try {
106 					desktop = Desktop.getDesktop();
107 					desktop.open(new File(getListItem().getAbsolutePath()));
108 				} catch (IOException ex) {
109 					logger.warning("Cannot open file " + getListItem().getTitle());
110 				}
111 			}
112 			MainController.getInstance().getRoot().setCursor(Cursor.DEFAULT);
113 		}
114 	}
115 
116 	/**
117 	 * Copy selected to clipboard
118 	 */
handleCopyToClipboard()119 	protected void handleCopyToClipboard() {
120 
121 		if(getListItem() instanceof RemoteListItem) {
122 
123 			logger.info("Copy remote list item to clipboard");
124 
125 			// First clear the clipboard
126 			Clipboard clip = Clipboard.getSystemClipboard();
127 			clip.clear();
128 
129 			Iterator selected = MainController.getInstance().getList(getListItem()).
130 					getSelectionModel().getSelectedItems().iterator();
131 			ArrayList<ListItem> items = new ArrayList<ListItem>();
132 			while(selected.hasNext()) {
133 				Node node = (Node) selected.next();
134 				ListItem selectedNode = (ListItem) node.getUserData();
135 				items.add(selectedNode);
136 			}
137 			ActionHandler.copyRemoteToClipboard(getListItem(),items);
138 		}
139 	}
140 
141 	/**
142 	 * Select all items
143 	 * @param view
144 	 */
selectAllItems(ListView view)145 	protected void selectAllItems(ListView view) {
146 
147 		Iterator ite = view.getItems().iterator();
148 		int index = 0;
149 		while(ite.hasNext()) {
150 			ite.next();
151 			if(index > 0) {
152 				view.getSelectionModel().select(index);
153 			}
154 			else {
155 				view.getSelectionModel().clearSelection(index);
156 			}
157 			index++;
158 		}
159 	}
160 
161 	/**
162 	 * Select all items
163 	 * @param view
164 	 */
invertSelection(ListView view)165 	protected void invertSelection(ListView view) {
166 
167 		Iterator ite = view.getItems().iterator();
168 		int index = 0;
169 		while(ite.hasNext()) {
170 			ite.next();
171 			if(view.getSelectionModel().isSelected(index)) {
172 				view.getSelectionModel().clearSelection(index);
173 			}
174 			else {
175 				view.getSelectionModel().select(index);
176 			}
177 			index++;
178 		}
179 	}
180 
181 	/**
182 	 * Handle paste action
183 	 */
handlePasteAction()184 	protected void handlePasteAction() {
185 		ActionHandler.pasteFromClipboard(getListItem(),Clipboard.getSystemClipboard().getFiles());
186 		Clipboard.getSystemClipboard().clear();
187 	}
188 
189 	/**
190 	 * Show rename dialog
191 	 */
handleRenameAction()192 	protected void handleRenameAction() {
193 
194 		RenameDialog rename = new RenameDialog(getListItem());
195 		rename.parse();
196 		MainController.getInstance().showModalDialog(rename);
197 	}
198 
199 	/**
200 	 * Show delete confirmation dialog
201 	 */
handleDeleteAction()202 	protected void handleDeleteAction() {
203 
204 		if(!getListItem().isDeletable()) {
205 			return;
206 		}
207 
208 		DeleteDialog delete = new DeleteDialog(getListItem());
209 		delete.parse();
210 		MainController.getInstance().showModalDialog(delete);
211 	}
212 
213 	/**
214 	 * handle revision state
215 	 */
handleRevisionStateEditingAction()216 	protected void handleRevisionStateEditingAction() {
217 
218 		if(!getListItem().isWritable()) {
219 			return;
220 		}
221 		if(!getListItem().getType().equals("file"))
222 		{
223 			return;
224 		}
225 		RevisionStateDialog rs = new RevisionStateDialog(getListItem());
226 		rs.parse();
227 		MainController.getInstance().showModalDialog(rs);
228 	}
229 }
230