diff --git a/app/cli-acx/src/main/java/io/github/applecommander/acx/ExportMethod.java b/app/cli-acx/src/main/java/io/github/applecommander/acx/ExportMethod.java new file mode 100644 index 0000000..d324848 --- /dev/null +++ b/app/cli-acx/src/main/java/io/github/applecommander/acx/ExportMethod.java @@ -0,0 +1,77 @@ +/* + * AppleCommander - An Apple ][ image utility. + * Copyright (C) 2019-2022 by Robert Greene and others + * robgreene at users.sourceforge.net + * + * 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, or (at your + * option) any later version. + * + * 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. + * + * 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 io.github.applecommander.acx; + +import java.util.Arrays; +import java.util.List; +import java.util.function.Supplier; + +import com.webcodepro.applecommander.storage.FileFilter; +import com.webcodepro.applecommander.storage.filters.AppleWorksDataBaseFileFilter; +import com.webcodepro.applecommander.storage.filters.AppleWorksSpreadSheetFileFilter; +import com.webcodepro.applecommander.storage.filters.AppleWorksWordProcessorFileFilter; +import com.webcodepro.applecommander.storage.filters.ApplesoftFileFilter; +import com.webcodepro.applecommander.storage.filters.AssemblySourceFileFilter; +import com.webcodepro.applecommander.storage.filters.BinaryFileFilter; +import com.webcodepro.applecommander.storage.filters.BusinessBASICFileFilter; +import com.webcodepro.applecommander.storage.filters.DisassemblyFileFilter; +import com.webcodepro.applecommander.storage.filters.GraphicsFileFilter; +import com.webcodepro.applecommander.storage.filters.GutenbergFileFilter; +import com.webcodepro.applecommander.storage.filters.HexDumpFileFilter; +import com.webcodepro.applecommander.storage.filters.IntegerBasicFileFilter; +import com.webcodepro.applecommander.storage.filters.PascalTextFileFilter; +import com.webcodepro.applecommander.storage.filters.TextFileFilter; + +import io.github.applecommander.filters.AppleSingleFileFilter; +import io.github.applecommander.filters.RawFileFilter; + +public enum ExportMethod { + APPLESINGLE(AppleSingleFileFilter::new, "as", "applesingle"), + APPLESOFT(ApplesoftFileFilter::new, "bas", "applesoft"), + APPLEWORKS_DATABASE(AppleWorksDataBaseFileFilter::new, "adb"), + APPLEWORKS_SPREADSHEET(AppleWorksSpreadSheetFileFilter::new, "asp"), + APPLEWORKS_WORDPROCESSOR(AppleWorksWordProcessorFileFilter::new, "awp"), + ASSEMBLY_SOURCE(AssemblySourceFileFilter::new, "asm", "assembly"), + BINARY(BinaryFileFilter::new, "bin", "binary"), + BUSINESS_BASIC(BusinessBASICFileFilter::new, "bbas", "business-basic"), + DISASSEMBLY(DisassemblyFileFilter::new, "disasm", "disassembly"), + GRAPHICS(GraphicsFileFilter::new, "gr", "graphics"), + GUTENBERG_FILE(GutenbergFileFilter::new, "gutenberg"), + HEX_DUMP(HexDumpFileFilter::new, "hex"), + INTEGER_BASIC(IntegerBasicFileFilter::new, "int", "integer"), + PASCAL_TEXT(PascalTextFileFilter::new, "ptext", "pascal-text"), + RAW(RawFileFilter::new, "raw"), + TEXT(TextFileFilter::new, "text"); + + private Supplier constructor; + private List codes; + + private ExportMethod(Supplier constructor, String... codes) { + this.constructor = constructor; + this.codes = Arrays.asList(codes); + } + + public FileFilter create() { + return constructor.get(); + } + public List getCodes() { + return codes; + } +} \ No newline at end of file diff --git a/app/cli-acx/src/main/java/io/github/applecommander/acx/command/ExportCommand.java b/app/cli-acx/src/main/java/io/github/applecommander/acx/command/ExportCommand.java index b86d40c..5efa3da 100644 --- a/app/cli-acx/src/main/java/io/github/applecommander/acx/command/ExportCommand.java +++ b/app/cli-acx/src/main/java/io/github/applecommander/acx/command/ExportCommand.java @@ -39,9 +39,10 @@ import com.webcodepro.applecommander.util.filestreamer.FileStreamer; import com.webcodepro.applecommander.util.filestreamer.FileTuple; import com.webcodepro.applecommander.util.filestreamer.TypeOfFile; +import io.github.applecommander.acx.ExportMethod; import io.github.applecommander.acx.base.ReadOnlyDiskImageCommandOptions; -import io.github.applecommander.filters.AppleSingleFileFilter; -import io.github.applecommander.filters.RawFileFilter; +import io.github.applecommander.acx.converter.ExportMethodConverter; +import io.github.applecommander.acx.converter.ExportMethodConverter.ExportMethodCandidates; import picocli.CommandLine.ArgGroup; import picocli.CommandLine.Command; import picocli.CommandLine.Model.CommandSpec; @@ -143,13 +144,21 @@ public class ExportCommand extends ReadOnlyDiskImageCommandOptions { private static class FileExtractMethods { private Function extractFunction = this::asSuggestedFile; + @Option(names = { "--method" }, converter = ExportMethodConverter.class, + completionCandidates = ExportMethodCandidates.class, + description = "Select a specific export method type (${COMPLETION-CANDIDATES}).") + public void selectExportMethod(final ExportMethod exportMethod) { + this.extractFunction = fileFilter -> exportMethod.create(); + } + + // Short-cuts to some of the more common, non-suggested, filters @Option(names = { "--raw", "--binary" }, description = "Extract file in native format.") public void setBinaryExtraction(boolean flag) { - this.extractFunction = this::asRawFile; + selectExportMethod(ExportMethod.BINARY); } @Option(names = { "--hex", "--dump" }, description = "Extract file in hex dump format.") public void setHexDumpExtraction(boolean flag) { - this.extractFunction = this::asHexDumpFile; + selectExportMethod(ExportMethod.HEX_DUMP); } @Option(names = { "--suggested" }, description = "Extract file as suggested by AppleCommander (default)") public void setSuggestedExtraction(boolean flag) { @@ -157,12 +166,13 @@ public class ExportCommand extends ReadOnlyDiskImageCommandOptions { } @Option(names = { "--as", "--applesingle" }, description = "Extract file to AppleSingle file.") public void setAppleSingleExtraction(boolean flag) { - this.extractFunction = this::asAppleSingleFile; + selectExportMethod(ExportMethod.APPLESINGLE); + } + @Option(names = { "--disassembly" }, description = "Dissassembly file.") + public void setDisassemblyExtraction(boolean flag) { + selectExportMethod(ExportMethod.DISASSEMBLY); } - public FileFilter asRawFile(FileEntry entry) { - return new RawFileFilter(); - } public FileFilter asSuggestedFile(FileEntry entry) { FileFilter ff = entry.getSuggestedFilter(); if (ff instanceof BinaryFileFilter) { @@ -170,11 +180,5 @@ public class ExportCommand extends ReadOnlyDiskImageCommandOptions { } return ff; } - public FileFilter asHexDumpFile(FileEntry entry) { - return new HexDumpFileFilter(); - } - public FileFilter asAppleSingleFile(FileEntry entry) { - return new AppleSingleFileFilter(); - } } } diff --git a/app/cli-acx/src/main/java/io/github/applecommander/acx/converter/ExportMethodConverter.java b/app/cli-acx/src/main/java/io/github/applecommander/acx/converter/ExportMethodConverter.java new file mode 100644 index 0000000..dba1667 --- /dev/null +++ b/app/cli-acx/src/main/java/io/github/applecommander/acx/converter/ExportMethodConverter.java @@ -0,0 +1,57 @@ +/* + * AppleCommander - An Apple ][ image utility. + * Copyright (C) 2019-2022 by Robert Greene and others + * robgreene at users.sourceforge.net + * + * 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, or (at your + * option) any later version. + * + * 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. + * + * 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 io.github.applecommander.acx.converter; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +import io.github.applecommander.acx.ExportMethod; +import picocli.CommandLine.ITypeConverter; +import picocli.CommandLine.TypeConversionException; + +public class ExportMethodConverter implements ITypeConverter { + public static final Map EXPORTS = new HashMap<>(); + static { + for (ExportMethod x : ExportMethod.values()) { + for (String code : x.getCodes()) { + EXPORTS.put(code, x); + } + } + } + + @Override + public ExportMethod convert(String value) throws Exception { + if (EXPORTS.containsKey(value)) { + return EXPORTS.get(value); + } + throw new TypeConversionException(String.format("Export method not found: %s", value)); + } + + public static class ExportMethodCandidates extends ArrayList { + private static final long serialVersionUID = -744232190636905235L; + + ExportMethodCandidates() { + super(EXPORTS.keySet()); + Collections.sort(this); + } + } +} diff --git a/gradle.properties b/gradle.properties index dc66651..e95ccb1 100644 --- a/gradle.properties +++ b/gradle.properties @@ -16,3 +16,4 @@ commonsCsvVersion=1.8 gsonVersion=2.8.6 picocliVersion=4.6.2 springBoot=2.6.1 +acdasmVersion=0.3.0 diff --git a/lib/ac-api/build.gradle b/lib/ac-api/build.gradle index e6f0418..d957d01 100644 --- a/lib/ac-api/build.gradle +++ b/lib/ac-api/build.gradle @@ -16,6 +16,7 @@ repositories { dependencies { implementation "net.sf.applecommander:ShrinkItArchive:$shkVersion" + implementation "net.sf.applecommander:acdasm:$acdasmVersion" implementation "org.apache.commons:commons-csv:$commonsCsvVersion" implementation "com.google.code.gson:gson:$gsonVersion" diff --git a/lib/ac-api/src/main/java/com/webcodepro/applecommander/storage/filters/DisassemblyFileFilter.java b/lib/ac-api/src/main/java/com/webcodepro/applecommander/storage/filters/DisassemblyFileFilter.java new file mode 100644 index 0000000..83d6b4a --- /dev/null +++ b/lib/ac-api/src/main/java/com/webcodepro/applecommander/storage/filters/DisassemblyFileFilter.java @@ -0,0 +1,75 @@ +/* + * AppleCommander - An Apple ][ image utility. + * Copyright (C) 2002-2022 by Robert Greene + * robgreene at users.sourceforge.net + * + * 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, or (at your + * option) any later version. + * + * 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. + * + * 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 com.webcodepro.applecommander.storage.filters; + +import java.io.PrintWriter; +import java.io.StringWriter; +import java.util.List; +import java.util.stream.Collectors; + +import com.webcodepro.applecommander.storage.FileEntry; +import com.webcodepro.applecommander.storage.FileFilter; + +import io.github.applecommander.disassembler.api.Disassembler; +import io.github.applecommander.disassembler.api.Instruction; +import io.github.applecommander.disassembler.api.mos6502.InstructionSet6502; + +/** + * Disassemble the given set of bytes. + */ +public class DisassemblyFileFilter implements FileFilter { + public byte[] filter(FileEntry fileEntry) { + List instructions = Disassembler.with(fileEntry.getFileData()) + .startingAddress(fileEntry.getAddress()) + .use(InstructionSet6502.for6502()) + .decode(); + + String code = instructions.stream() + .map(this::emitRaw) + .collect(Collectors.joining()); + + return code.getBytes(); + } + + public String getSuggestedFileName(FileEntry fileEntry) { + String fileName = fileEntry.getFilename().trim(); + if (!fileName.toLowerCase().endsWith(".asm")) { + fileName = fileName + ".asm"; + } + return fileName; + } + + public String emitRaw(Instruction instruction) { + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + pw.printf("%04X- ", instruction.getAddress()); + + byte[] code = instruction.getBytes(); + for (int i=0; i<3; i++) { + if (i >= code.length) { + pw.printf(" "); + } else { + pw.printf("%02X ", code[i]); + } + } + pw.printf(" %s\n", instruction.formatOperandWithValue()); + return sw.toString(); + } +} diff --git a/lib/ac-api/src/main/java/com/webcodepro/applecommander/storage/os/prodos/ProdosFileEntry.java b/lib/ac-api/src/main/java/com/webcodepro/applecommander/storage/os/prodos/ProdosFileEntry.java index 3a83153..820dffd 100644 --- a/lib/ac-api/src/main/java/com/webcodepro/applecommander/storage/os/prodos/ProdosFileEntry.java +++ b/lib/ac-api/src/main/java/com/webcodepro/applecommander/storage/os/prodos/ProdosFileEntry.java @@ -37,6 +37,7 @@ import com.webcodepro.applecommander.storage.filters.ApplesoftFileFilter; import com.webcodepro.applecommander.storage.filters.AssemblySourceFileFilter; import com.webcodepro.applecommander.storage.filters.BinaryFileFilter; import com.webcodepro.applecommander.storage.filters.BusinessBASICFileFilter; +import com.webcodepro.applecommander.storage.filters.DisassemblyFileFilter; import com.webcodepro.applecommander.storage.filters.GraphicsFileFilter; import com.webcodepro.applecommander.storage.filters.IntegerBasicFileFilter; import com.webcodepro.applecommander.storage.filters.TextFileFilter; @@ -589,6 +590,8 @@ public class ProdosFileEntry extends ProdosCommonEntry implements FileEntry { filter.setMode(GraphicsFileFilter.MODE_QUICKDRAW2_ICON); return filter; } + case 0xff: + return new DisassemblyFileFilter(); } return new BinaryFileFilter(); } diff --git a/lib/ac-api/src/main/resources/com/webcodepro/applecommander/ui/UiBundle.properties b/lib/ac-api/src/main/resources/com/webcodepro/applecommander/ui/UiBundle.properties index 7f88227..621aa1c 100644 --- a/lib/ac-api/src/main/resources/com/webcodepro/applecommander/ui/UiBundle.properties +++ b/lib/ac-api/src/main/resources/com/webcodepro/applecommander/ui/UiBundle.properties @@ -351,6 +351,9 @@ FileViewerWindow.RawDumpTooltip=Displays file as a raw hex dump (F4) FileViewerWindow.CopyButton=Copy FileViewerWindow.CopyTooltip=Copies selection to the clipboard (CTRL+C) FileViewerWindow.PrintTooltip=Print contents... (CTRL+P) +FileViewerWindow.DisassemblyButton=Disassembly +FileViewerWindow.DisassemblyTooltip=Displays file disassembled + # DiskWindow DiskWindow.Title=AppleCommander Disk View - {0} diff --git a/lib/ac-api/src/test/java/com/webcodepro/applecommander/storage/DiskHelperTest.java b/lib/ac-api/src/test/java/com/webcodepro/applecommander/storage/DiskHelperTest.java index 8f8b310..93ab10e 100644 --- a/lib/ac-api/src/test/java/com/webcodepro/applecommander/storage/DiskHelperTest.java +++ b/lib/ac-api/src/test/java/com/webcodepro/applecommander/storage/DiskHelperTest.java @@ -30,6 +30,7 @@ import org.junit.Test; import com.webcodepro.applecommander.storage.FormattedDisk.DiskUsage; import com.webcodepro.applecommander.storage.filters.ApplesoftFileFilter; import com.webcodepro.applecommander.storage.filters.BinaryFileFilter; +import com.webcodepro.applecommander.storage.filters.DisassemblyFileFilter; import com.webcodepro.applecommander.storage.filters.GraphicsFileFilter; import com.webcodepro.applecommander.storage.filters.IntegerBasicFileFilter; import com.webcodepro.applecommander.storage.filters.TextFileFilter; @@ -69,7 +70,7 @@ public class DiskHelperTest { FormattedDisk[] disks = showDirectory(config.getDiskDir() + "/Prodos.dsk"); //$NON-NLS-1$ assertApplesoftFile(disks[0], "COPY.ME"); //$NON-NLS-1$ assertBinaryFile(disks[0], "SETTINGS"); //$NON-NLS-1$ - assertBinaryFile(disks[0], "PRODOS"); //$NON-NLS-1$ + assertDisassemblyFile(disks[0], "PRODOS"); //$NON-NLS-1$ } @Test @@ -233,6 +234,14 @@ public class DiskHelperTest { fileEntry.getSuggestedFilter() instanceof BinaryFileFilter); } + protected void assertDisassemblyFile(FormattedDisk disk, String filename) throws DiskException { + assertNotNull(filename + " test: Disk should not be null", disk); + FileEntry fileEntry = disk.getFile(filename); + assertNotNull(filename + " test: File not found", disk); + assertTrue("DisassemblyFileFilter was not chosen", + fileEntry.getSuggestedFilter() instanceof DisassemblyFileFilter); + } + protected void assertGraphicsFile(FormattedDisk disk, String filename) throws DiskException { assertNotNull(filename + " test: Disk should not be null", disk); //$NON-NLS-1$ FileEntry fileEntry = disk.getFile(filename); diff --git a/lib/ac-swt-common/src/main/java/com/webcodepro/applecommander/ui/swt/FileViewerWindow.java b/lib/ac-swt-common/src/main/java/com/webcodepro/applecommander/ui/swt/FileViewerWindow.java index 9609981..6923866 100644 --- a/lib/ac-swt-common/src/main/java/com/webcodepro/applecommander/ui/swt/FileViewerWindow.java +++ b/lib/ac-swt-common/src/main/java/com/webcodepro/applecommander/ui/swt/FileViewerWindow.java @@ -21,6 +21,7 @@ package com.webcodepro.applecommander.ui.swt; import java.util.HashMap; import java.util.Map; +import java.util.Optional; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.ScrolledComposite; @@ -48,6 +49,7 @@ import com.webcodepro.applecommander.storage.filters.AppleWorksWordProcessorFile import com.webcodepro.applecommander.storage.filters.ApplesoftFileFilter; import com.webcodepro.applecommander.storage.filters.AssemblySourceFileFilter; import com.webcodepro.applecommander.storage.filters.BusinessBASICFileFilter; +import com.webcodepro.applecommander.storage.filters.DisassemblyFileFilter; import com.webcodepro.applecommander.storage.filters.GraphicsFileFilter; import com.webcodepro.applecommander.storage.filters.IntegerBasicFileFilter; import com.webcodepro.applecommander.storage.filters.PascalTextFileFilter; @@ -56,6 +58,7 @@ import com.webcodepro.applecommander.storage.filters.GutenbergFileFilter; import com.webcodepro.applecommander.ui.UiBundle; import com.webcodepro.applecommander.ui.swt.filteradapter.ApplesoftFilterAdapter; import com.webcodepro.applecommander.ui.swt.filteradapter.BusinessBASICFilterAdapter; +import com.webcodepro.applecommander.ui.swt.filteradapter.DisassemblyFilterAdapter; import com.webcodepro.applecommander.ui.swt.filteradapter.FilterAdapter; import com.webcodepro.applecommander.ui.swt.filteradapter.GraphicsFilterAdapter; import com.webcodepro.applecommander.ui.swt.filteradapter.HexFilterAdapter; @@ -90,6 +93,7 @@ public class FileViewerWindow { private ToolBar toolBar; private ToolItem nativeToolItem; private ToolItem hexDumpToolItem; + private Optional disassemblyToolItem = Optional.empty(); // May or may not be setup private ToolItem rawDumpToolItem; private ToolItem copyToolItem; @@ -103,6 +107,7 @@ public class FileViewerWindow { private FilterAdapter nativeFilterAdapter; private FilterAdapter hexFilterAdapter; private FilterAdapter rawDumpFilterAdapter; + private FilterAdapter disassemblyFilterAdapter; /** * Construct the file viewer window. @@ -222,6 +227,11 @@ public class FileViewerWindow { textBundle.get("FileViewerWindow.TextTooltip"), //$NON-NLS-1$ imageManager.get(ImageManager.ICON_VIEW_AS_TEXTFILE) )); + nativeFilterAdapterMap.put(DisassemblyFileFilter.class, + new DisassemblyFilterAdapter(this, textBundle.get("FileViewerWindow.DisassemblyButton"), + textBundle.get("FileViewerWindow.DisassemblyTooltip"), + imageManager.get(ImageManager.ICON_COMPILE_FILE) + )); } /** @@ -261,6 +271,10 @@ public class FileViewerWindow { nativeFilterAdapter = hexFilterAdapter; } rawDumpToolItem = createRawDumpToolItem(); + // Add the disassembly button only if it's not the default and if this filetype has a start address. + if (fileEntry != null && fileEntry.needsAddress() && !(nativeFilter instanceof DisassemblyFileFilter)) { + disassemblyToolItem = Optional.of(createDisassemblyToolItem()); + } new ToolItem(toolBar, SWT.SEPARATOR); copyToolItem = createCopyToolItem(); new ToolItem(toolBar, SWT.SEPARATOR); @@ -291,7 +305,19 @@ public class FileViewerWindow { ToolItem toolItem = rawDumpFilterAdapter.create(toolBar); return toolItem; } - + + /** + * Create the disassembly tool item (button). + */ + protected ToolItem createDisassemblyToolItem() { + disassemblyFilterAdapter = new DisassemblyFilterAdapter(this, textBundle.get("FileViewerWindow.DisassemblyButton"), //$NON-NLS-1$ + textBundle.get("FileViewerWindow.DisassemblyTooltip"), //$NON-NLS-1$ + imageManager.get(ImageManager.ICON_COMPILE_FILE)); + disassemblyFilterAdapter.setDisassemblySelected(); + ToolItem toolItem = disassemblyFilterAdapter.create(toolBar); + return toolItem; + } + /** * Create the copy tool item (button). */ @@ -351,15 +377,15 @@ public class FileViewerWindow { switch (event.keyCode) { case SWT.F2: // the "native" file format (image, text, etc) getNativeFilterAdapter().display(); - setFilterToolItemSelection(true, false, false); + setFilterToolItemSelection(true, false, false, false); break; case SWT.F3: // Hex format getHexFilterAdapter().display(); - setFilterToolItemSelection(false, true, false); + setFilterToolItemSelection(false, true, false, false); break; case SWT.F4: // "Raw" hex format getRawDumpFilterAdapter().display(); - setFilterToolItemSelection(false, false, true); + setFilterToolItemSelection(false, false, true, false); break; } } @@ -395,10 +421,11 @@ public class FileViewerWindow { public Color getBlueColor() { return blue; } - public void setFilterToolItemSelection(boolean nativeSelected, boolean hexSelected, boolean dumpSelected) { + public void setFilterToolItemSelection(boolean nativeSelected, boolean hexSelected, boolean dumpSelected, boolean disassemblySelected) { if (nativeToolItem != null) nativeToolItem.setSelection(nativeSelected); hexDumpToolItem.setSelection(hexSelected); rawDumpToolItem.setSelection(dumpSelected); + disassemblyToolItem.ifPresent(toolItem -> toolItem.setSelection(disassemblySelected)); } protected ContentTypeAdapter getContentTypeAdapter() { return contentTypeAdapter; diff --git a/lib/ac-swt-common/src/main/java/com/webcodepro/applecommander/ui/swt/filteradapter/DisassemblyFilterAdapter.java b/lib/ac-swt-common/src/main/java/com/webcodepro/applecommander/ui/swt/filteradapter/DisassemblyFilterAdapter.java new file mode 100644 index 0000000..6f485a0 --- /dev/null +++ b/lib/ac-swt-common/src/main/java/com/webcodepro/applecommander/ui/swt/filteradapter/DisassemblyFilterAdapter.java @@ -0,0 +1,40 @@ +/* + * AppleCommander - An Apple ][ image utility. + * Copyright (C) 2002-2022 by Robert Greene + * robgreene at users.sourceforge.net + * + * 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, or (at your + * option) any later version. + * + * 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. + * + * 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 com.webcodepro.applecommander.ui.swt.filteradapter; + +import org.eclipse.swt.graphics.Image; + +import com.webcodepro.applecommander.storage.filters.DisassemblyFileFilter; +import com.webcodepro.applecommander.ui.swt.FileViewerWindow; + +/** + * Provides a view of the dissasembly of a program as seen when loaded from the disk. + * + * @author Rob Greene + */ +public class DisassemblyFilterAdapter extends TextFilterAdapter { + public DisassemblyFilterAdapter(FileViewerWindow window, String text, String toolTipText, Image image) { + super(window, text, toolTipText, image); + } + + protected String createTextContent() { + return new String(new DisassemblyFileFilter().filter(getFileEntry())); + } +} diff --git a/lib/ac-swt-common/src/main/java/com/webcodepro/applecommander/ui/swt/filteradapter/FilterAdapter.java b/lib/ac-swt-common/src/main/java/com/webcodepro/applecommander/ui/swt/filteradapter/FilterAdapter.java index 142bfd6..a39b98f 100644 --- a/lib/ac-swt-common/src/main/java/com/webcodepro/applecommander/ui/swt/filteradapter/FilterAdapter.java +++ b/lib/ac-swt-common/src/main/java/com/webcodepro/applecommander/ui/swt/filteradapter/FilterAdapter.java @@ -50,6 +50,7 @@ public abstract class FilterAdapter { private boolean nativeSelected = true; private boolean hexSelected = false; private boolean dumpSelected = false; + private boolean disassemblySelected = false; public FilterAdapter(FileViewerWindow window, String text, String toolTipText, Image image) { @@ -77,7 +78,7 @@ public abstract class FilterAdapter { public void widgetSelected(SelectionEvent e) { display(); getWindow().setFilterToolItemSelection( - isNativeSelected(), isHexSelected(), isDumpSelected()); + isNativeSelected(), isHexSelected(), isDumpSelected(), isDisassemblySelected()); } }); } @@ -130,16 +131,25 @@ public abstract class FilterAdapter { nativeSelected = false; hexSelected = false; dumpSelected = true; + disassemblySelected = false; } public void setHexSelected() { nativeSelected = false; hexSelected = true; dumpSelected = false; + disassemblySelected = false; } + public void setDisassemblySelected() { + nativeSelected = false; + hexSelected = false; + dumpSelected = false; + disassemblySelected = true; + } public void setNativeSelected() { nativeSelected = true; hexSelected = false; dumpSelected = false; + disassemblySelected = false; } protected boolean isDumpSelected() { return dumpSelected; @@ -147,6 +157,9 @@ public abstract class FilterAdapter { protected boolean isHexSelected() { return hexSelected; } + protected boolean isDisassemblySelected() { + return disassemblySelected; + } protected boolean isNativeSelected() { return nativeSelected; }