/*
* File : SingleFilePanel.java Created : 30 sept. 2003 02:50:19 By : Olivier
*
* Azureus - a Java Bittorrent client
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation; either version 2 of the License.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details ( see the LICENSE file ).
*
* You should have received a copy of the GNU General Public License along with
* this program; if not, write to the Free Software Foundation, Inc., 59 Temple
* Place, Suite 330, Boston, MA 02111-1307 USA
*/
package org.gudy.azureus2.ui.swt.maketorrent;
import java.io.File;
import java.util.*;
import java.util.List;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.*;
import org.eclipse.swt.events.*;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.*;
import org.gudy.azureus2.core3.internat.MessageText;
import org.gudy.azureus2.core3.util.*;
import org.gudy.azureus2.ui.swt.Messages;
import org.gudy.azureus2.ui.swt.SimpleTextEntryWindow;
import org.gudy.azureus2.ui.swt.Utils;
import org.gudy.azureus2.ui.swt.mainwindow.TorrentOpener;
import org.gudy.azureus2.ui.swt.wizard.AbstractWizardPanel;
import org.gudy.azureus2.ui.swt.wizard.IWizardPanel;
import com.aelitis.azureus.util.MapUtils;
/**
* @author Olivier
*
*/
public class BYOPanel
extends AbstractWizardPanel<NewTorrentWizard>
{
private Tree tree;
public BYOPanel(NewTorrentWizard wizard,
IWizardPanel<NewTorrentWizard> previous) {
super(wizard, previous);
wizard.byo_map = null;
}
/*
* (non-Javadoc)
*
* @see org.gudy.azureus2.ui.swt.maketorrent.IWizardPanel#show()
*/
public void show() {
wizard.setTitle(MessageText.getString("wizard.newtorrent.byo"));
wizard.setCurrentInfo(MessageText.getString("wizard.newtorrent.byo.info"));
Composite panel = wizard.getPanel();
GridLayout layout = new GridLayout();
layout.numColumns = 1;
panel.setLayout(layout);
GridData gridData;
tree = new Tree(panel, SWT.BORDER | SWT.MULTI);
tree.setHeaderVisible(true);
TreeColumn treeColumn = new TreeColumn(tree, 0);
Messages.setLanguageText(treeColumn, "label.torrent.structure");
treeColumn.setWidth(180);
treeColumn = new TreeColumn(tree, 0);
Messages.setLanguageText(treeColumn, "label.original.file");
treeColumn.setWidth(500);
gridData = new GridData(GridData.FILL_BOTH);
tree.setLayoutData(gridData);
createDropTarget(tree);
createDragSource(tree);
tree.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
}
public void widgetDefaultSelected(SelectionEvent e) {
editSelected();
e.doit = false;
}
});
tree.addKeyListener(new KeyListener() {
public void keyReleased(KeyEvent e) {
}
public void keyPressed(KeyEvent e) {
if (e.keyCode == SWT.F2) {
editSelected();
} else if (e.keyCode == SWT.DEL) {
TreeItem[] selection = tree.getSelection();
for (TreeItem treeItem : selection) {
Object data = treeItem.getData();
treeItem.dispose();
}
}
}
});
Composite cButtons = new Composite(panel, 0);
cButtons.setLayout(new RowLayout());
cButtons.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
Button btnAddContainer = new Button(cButtons, SWT.PUSH);
Messages.setLanguageText(btnAddContainer, "button.add.container");
btnAddContainer.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
SimpleTextEntryWindow entryWindow = new SimpleTextEntryWindow(
"wizard.newtorrent.byo.addcontainer.title",
"wizard.newtorrent.byo.addcontainer.text");
entryWindow.setPreenteredText("files", true);
entryWindow.prompt();
if (entryWindow.hasSubmittedInput()) {
createContainer(null, entryWindow.getSubmittedInput());
}
}
public void widgetDefaultSelected(SelectionEvent e) {
}
});
Button btnAddFiles = new Button(cButtons, SWT.PUSH);
Messages.setLanguageText(btnAddFiles, "OpenTorrentWindow.addFiles");
btnAddFiles.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
FileDialog fDialog = new FileDialog(Utils.findAnyShell(), SWT.OPEN | SWT.MULTI);
fDialog.setFilterPath(TorrentOpener.getFilterPathData());
fDialog.setText(MessageText.getString("MainWindow.dialog.choose.file"));
if (fDialog.open() != null) {
String[] fileNames = fDialog.getFileNames();
for (String fileName : fileNames) {
addFilename(new File(fDialog.getFilterPath(), fileName));
}
}
}
public void widgetDefaultSelected(SelectionEvent e) {
}
});
Button btnAddFolder = new Button(cButtons, SWT.PUSH);
Messages.setLanguageText(btnAddFolder, "OpenTorrentWindow.addFiles.Folder");
btnAddFolder.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
DirectoryDialog fDialog = new DirectoryDialog(Utils.findAnyShell(), SWT.NULL);
fDialog.setFilterPath(TorrentOpener.getFilterPathData());
fDialog.setMessage(MessageText.getString("MainWindow.dialog.choose.folder"));
String path = fDialog.open();
if (path != null) {
addFilename(new File(path));
}
}
public void widgetDefaultSelected(SelectionEvent e) {
}
});
if (wizard.byo_map != null) {
List list = (List) wizard.byo_map.get("file_map");
if (list != null) {
for (Iterator iterator = list.iterator(); iterator.hasNext();) {
Map map = (Map) iterator.next();
String target = MapUtils.getMapString(map, "target", null);
List path = MapUtils.getMapList(map, "logical_path", null);
if (target != null && path != null) {
File targetFile = new File(target);
if (path.size() == 1) {
addFilename(targetFile, (String) path.get(0), null, true);
} else {
TreeItem[] items = tree.getItems();
TreeItem parent = null;
for (int i = 0; i < path.size() - 1; i++) {
TreeItem lastParent = parent;
String name = (String) path.get(i);
boolean found = false;
for (TreeItem item : items) {
if (item.getText().equals(name)) {
parent = item;
found = true;
break;
}
}
if (!found) {
parent = createContainer(lastParent, name);
}
items = parent.getItems();
}
String name = (String) path.get(path.size() - 1);
addFilename(targetFile, name, parent, false);
}
}
}
}
}
}
private void createDragSource(final Tree tree) {
Transfer[] types = new Transfer[] { TextTransfer.getInstance() };
int operations = DND.DROP_MOVE;
final DragSource source = new DragSource(tree, operations);
source.setTransfer(types);
source.addDragListener(new DragSourceListener() {
public void dragStart(DragSourceEvent event) {
TreeItem[] selection = tree.getSelection();
event.doit = selection.length > 0;
tree.setData("dragging", 1);
};
public void dragSetData(DragSourceEvent event) {
event.data = "drag";
event.detail = DND.DROP_MOVE;
}
public void dragFinished(DragSourceEvent event) {
tree.setData("dragging", null);
}
});
tree.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
source.dispose();
}
});
}
protected void editSelected() {
TreeItem[] selection = tree.getSelection();
if (selection.length == 1) {
SimpleTextEntryWindow entryWindow = new SimpleTextEntryWindow(
"wizard.newtorrent.byo.editname.title",
"wizard.newtorrent.byo.editname.text");
entryWindow.setPreenteredText(selection[0].getText(), false);
entryWindow.prompt();
if (entryWindow.hasSubmittedInput()) {
selection[0].setText(entryWindow.getSubmittedInput());
}
}
}
private void createDropTarget(final Tree tree) {
final DropTarget dropTarget = new DropTarget(tree, DND.DROP_MOVE
| DND.DROP_LINK);
dropTarget.setTransfer(new Transfer[] {
TextTransfer.getInstance(),
FileTransfer.getInstance()
});
dropTarget.addDropListener(new DropTargetAdapter() {
public void dragOver(DropTargetEvent event) {
event.detail = DND.DROP_DEFAULT;
event.feedback = DND.FEEDBACK_EXPAND | DND.FEEDBACK_SCROLL;
if (event.item instanceof TreeItem) {
TreeItem item = (TreeItem) event.item;
if (tree.getData("dragging") != null) {
TreeItem[] selection = tree.getSelection();
boolean ok = true;
for (TreeItem treeItem : selection) {
if (treeItem == item) {
ok = false;
break;
}
if (item.getData() == null) {
// dragging to container
if (treeItem.getParentItem() == item) {
ok = false;
break;
}
} else {
if (treeItem.getParentItem() == item.getParentItem()) {
ok = false;
break;
}
}
}
if (!ok) {
event.detail = DND.DROP_NONE;
return;
}
}
if (item.getData() == null) {
event.feedback |= DND.FEEDBACK_SELECT;
} else {
event.feedback |= DND.FEEDBACK_INSERT_AFTER;
}
}
}
public void drop(DropTargetEvent event) {
if (event.data instanceof String[]) {
String[] sourceNames = (String[]) event.data;
if (sourceNames == null)
event.detail = DND.DROP_NONE;
if (event.detail == DND.DROP_NONE)
return;
for (String droppedFileStr : sourceNames) {
File droppedFile = new File(droppedFileStr);
addFilename(droppedFile, (TreeItem) event.item);
}
} else if ("drag".equals(event.data)) {
TreeItem[] selection = tree.getSelection();
for (TreeItem treeItem : selection) {
if (!treeItem.isDisposed()) {
moveItem(treeItem, (TreeItem) event.item);
}
}
}
}
});
tree.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
dropTarget.dispose();
}
});
}
protected void addFilename(File file) {
addFilename(file, file.getName(), null, false);
}
protected void addFilename(File file, TreeItem parent) {
addFilename(file, file.getName(),parent, false);
}
protected void addFilename(File file, String name, TreeItem parent, boolean init) {
if (parent != null && parent.getData() != null) {
parent = parent.getParentItem();
}
TreeItem firstItem = tree.getItemCount() > 0 ? tree.getItem(0) : null;
if (firstItem != null && firstItem.getData() != null) {
parent = createContainer(null, file.getParentFile().getName());
} else if (parent == null) {
parent = firstItem;
}
if (!file.exists()) {
//dropping container from a drag
createContainer(null, name);
}
TreeItem treeItem = parent == null ? new TreeItem(tree, 0)
: new TreeItem(parent, 0);
treeItem.setText(new String[] {
name,
file.getAbsolutePath()
});
treeItem.setData(file);
if (parent != null) {
parent.setExpanded(true);
}
wizard.setNextEnabled(tree.getItemCount() >= 1);
}
private TreeItem createContainer(TreeItem parent, String name) {
TreeItem[] selection = tree.getSelection();
//boolean moveSelected = false;
if (parent == null) {
if (selection.length == 1 && selection[0].getData() == null) {
parent = selection[0];
} else if (selection.length > 0) {
parent = selection[0].getParentItem();
//moveSelected = true;
} else {
TreeItem firstItem = tree.getItemCount() > 0 ? tree.getItem(0) : null;
if (firstItem != null && firstItem.getData() == null) {
parent = firstItem;
}
}
}
TreeItem item = parent == null ? new TreeItem(tree, 0, 0) : new TreeItem(parent, 0, 0);
item.setText(new String[] {
name,
MessageText.getString( "label.container.display")
});
while (tree.getItemCount() > 1) {
TreeItem itemToMove = tree.getItem(1);
moveItem(itemToMove, item);
}
item.setExpanded(true);
/*
if (moveSelected) {
// move selected into new item
for (TreeItem itemToMove : selection) {
moveItem(itemToMove, item);
}
}
*/
return item;
}
private void moveItem(TreeItem itemToMove, TreeItem parent) {
if (parent == null) {
if (tree.getItemCount() == 0) {
return;
}
parent = tree.getItem(0);
}
File parentFile = (File) parent.getData();
if (parentFile != null && !parentFile.isDirectory()) {
parent = parent.getParentItem();
}
TreeItem itemNew = new TreeItem(parent, 0);
for (int i = 0; i < tree.getColumnCount(); i++) {
itemNew.setText(i, itemToMove.getText(i));
}
File file = (File) itemToMove.getData();
itemNew.setData(file);
while (itemToMove.getItemCount() > 0) {
TreeItem subitemToMove = itemToMove.getItem(0);
moveItem(subitemToMove, itemNew);
}
itemToMove.dispose();
}
public IWizardPanel<NewTorrentWizard> getNextPanel() {
if (tree.getItemCount() == 1) {
// might be single file or single directory
TreeItem item = tree.getItem(0);
String name = item.getText();
File file = (File) item.getData();
if (file != null && file.getName().equals(name) && file.exists()) {
String parent = file.getParent();
if ( parent != null ){
((NewTorrentWizard) wizard).setDefaultOpenDir( parent );
}
if (file.isDirectory()) {
wizard.directoryPath = file.getAbsolutePath();
wizard.create_mode = wizard.MODE_DIRECTORY;
return new SavePathPanel(wizard, this);
} else {
wizard.singlePath = file.getAbsolutePath();
wizard.create_mode = wizard.MODE_SINGLE_FILE;
return new SavePathPanel(wizard, this);
}
}
}
Map map = new HashMap();
List<Map> list = new ArrayList<Map>();
map.put("file_map", list);
buildList(list, tree.getItems());
wizard.byo_map = map;
try {
wizard.byo_desc_file = AETemporaryFileHandler.createTempFile();
FileUtil.writeBytesAsFile(wizard.byo_desc_file.getAbsolutePath(),
BEncoder.encode(map));
} catch (Throwable e) {
Debug.out(e);
}
return new SavePathPanel(wizard, this);
}
private void buildList(List list, TreeItem[] items) {
for (TreeItem treeItem : items) {
if (treeItem == null || treeItem.isDisposed()) {
continue;
}
TreeItem[] subItems = treeItem.getItems();
File file = (File) treeItem.getData();
if (file != null) {
Map m = new HashMap();
list.add(m);
List<String> path = new ArrayList<String>();
do {
path.add(0, treeItem.getText());
treeItem = treeItem.getParentItem();
} while (treeItem != null);
m.put("logical_path", path);
m.put("target", file.getAbsolutePath());
}
if (subItems.length > 0) {
buildList(list, subItems);
}
}
}
}