Merge pull request #64 in ITERATE/cyberduck from feature/windows/9074 to master
[cyberduck.git] / source / ch / cyberduck / ui / cocoa / BrowserListViewModel.java
blob3eb634453f97e0108538ce1c5626ec5955c250ba
1 package ch.cyberduck.ui.cocoa;
3 /*
4 * Copyright (c) 2005 David Kocher. All rights reserved.
5 * http://cyberduck.ch/
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * Bug fixes, suggestions and comments should be sent to:
18 * dkocher@cyberduck.ch
21 import ch.cyberduck.binding.application.NSDraggingInfo;
22 import ch.cyberduck.binding.application.NSPasteboard;
23 import ch.cyberduck.binding.application.NSTableColumn;
24 import ch.cyberduck.binding.application.NSTableView;
25 import ch.cyberduck.binding.foundation.NSArray;
26 import ch.cyberduck.binding.foundation.NSIndexSet;
27 import ch.cyberduck.binding.foundation.NSMutableArray;
28 import ch.cyberduck.binding.foundation.NSObject;
29 import ch.cyberduck.binding.foundation.NSURL;
30 import ch.cyberduck.core.AttributedList;
31 import ch.cyberduck.core.Cache;
32 import ch.cyberduck.core.Path;
34 import org.apache.log4j.Logger;
35 import org.rococoa.cocoa.foundation.NSInteger;
36 import org.rococoa.cocoa.foundation.NSUInteger;
38 import java.util.ArrayList;
39 import java.util.List;
41 /**
42 * @version $Id$
44 public class BrowserListViewModel extends BrowserTableDataSource implements NSTableView.DataSource {
45 private static final Logger log = Logger.getLogger(BrowserListViewModel.class);
47 public BrowserListViewModel(final BrowserController controller, final Cache<Path> cache) {
48 super(controller, cache);
51 @Override
52 public void render(final NSTableView view, final List<Path> folders) {
53 super.render(view, folders);
54 if(log.isDebugEnabled()) {
55 log.debug(String.format("Reload table view %s for changes files %s", view, folders));
57 view.reloadData();
60 @Override
61 public NSInteger numberOfRowsInTableView(final NSTableView view) {
62 if(controller.isMounted()) {
63 return new NSInteger(this.get(controller.workdir()).size());
65 return new NSInteger(0);
68 @Override
69 public void tableView_setObjectValue_forTableColumn_row(final NSTableView view, final NSObject value,
70 final NSTableColumn column, final NSInteger row) {
71 super.setObjectValueForItem(this.get(controller.workdir()).get(row.intValue()),
72 value, column.identifier());
75 @Override
76 public NSObject tableView_objectValueForTableColumn_row(final NSTableView view,
77 final NSTableColumn column, final NSInteger row) {
78 if(controller.isMounted()) {
79 final List<Path> children = this.get(controller.workdir());
80 return super.objectValueForItem(children.get(row.intValue()), column.identifier());
82 return null;
85 // ----------------------------------------------------------
86 // Drop methods
87 // ----------------------------------------------------------
89 @Override
90 public NSUInteger tableView_validateDrop_proposedRow_proposedDropOperation(final NSTableView view,
91 final NSDraggingInfo draggingInfo,
92 final NSInteger row, final NSUInteger operation) {
93 if(controller.isMounted()) {
94 Path destination = controller.workdir();
95 if(row.intValue() < this.numberOfRowsInTableView(view).intValue()) {
96 int draggingColumn = view.columnAtPoint(draggingInfo.draggingLocation()).intValue();
97 if(-1 == draggingColumn || 0 == draggingColumn || 1 == draggingColumn) {
98 // Allow drags to icon and filename column
99 if(row.intValue() != -1) {
100 Path p = this.get(controller.workdir()).get(row.intValue());
101 if(p.isDirectory()) {
102 destination = p;
106 return super.validateDrop(view, destination, row, draggingInfo);
108 // Draging to empty area in browser
109 return super.validateDrop(view, destination, row, draggingInfo);
111 // Passing to super to look for URLs to mount
112 return super.validateDrop(view, null, row, draggingInfo);
115 @Override
116 public boolean tableView_acceptDrop_row_dropOperation(final NSTableView view, final NSDraggingInfo draggingInfo,
117 final NSInteger row, final NSUInteger operation) {
118 if(controller.isMounted()) {
119 Path destination = controller.workdir();
120 if(row.intValue() != -1) {
121 destination = this.get(controller.workdir()).get(row.intValue());
123 return super.acceptDrop(view, destination, draggingInfo);
125 return super.acceptDrop(view, null, draggingInfo);
128 // ----------------------------------------------------------
129 // Drag methods
130 // ----------------------------------------------------------
133 * Invoked by view after it has been determined that a drag should begin, but before the drag has been started.
134 * The drag image and other drag-related information will be set up and provided by the table view once this call
135 * returns with true.
137 * @param rowIndexes is the list of row numbers that will be participating in the drag.
138 * @return To refuse the drag, return false. To start a drag, return true and place the drag data onto pboard (data, owner, and so on).
140 @Override
141 public boolean tableView_writeRowsWithIndexes_toPasteboard(final NSTableView view, final NSIndexSet rowIndexes,
142 final NSPasteboard pboard) {
143 if(controller.isMounted()) {
144 NSMutableArray items = NSMutableArray.array();
145 final AttributedList<Path> children = this.get(controller.workdir());
146 final List<Path> selected = new ArrayList<Path>();
147 for(NSUInteger index = rowIndexes.firstIndex(); !index.equals(NSIndexSet.NSNotFound); index = rowIndexes.indexGreaterThanIndex(index)) {
148 selected.add(children.get(index.intValue()));
150 return super.writeItemsToPasteBoard(view, selected, pboard);
152 return false;
155 @Override
156 public NSArray tableView_namesOfPromisedFilesDroppedAtDestination_forDraggedRowsWithIndexes(final NSTableView view,
157 final NSURL dropDestination,
158 final NSIndexSet rowIndexes) {
159 return this.namesOfPromisedFilesDroppedAtDestination(dropDestination);