📄 opentorrentwindow.java
字号:
// check if all selected files exist
TorrentFileInfo[] files = info.getFiles();
for (int j = 0; j < files.length; j++) {
TorrentFileInfo fileInfo = files[j];
if (!fileInfo.bDownload)
continue;
String sFullPath;
if (fileInfo.sDestFileName == null) {
File f = new File(info.sDestDir, fileInfo.sFullFileName);
sFullPath = f.getAbsolutePath();
} else {
sFullPath = fileInfo.sDestFileName;
}
File file = new File(sFullPath);
if (!file.exists()) {
fileInfo.isValid = false;
bTorrentValid = false;
} else if (!fileInfo.isValid) {
fileInfo.isValid = true;
}
}
}
info.isValid = bTorrentValid;
}
Utils.execSWTThread(new AERunnable() {
public void runSupport() {
if (tableTorrents != null && !tableTorrents.isDisposed()) {
tableTorrents.clearAll();
}
if (dataFileTable != null && !dataFileTable.isDisposed()) {
dataFileTable.clearAll();
}
}
});
}
private void deleteSelected(Table table, ArrayList list) {
int[] indexes = table.getSelectionIndices();
Arrays.sort(indexes);
for (int i = indexes.length - 1; i >= 0; i--) {
if (list.get(indexes[i]) instanceof TorrentInfo) {
TorrentInfo info = (TorrentInfo) list.get(indexes[i]);
if (info.bDeleteFileOnCancel) {
File file = new File(info.sFileName);
if (file.exists())
file.delete();
}
}
list.remove(indexes[i]);
}
table.setItemCount(list.size());
table.clearAll();
table.notifyListeners(SWT.Selection, new Event());
}
private void createTableDataFiles(Composite cArea) {
GridData gridData;
TableColumn tc;
dataFileTable = new Table(cArea, SWT.BORDER | SWT.CHECK
| SWT.FULL_SELECTION | SWT.VIRTUAL | SWT.MULTI);
gridData = new GridData(GridData.FILL_BOTH);
gridData.heightHint = 80;
gridData.widthHint = 100;
dataFileTable.setLayoutData(gridData);
tc = new TableColumn(dataFileTable, SWT.NULL);
Messages.setLanguageText(tc, "OpenTorrentWindow.fileTable.fileName");
tc.setWidth(150);
tc = new TableColumn(dataFileTable, SWT.NULL);
Messages.setLanguageText(tc, "OpenTorrentWindow.fileTable.destinationName");
tc.setWidth(140);
tc = new TableColumn(dataFileTable, SWT.NULL);
Messages.setLanguageText(tc, "OpenTorrentWindow.fileTable.size");
tc.setAlignment(SWT.TRAIL);
tc.setWidth(90);
if (Utils.LAST_TABLECOLUMN_EXPANDS)
tc.setData("Width", new Long(90));
dataFileTable.addListener(SWT.SetData, new Listener() {
public void handleEvent(Event event) {
if (bClosed)
return;
final TableItem item = (TableItem) event.item;
int index = dataFileTable.indexOf(item);
final TorrentFileInfo file = (TorrentFileInfo) dataFiles.get(index);
item.setText(new String[] {
file.sFileName,
file.sDestFileName,
DisplayFormatters.formatByteCountToKiBEtc(file.lSize)
});
if (!file.isValid) {
item.setForeground(Colors.red);
Font font = item.getFont();
FontData[] fd = font.getFontData();
for (int i = 0; i < fd.length; i++) {
fd[i].setStyle(SWT.ITALIC);
}
font = new Font(item.getDisplay(), fd);
disposeList.add(font);
item.setFont(font);
}
Utils.alternateRowBackground(item);
Utils.setCheckedInSetData(item, file.bDownload);
item.setGrayed(!file.okToDisable());
}
});
dataFileTable.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
if (event.detail == SWT.CHECK) {
TableItem item = (TableItem) event.item;
int index = dataFileTable.indexOf(item);
TorrentFileInfo file = (TorrentFileInfo) dataFiles.get(index);
// don't allow disabling of small files
// XXX Maybe warning prompt instead?
if (!item.getChecked() && !file.okToDisable())
item.setChecked(true);
else
file.bDownload = item.getChecked();
updateSize();
}
}
});
dataFileTable.setHeaderVisible(true);
Menu menu = new Menu(dataFileTable);
dataFileTable.setMenu(menu);
MenuItem item;
item = new MenuItem(menu, SWT.PUSH);
Messages.setLanguageText(item,
"OpenTorrentWindow.fileList.changeDestination");
item.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
int[] indexes = dataFileTable.getSelectionIndices();
chageFileDestination(indexes);
}
});
Composite cBottomArea = new Composite(cArea, SWT.NONE);
GridLayout gLayout = new GridLayout();
gLayout.marginHeight = 0;
gLayout.marginWidth = 0;
gLayout.numColumns = 2;
cBottomArea.setLayout(gLayout);
gridData = new GridData(GridData.FILL_HORIZONTAL);
cBottomArea.setLayoutData(gridData);
Composite cButtons = new Composite(cBottomArea, SWT.NONE);
RowLayout rLayout = new RowLayout(SWT.HORIZONTAL);
rLayout.wrap = false;
rLayout.marginBottom = 0;
rLayout.marginLeft = 0;
rLayout.marginRight = 0;
rLayout.marginTop = 0;
cButtons.setLayout(rLayout);
Button btnSelectAll = new Button(cButtons, SWT.PUSH);
Messages.setLanguageText(btnSelectAll, "Button.selectAll");
btnSelectAll.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
dataFileTable.selectAll();
}
});
Button btnMarkSelected = new Button(cButtons, SWT.PUSH);
Messages.setLanguageText(btnMarkSelected, "Button.markSelected");
btnMarkSelected.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
int[] indexes = dataFileTable.getSelectionIndices();
for (int i = 0; i < indexes.length; i++) {
TorrentFileInfo file = (TorrentFileInfo) dataFiles.get(indexes[i]);
file.bDownload = true;
}
dataFileTable.clearAll();
updateSize();
}
});
Button btnUnmarkSelected = new Button(cButtons, SWT.PUSH);
Messages.setLanguageText(btnUnmarkSelected, "Button.unmarkSelected");
btnUnmarkSelected.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
int[] indexes = dataFileTable.getSelectionIndices();
for (int i = 0; i < indexes.length; i++) {
TorrentFileInfo file = (TorrentFileInfo) dataFiles.get(indexes[i]);
if (file.okToDisable())
file.bDownload = false;
}
dataFileTable.clearAll();
updateSize();
}
});
dataFileTableLabel = new Label(cBottomArea, SWT.WRAP);
dataFileTableLabel.setAlignment(SWT.RIGHT);
gridData = new GridData(GridData.FILL_BOTH);
dataFileTableLabel.setLayoutData(gridData);
}
/**
* @param indexes
*/
protected void chageFileDestination(int[] indexes) {
for (int i = 0; i < indexes.length; i++) {
TorrentFileInfo fileInfo = (TorrentFileInfo) dataFiles.get(indexes[i]);
int style = (fileInfo.parent.iStartID == STARTMODE_SEEDING) ? SWT.OPEN
: SWT.SAVE;
FileDialog fDialog = new FileDialog(shellForChildren, SWT.SYSTEM_MODAL
| style);
String sFilterPath = fileInfo.getDestPath();
String sFileName = new File(fileInfo.sFileName).getName();
File f = new File(sFilterPath);
if (!f.isDirectory()) {
// Move up the tree until we have an existing path
while (sFilterPath != null) {
String parentPath = f.getParent();
if (parentPath == null)
break;
sFilterPath = parentPath;
f = new File(sFilterPath);
if (f.isDirectory())
break;
}
}
if (sFilterPath != null)
fDialog.setFilterPath(sFilterPath);
fDialog.setFileName(sFileName);
fDialog.setText(MessageText.getString("MainWindow.dialog.choose.savepath")
+ " (" + fileInfo.sFullFileName + ")");
String sNewName = fDialog.open();
if (sNewName == null)
return;
if (fileInfo.parent.iStartID == STARTMODE_SEEDING) {
File file = new File(sNewName);
if (file.length() == fileInfo.lSize)
fileInfo.sDestFileName = sNewName;
else {
Utils.openMessageBox(shellForChildren, SWT.OK,
"OpenTorrentWindow.mb.badSize", new String[] {
file.getName(),
fileInfo.sFullFileName
});
}
} else {
fileInfo.sDestFileName = sNewName;
}
} // for i
checkSeedingMode();
}
/**
* Add Torrent(s) to Window using a text list of files/urls/torrents
*
* @param sClipText Text to parse
* @param bVerifyOnly Only check if there's potential torrents in the text,
* do not try to add the torrents.
*
* @return Number of torrents added or found. When bVerifyOnly, this number
* may not be exact.
*/
private int addTorrentsFromTextList(String sClipText, boolean bVerifyOnly) {
String[] lines = null;
int iNumFound = 0;
// # of consecutive non torrent lines
int iNoTorrentLines = 0;
// no use checking the whole clipboard (which may be megabytes)
final int MAX_CONSECUTIVE_NONTORRENT_LINES = 100;
final String[] splitters = {
"\r\n",
"\n",
"\r",
"\t"
};
for (int i = 0; i < splitters.length; i++)
if (sClipText.indexOf(splitters[i]) >= 0) {
lines = sClipText.split(splitters[i]);
break;
}
if (lines == null)
lines = new String[] { sClipText
};
// Check if URL, 20 byte hash, Dir, or file
for (int i = 0; i < lines.length; i++) {
String line = lines[i].trim();
if (line.startsWith("\"") && line.endsWith("\"")) {
if (line.length() < 3) {
line = "";
} else {
line = line.substring(1, line.length() - 2);
}
}
boolean ok;
if (line == "") {
ok = false;
} else if (UrlUtils.isURL(line)) {
ok = true;
} else {
File file = new File(line);
if (!file.exists()) {
ok = false;
} else if (file.isDirectory()) {
if (bVerifyOnly) {
// XXX Could do a file count here, but the number found is not
// expected to be an exact number anyway, since we aren't
// event verifying if they are torrents.
ok = true;
} else {
iNumFound += addTorrents(lines[i], null);
ok = false;
}
} else {
ok = true;
}
}
if (!ok) {
iNoTorrentLines++;
lines[i] = null;
if (iNoTorrentLines > MAX_CONSECUTIVE_NONTORRENT_LINES)
break;
} else {
iNumFound++;
iNoTorrentLines = 0;
}
}
if (bVerifyOnly) {
return iNumFound;
}
return addTorrents(null, lines);
}
/**
* Add Torrent(s) to window
*
* @param sTorrentFilePath
* @param sTorrentFilenames
* @return # torrents actually added to list (or downloading)
*/
private int addTorrents(String sTorrentFilePath, String[] sTorrentFilenames) {
sTorrentFilePath = ensureTrailingSeparator(sTorrentFilePath);
// Process Directory
if (sTorrentFilePath != null && sTorrentFilenames == null) {
File dir = new File(sTorrentFilePath);
if (!dir.isDirectory())
return 0;
final File[] files = dir.listFiles(new FileFilter() {
public boolean accept(File arg0) {
if (FileUtil.getCanonicalFileName(arg0.getName()).endsWith(".torrent"))
return true;
if (FileUtil.getCanonicalFileName(arg0.getName()).endsWith(".tor"))
return true;
return false;
}
});
if (files.length == 0)
return 0;
sTorrentFilenames = new String[files.length];
for (int i = 0; i < files.length; i++)
sTorrentFilenames[i] = files[i].getName();
}
int numAdded = 0;
for (int i = 0; i < sTorrentFilenames.length; i++) {
if (sTorrentFilenames[i] == null || sTorrentFilenames[i] == "")
continue;
// Process File
String sFileName = ((sTorrentFilePath == null) ? "" : sTorrentFilePath)
+ sTorrentFilenames[i];
if (!new File(sFileName).exists()) {
// Process URL
String sURL = UrlUtils.parseTextForURL(sTorrentFilenames[i], true);
if (sURL != null) {
if (COConfigurationManager.getBooleanParameter("Add URL Silently")) {
new FileDownloadWindow(core, shellForChildren, sURL, null, this);
} else {
new OpenUrlWindow(core, shellForChildren, sURL, null, this);
}
numAdded++;
continue;
}
}
if (addTorrent(sFileName, sFileName) != null)
numAdded++;
}
if (numAdded > 0 && shell != null && tableTorrents != null
&& !shell.isDisposed()) {
int iTotal = torrentList.size();
tableTorrents.setItemCount(iTotal);
// select the ones we just added
tableTorrents.select(iTotal - numAdded, iTotal - 1);
tableTorrents.clearAll();
// select doesn't notify listeners? Do it manually.
tableTorrents.notifyListeners(SWT.Selection, new Event());
resizeTables(1);
checkSeedingMode();
}
return numAdded;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -