mirror of
https://github.com/AppleCommander/AppleCommander.git
synced 2024-09-27 03:54:49 +00:00
d69c923bad
1. This change introduces the current SWT builds that exist in Maven; removing the need to locate and capture the JAR files. 2. The current SWT change is to capture the new Mac OS X aarch64 builds ("Apple Silicon"). 3. The current version of SWT, however, requires Java 11. 4. Due to the complexity of the prior Gradle build, it was restructured.
394 lines
13 KiB
Java
394 lines
13 KiB
Java
package com.webcodepro.applecommander.ui.swt.wizard.importfile;
|
|
|
|
import java.io.File;
|
|
import java.io.FileInputStream;
|
|
import java.io.FileNotFoundException;
|
|
import java.io.IOException;
|
|
import java.io.InputStream;
|
|
import java.util.Iterator;
|
|
import java.util.Optional;
|
|
|
|
import org.eclipse.swt.SWT;
|
|
import org.eclipse.swt.events.SelectionAdapter;
|
|
import org.eclipse.swt.events.SelectionEvent;
|
|
import org.eclipse.swt.layout.FillLayout;
|
|
import org.eclipse.swt.layout.GridData;
|
|
import org.eclipse.swt.layout.GridLayout;
|
|
import org.eclipse.swt.layout.RowData;
|
|
import org.eclipse.swt.layout.RowLayout;
|
|
import org.eclipse.swt.widgets.Button;
|
|
import org.eclipse.swt.widgets.Combo;
|
|
import org.eclipse.swt.widgets.Composite;
|
|
import org.eclipse.swt.widgets.FileDialog;
|
|
import org.eclipse.swt.widgets.Label;
|
|
import org.eclipse.swt.widgets.MessageBox;
|
|
import org.eclipse.swt.widgets.Shell;
|
|
import org.eclipse.swt.widgets.Table;
|
|
import org.eclipse.swt.widgets.TableColumn;
|
|
import org.eclipse.swt.widgets.TableItem;
|
|
import org.eclipse.swt.widgets.Text;
|
|
|
|
import com.webcodepro.applecommander.storage.os.prodos.ProdosFormatDisk;
|
|
import com.webcodepro.applecommander.ui.ImportSpecification;
|
|
import com.webcodepro.applecommander.ui.UiBundle;
|
|
import com.webcodepro.applecommander.ui.UserPreferences;
|
|
import com.webcodepro.applecommander.ui.swt.util.SwtUtil;
|
|
import com.webcodepro.applecommander.ui.swt.wizard.WizardPane;
|
|
import com.webcodepro.applecommander.util.AppleUtil;
|
|
import com.webcodepro.applecommander.util.TextBundle;
|
|
|
|
import io.github.applecommander.applesingle.AppleSingle;
|
|
import io.github.applecommander.applesingle.AppleSingleReader;
|
|
import io.github.applecommander.applesingle.ProdosFileInfo;
|
|
import io.github.applecommander.applesingle.Utilities;
|
|
|
|
/**
|
|
* Allow the used to choose the files to import into the disk image.
|
|
* <br>
|
|
* Created on Jan 17, 2003.
|
|
* @author Rob Greene
|
|
*/
|
|
public class ImportSelectFilesWizardPane extends WizardPane {
|
|
private TextBundle textBundle = UiBundle.getInstance();
|
|
private ImportWizard wizard;
|
|
private Composite control;
|
|
private Composite parent;
|
|
private Button removeButton;
|
|
private Button editButton;
|
|
private Table fileTable;
|
|
private Text addressText;
|
|
private Button rawCheckbox;
|
|
/**
|
|
* Constructor for ImportSelectFilesWizardPane.
|
|
*/
|
|
public ImportSelectFilesWizardPane(Composite parent, ImportWizard wizard) {
|
|
super();
|
|
this.parent = parent;
|
|
this.wizard = wizard;
|
|
}
|
|
/**
|
|
* Get the next visible pane.
|
|
* @see com.webcodepro.applecommander.ui.swt.wizard.WizardPane#getNextPane()
|
|
*/
|
|
public WizardPane getNextPane() {
|
|
return null;
|
|
}
|
|
/**
|
|
* Create the wizard pane.
|
|
* @see com.webcodepro.applecommander.ui.swt.wizard.WizardPane#open()
|
|
*/
|
|
public void open() {
|
|
control = new Composite(parent, SWT.NULL);
|
|
wizard.enableNextButton(false);
|
|
wizard.enableFinishButton(false);
|
|
RowLayout layout = new RowLayout(SWT.VERTICAL);
|
|
layout.justify = true;
|
|
layout.marginBottom = 5;
|
|
layout.marginLeft = 5;
|
|
layout.marginRight = 5;
|
|
layout.marginTop = 5;
|
|
layout.spacing = 3;
|
|
control.setLayout(layout);
|
|
Label label = new Label(control, SWT.WRAP);
|
|
label.setText(textBundle.get("ImportWizardPrompt")); //$NON-NLS-1$
|
|
|
|
fileTable = new Table(control, SWT.SINGLE | SWT.BORDER | SWT.FULL_SELECTION
|
|
| SWT.V_SCROLL | SWT.H_SCROLL);
|
|
fileTable.setLayoutData(new RowData(330, 100));
|
|
fileTable.setHeaderVisible(true);
|
|
fileTable.addSelectionListener(new SelectionAdapter() {
|
|
/**
|
|
* Single click.
|
|
*/
|
|
public void widgetSelected(SelectionEvent event) {
|
|
getRemoveButton().setEnabled(true);
|
|
getEditButton().setEnabled(true);
|
|
}
|
|
/**
|
|
* Double-click.
|
|
*/
|
|
public void widgetDefaultSelected(SelectionEvent event) {
|
|
editSelection();
|
|
}
|
|
});
|
|
|
|
TableColumn column = new TableColumn(fileTable, SWT.LEFT);
|
|
column.setText(textBundle.get("SourceColumnHeader")); //$NON-NLS-1$
|
|
column.setWidth(130);
|
|
column = new TableColumn(fileTable, SWT.LEFT);
|
|
column.setText(textBundle.get("TargetColumnHeader")); //$NON-NLS-1$
|
|
column.setWidth(130);
|
|
column = new TableColumn(fileTable, SWT.LEFT);
|
|
column.setText(textBundle.get("TypeColumnHeader")); //$NON-NLS-1$
|
|
column.setWidth(70);
|
|
|
|
Composite buttonPanel = new Composite(control, SWT.NULL);
|
|
buttonPanel.setLayout(new FillLayout());
|
|
|
|
Button chooseButton = new Button(buttonPanel, SWT.PUSH);
|
|
chooseButton.setText(textBundle.get("ChooseButton")); //$NON-NLS-1$
|
|
chooseButton.setFocus();
|
|
chooseButton.addSelectionListener(new SelectionAdapter() {
|
|
/**
|
|
* Single click.
|
|
*/
|
|
public void widgetSelected(SelectionEvent event) {
|
|
try {
|
|
FileDialog dialog = new FileDialog(getParent().getShell(),
|
|
SWT.OPEN | SWT.MULTI);
|
|
dialog.setFilterPath(
|
|
UserPreferences.getInstance().getImportDirectory());
|
|
String filename = dialog.open();
|
|
if (filename != null) {
|
|
setFilenames(dialog.getFilterPath(), dialog.getFileNames());
|
|
UserPreferences.getInstance().setImportDirectory(
|
|
dialog.getFilterPath());
|
|
}
|
|
} catch (Throwable t) {
|
|
MessageBox mb = new MessageBox(getParent().getShell(),
|
|
SWT.OK | SWT.ICON_ERROR | SWT.APPLICATION_MODAL);
|
|
mb.setText("Error!");
|
|
StringBuilder message = new StringBuilder();
|
|
while (t != null) {
|
|
if (t.getMessage() != null && t.getMessage().length() > 0) {
|
|
message.append(t.getMessage());
|
|
message.append("\n");
|
|
}
|
|
t = t.getCause();
|
|
}
|
|
mb.setMessage(message.toString());
|
|
mb.open();
|
|
}
|
|
}
|
|
});
|
|
|
|
removeButton = new Button(buttonPanel, SWT.PUSH);
|
|
removeButton.setText(textBundle.get("RemoveButton")); //$NON-NLS-1$
|
|
removeButton.setEnabled(false);
|
|
removeButton.addSelectionListener(new SelectionAdapter() {
|
|
/**
|
|
* Single click.
|
|
*/
|
|
public void widgetSelected(SelectionEvent event) {
|
|
TableItem[] items = getFileTable().getSelection();
|
|
for (int i=0; i<items.length; i++) {
|
|
ImportSpecification spec = (ImportSpecification)
|
|
items[i].getData();
|
|
getWizard().removeImportSpecification(spec);
|
|
}
|
|
getRemoveButton().setEnabled(false);
|
|
refreshTable();
|
|
}
|
|
});
|
|
|
|
editButton = new Button(buttonPanel, SWT.PUSH);
|
|
editButton.setText(textBundle.get("EditButton")); //$NON-NLS-1$
|
|
editButton.setEnabled(false);
|
|
editButton.addSelectionListener(new SelectionAdapter() {
|
|
/**
|
|
* Single click.
|
|
*/
|
|
public void widgetSelected(SelectionEvent event) {
|
|
editSelection();
|
|
}
|
|
});
|
|
}
|
|
/**
|
|
* Set all filenames to be imported.
|
|
*/
|
|
protected void setFilenames(String path, String[] filenames) throws FileNotFoundException, IOException {
|
|
for (int i=0; i<filenames.length; i++) {
|
|
String filename = path + File.separatorChar + filenames[i];
|
|
|
|
String suggestedFiletype = wizard.getDisk().getSuggestedFiletype(filenames[i]);
|
|
String suggestedFilename = wizard.getDisk().getSuggestedFilename(filenames[i]);
|
|
int suggestedAddress = 0;
|
|
|
|
try (InputStream inputStream = new FileInputStream(filename)) {
|
|
byte[] data = Utilities.toByteArray(inputStream);
|
|
AppleSingleReader reader = AppleSingleReader.builder(data).build();
|
|
if (AppleSingle.test(reader)) {
|
|
AppleSingle as = AppleSingle.read(data);
|
|
suggestedFilename = Optional.ofNullable(as.getRealName())
|
|
.orElse(suggestedFilename);
|
|
suggestedFiletype = ProdosFormatDisk.getFiletype(as.getProdosFileInfo().getFileType());
|
|
suggestedAddress = Optional.ofNullable(as.getProdosFileInfo())
|
|
.map(ProdosFileInfo::getAuxType)
|
|
.orElse(suggestedAddress);
|
|
}
|
|
}
|
|
ImportSpecification spec = new ImportSpecification(filename, suggestedFilename, suggestedFiletype);
|
|
spec.setAddress(suggestedAddress);
|
|
wizard.addImportSpecification(spec);
|
|
}
|
|
refreshTable();
|
|
}
|
|
/**
|
|
* Refresh the table of information.
|
|
*/
|
|
protected void refreshTable() {
|
|
fileTable.removeAll();
|
|
Iterator<ImportSpecification> specs = wizard.getImportSpecifications().iterator();
|
|
boolean canFinish = specs.hasNext();
|
|
while (specs.hasNext()) {
|
|
ImportSpecification spec = (ImportSpecification) specs.next();
|
|
File file = new File(spec.getSourceFilename());
|
|
TableItem item = new TableItem(fileTable, SWT.NULL);
|
|
item.setText(new String[] {
|
|
file.getName(),
|
|
spec.getTargetFilename(),
|
|
spec.getFiletype() });
|
|
item.setData(spec);
|
|
canFinish &= spec.hasFiletype();
|
|
}
|
|
fileTable.redraw();
|
|
wizard.enableFinishButton(canFinish);
|
|
}
|
|
/**
|
|
* Dispose of all resources.
|
|
* @see com.webcodepro.applecommander.ui.swt.wizard.WizardPane#dispose()
|
|
*/
|
|
public void dispose() {
|
|
fileTable.dispose();
|
|
control.dispose();
|
|
}
|
|
/**
|
|
* Edit the current selection.
|
|
*/
|
|
public void editSelection() {
|
|
final ImportSpecification spec = (ImportSpecification)
|
|
fileTable.getSelection()[0].getData();
|
|
|
|
final Shell dialog = new Shell(wizard.getDialog(), SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL);
|
|
dialog.setText(textBundle.get("FileImportSettingsTitle")); //$NON-NLS-1$
|
|
GridLayout layout = new GridLayout();
|
|
layout.horizontalSpacing = 5;
|
|
layout.makeColumnsEqualWidth = false;
|
|
layout.marginHeight = 5;
|
|
layout.marginWidth = 5;
|
|
layout.numColumns = 2;
|
|
layout.verticalSpacing = 5;
|
|
dialog.setLayout(layout);
|
|
|
|
// Filename prompt:
|
|
Label label = new Label(dialog, SWT.NONE);
|
|
label.setText(textBundle.get("FilenameLabel")); //$NON-NLS-1$
|
|
final Text filenameText = new Text(dialog, SWT.BORDER);
|
|
filenameText.setText(spec.getTargetFilename());
|
|
filenameText.setTextLimit(30);
|
|
GridData layoutData = new GridData();
|
|
layoutData.widthHint = 150;
|
|
filenameText.setLayoutData(layoutData);
|
|
|
|
// Filetype prompt:
|
|
label = new Label(dialog, SWT.NONE);
|
|
label.setText(textBundle.get("FiletypeLabel")); //$NON-NLS-1$
|
|
final Combo filetypes = new Combo(dialog, SWT.BORDER | SWT.READ_ONLY);
|
|
filetypes.setItems(wizard.getDisk().getFiletypes());
|
|
if (spec.hasFiletype()) {
|
|
filetypes.select(filetypes.indexOf(spec.getFiletype()));
|
|
}
|
|
|
|
// Address component: (only used for some filetypes)
|
|
label = new Label(dialog, SWT.NONE);
|
|
label.setText(textBundle.get("AddressLabel")); //$NON-NLS-1$
|
|
addressText = new Text(dialog, SWT.BORDER);
|
|
addressText.setTextLimit(5);
|
|
addressText.setText(AppleUtil.getFormattedWord(spec.getAddress()));
|
|
layoutData = new GridData();
|
|
layoutData.widthHint = 75;
|
|
addressText.setLayoutData(layoutData);
|
|
if (spec.hasFiletype()) {
|
|
addressText.setEnabled(
|
|
wizard.getDisk().needsAddress(spec.getFiletype()));
|
|
}
|
|
|
|
// RAW file image: (probably only used for DOS 3.3)
|
|
label = new Label(dialog, SWT.NONE);
|
|
label.setText(textBundle.get("RawBinaryCheckbox")); //$NON-NLS-1$
|
|
rawCheckbox = new Button(dialog, SWT.CHECK);
|
|
rawCheckbox.setSelection(spec.isRawFileImport());
|
|
|
|
// Enable/disable the address component:
|
|
filetypes.addSelectionListener(new SelectionAdapter() {
|
|
public void widgetSelected(SelectionEvent event) {
|
|
String filetype = filetypes.getItem(
|
|
filetypes.getSelectionIndex());
|
|
getAddressText().setEnabled(
|
|
getWizard().getDisk().needsAddress(filetype));
|
|
}
|
|
});
|
|
|
|
// Bottom row of buttons
|
|
layoutData = new GridData();
|
|
layoutData.horizontalSpan = 2;
|
|
layoutData.grabExcessHorizontalSpace = true;
|
|
layoutData.horizontalAlignment = GridData.CENTER;
|
|
Composite composite = new Composite(dialog, SWT.NONE);
|
|
composite.setLayoutData(layoutData);
|
|
composite.setLayout(new FillLayout(SWT.HORIZONTAL));
|
|
Button button = new Button(composite, SWT.PUSH);
|
|
button.setText(textBundle.get("CancelButton")); //$NON-NLS-1$
|
|
button.addSelectionListener(new SelectionAdapter() {
|
|
public void widgetSelected(SelectionEvent e) {
|
|
filenameText.dispose();
|
|
filetypes.dispose();
|
|
getAddressText().dispose();
|
|
getRawCheckBox().dispose();
|
|
dialog.close();
|
|
}
|
|
});
|
|
button = new Button(composite, SWT.PUSH);
|
|
button.setText(textBundle.get("OkButton")); //$NON-NLS-1$
|
|
dialog.setDefaultButton(button);
|
|
button.addSelectionListener(new SelectionAdapter() {
|
|
public void widgetSelected(SelectionEvent e) {
|
|
spec.setTargetFilename(getWizard().getDisk().
|
|
getSuggestedFilename(filenameText.getText()));
|
|
spec.setFiletype(filetypes.getItem(
|
|
filetypes.getSelectionIndex()));
|
|
spec.setAddress(AppleUtil.convertFormattedWord(
|
|
getAddressText().getText()));
|
|
spec.setRawFileImport(getRawCheckBox().getSelection());
|
|
filenameText.dispose();
|
|
filetypes.dispose();
|
|
getAddressText().dispose();
|
|
getRawCheckBox().dispose();
|
|
dialog.close();
|
|
refreshTable();
|
|
}
|
|
});
|
|
dialog.pack();
|
|
SwtUtil.center(wizard.getDialog(), dialog);
|
|
dialog.open();
|
|
}
|
|
|
|
protected Button getRemoveButton() {
|
|
return removeButton;
|
|
}
|
|
|
|
protected Button getEditButton() {
|
|
return editButton;
|
|
}
|
|
|
|
protected Composite getParent() {
|
|
return parent;
|
|
}
|
|
|
|
protected Table getFileTable() {
|
|
return fileTable;
|
|
}
|
|
|
|
protected ImportWizard getWizard() {
|
|
return wizard;
|
|
}
|
|
|
|
protected Text getAddressText() {
|
|
return addressText;
|
|
}
|
|
|
|
protected Button getRawCheckBox() {
|
|
return rawCheckbox;
|
|
}
|
|
}
|