// Path: psd-image/src/psd/Psd.java
// public class Psd implements LayersContainer {
// 	private Header header;
// 	private List<Layer> layers = new ArrayList<Layer>();
//     private Layer baseLayer;
//     private String name;
// 
//     public Psd(InputStream stream) throws IOException {
//         name = "unknown name";
// 
// 		PsdFileParser parser = new PsdFileParser();
// 		parser.getHeaderSectionParser().setHandler(new HeaderSectionHandler() {
//             @Override
//             public void headerLoaded(Header header) {
//                 Psd.this.header = header;
//             }
//         });
// 
//         final List<Layer> fullLayersList = new ArrayList<Layer>();
// 		parser.getLayersSectionParser().setHandler(new LayersSectionHandler() {
//             @Override
//             public void createLayer(LayerParser parser) {
//                 fullLayersList.add(new Layer(parser));
//             }
// 
//             @Override
//             public void createBaseLayer(LayerParser parser) {
//                 baseLayer = new Layer(parser);
//                 if (fullLayersList.isEmpty()) {
//                     fullLayersList.add(baseLayer);
//                 }
//             }
//         });
// 
// 		parser.parse(stream);
// 
//         layers = makeLayersHierarchy(fullLayersList);
//     }
// 
// 	public Psd(File psdFile) throws IOException {
//         name = psdFile.getName();
// 
// 		PsdFileParser parser = new PsdFileParser();
// 		parser.getHeaderSectionParser().setHandler(new HeaderSectionHandler() {
//             @Override
//             public void headerLoaded(Header header) {
//                 Psd.this.header = header;
//             }
//         });
// 
//         final List<Layer> fullLayersList = new ArrayList<Layer>();
// 		parser.getLayersSectionParser().setHandler(new LayersSectionHandler() {
//             @Override
//             public void createLayer(LayerParser parser) {
//                 fullLayersList.add(new Layer(parser));
//             }
// 
//             @Override
//             public void createBaseLayer(LayerParser parser) {
//                 baseLayer = new Layer(parser);
//                 if (fullLayersList.isEmpty()) {
//                     fullLayersList.add(baseLayer);
//                 }
//             }
//         });
// 
// 		BufferedInputStream stream = new BufferedInputStream(new FileInputStream(psdFile));
// 		parser.parse(stream);
// 		stream.close();
// 
//         layers = makeLayersHierarchy(fullLayersList);
// 	}
// 	
//     private List<Layer> makeLayersHierarchy(List<Layer> layers) {
//         LinkedList<LinkedList<Layer>> layersStack = new LinkedList<LinkedList<Layer>>();
//         ArrayList<Layer> rootLayers = new ArrayList<Layer>();
//         for (Layer layer : layers) {
//             switch (layer.getType()) {
//             case HIDDEN: {
//                 layersStack.addFirst(new LinkedList<Layer>());
//                 break;
//             }
//             case FOLDER: {
//                 assert !layersStack.isEmpty();
//                 LinkedList<Layer> folderLayers = layersStack.removeFirst();
//                 for (Layer l : folderLayers) {
//                     layer.addLayer(l);
//                 }
//             }
//                 // break isn't needed
//             case NORMAL: {
//                 if (layersStack.isEmpty()) {
//                     rootLayers.add(layer);
//                 } else {
//                     layersStack.getFirst().add(layer);
//                 }
//                 break;
//             }
//             default:
//                 assert false;
//             }
//         }
//         return rootLayers;
//     }
// 
//     public int getWidth() {
//         return header.getWidth();
//     }
// 
//     public int getHeight() {
//         return header.getHeight();
//     }
// 
//     public int getChannelsCount() {
//         return header.getChannelsCount();
//     }
// 
//     public int getDepth(){
//         return header.getDepth();
//     }
// 
//     public ColorMode getColorMode() {
//         return header.getColorMode();
//     }
// 
//     @Override
//     public Layer getLayer(int index) {
//         return layers.get(index);
//     }
// 
//     @Override
//     public int indexOfLayer(Layer layer) {
//         return layers.indexOf(layer);
//     }
// 
//     @Override
//     public int getLayersCount() {
//         return layers.size();
//     }
// 
//     @Override
//     public String toString() {
//         return name;
//     }
// 
//     public Layer getBaseLayer() {
//         return this.baseLayer;
//     }
// }


import psd.Psd;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
        JMenu fileMenu = new JMenu("File");
        fileMenu.add(new OpenFileAction()).setAccelerator(KeyStroke.getKeyStroke("meta O"));
        bar.add(fileMenu);

        return bar;
    }

    private class OpenFileAction extends AbstractAction {
		private static final long serialVersionUID = 1L;

		public OpenFileAction() {
            super("Open file");
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            FileDialog fileDialog = new FileDialog(frame, "Open psd file", FileDialog.LOAD);
            fileDialog.setDirectory("~/Downloads");
            fileDialog.setFilenameFilter(new FilenameFilter() {
                @Override
                public boolean accept(File dir, String name) {
                    return name.toLowerCase().endsWith(".psd");
                }
            });

            fileDialog.setVisible(true);
            if (fileDialog.getFile() != null) {
                File directory = new File(fileDialog.getDirectory());
                File psdFile = new File(directory, fileDialog.getFile());
                try {
// Path: psd-image/src/psd/Psd.java
// public class Psd implements LayersContainer {
// 	private Header header;
// 	private List<Layer> layers = new ArrayList<Layer>();
//     private Layer baseLayer;
//     private String name;
// 
//     public Psd(InputStream stream) throws IOException {
//         name = "unknown name";
// 
// 		PsdFileParser parser = new PsdFileParser();
// 		parser.getHeaderSectionParser().setHandler(new HeaderSectionHandler() {
//             @Override
//             public void headerLoaded(Header header) {
//                 Psd.this.header = header;
//             }
//         });
// 
//         final List<Layer> fullLayersList = new ArrayList<Layer>();
// 		parser.getLayersSectionParser().setHandler(new LayersSectionHandler() {
//             @Override
//             public void createLayer(LayerParser parser) {
//                 fullLayersList.add(new Layer(parser));
//             }
// 
//             @Override
//             public void createBaseLayer(LayerParser parser) {
//                 baseLayer = new Layer(parser);
//                 if (fullLayersList.isEmpty()) {
//                     fullLayersList.add(baseLayer);
//                 }
//             }
//         });
// 
// 		parser.parse(stream);
// 
//         layers = makeLayersHierarchy(fullLayersList);
//     }
// 
// 	public Psd(File psdFile) throws IOException {
//         name = psdFile.getName();
// 
// 		PsdFileParser parser = new PsdFileParser();
// 		parser.getHeaderSectionParser().setHandler(new HeaderSectionHandler() {
//             @Override
//             public void headerLoaded(Header header) {
//                 Psd.this.header = header;
//             }
//         });
// 
//         final List<Layer> fullLayersList = new ArrayList<Layer>();
// 		parser.getLayersSectionParser().setHandler(new LayersSectionHandler() {
//             @Override
//             public void createLayer(LayerParser parser) {
//                 fullLayersList.add(new Layer(parser));
//             }
// 
//             @Override
//             public void createBaseLayer(LayerParser parser) {
//                 baseLayer = new Layer(parser);
//                 if (fullLayersList.isEmpty()) {
//                     fullLayersList.add(baseLayer);
//                 }
//             }
//         });
// 
// 		BufferedInputStream stream = new BufferedInputStream(new FileInputStream(psdFile));
// 		parser.parse(stream);
// 		stream.close();
// 
//         layers = makeLayersHierarchy(fullLayersList);
// 	}
// 	
//     private List<Layer> makeLayersHierarchy(List<Layer> layers) {
//         LinkedList<LinkedList<Layer>> layersStack = new LinkedList<LinkedList<Layer>>();
//         ArrayList<Layer> rootLayers = new ArrayList<Layer>();
//         for (Layer layer : layers) {
//             switch (layer.getType()) {
//             case HIDDEN: {
//                 layersStack.addFirst(new LinkedList<Layer>());
//                 break;
//             }
//             case FOLDER: {
//                 assert !layersStack.isEmpty();
//                 LinkedList<Layer> folderLayers = layersStack.removeFirst();
//                 for (Layer l : folderLayers) {
//                     layer.addLayer(l);
//                 }
//             }
//                 // break isn't needed
//             case NORMAL: {
//                 if (layersStack.isEmpty()) {
//                     rootLayers.add(layer);
//                 } else {
//                     layersStack.getFirst().add(layer);
//                 }
//                 break;
//             }
//             default:
//                 assert false;
//             }
//         }
//         return rootLayers;
//     }
// 
//     public int getWidth() {
//         return header.getWidth();
//     }
// 
//     public int getHeight() {
//         return header.getHeight();
//     }
// 
//     public int getChannelsCount() {
//         return header.getChannelsCount();
//     }
// 
//     public int getDepth(){
//         return header.getDepth();
//     }
// 
//     public ColorMode getColorMode() {
//         return header.getColorMode();
//     }
// 
//     @Override
//     public Layer getLayer(int index) {
//         return layers.get(index);
//     }
// 
//     @Override
//     public int indexOfLayer(Layer layer) {
//         return layers.indexOf(layer);
//     }
// 
//     @Override
//     public int getLayersCount() {
//         return layers.size();
//     }
// 
//     @Override
//     public String toString() {
//         return name;
//     }
// 
//     public Layer getBaseLayer() {
//         return this.baseLayer;
//     }
// }


// Path: psd-tool/src/psdtool/MainFrame.java
import psd.Psd;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;

        JMenu fileMenu = new JMenu("File");
        fileMenu.add(new OpenFileAction()).setAccelerator(KeyStroke.getKeyStroke("meta O"));
        bar.add(fileMenu);

        return bar;
    }

    private class OpenFileAction extends AbstractAction {
		private static final long serialVersionUID = 1L;

		public OpenFileAction() {
            super("Open file");
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            FileDialog fileDialog = new FileDialog(frame, "Open psd file", FileDialog.LOAD);
            fileDialog.setDirectory("~/Downloads");
            fileDialog.setFilenameFilter(new FilenameFilter() {
                @Override
                public boolean accept(File dir, String name) {
                    return name.toLowerCase().endsWith(".psd");
                }
            });

            fileDialog.setVisible(true);
            if (fileDialog.getFile() != null) {
                File directory = new File(fileDialog.getDirectory());
                File psdFile = new File(directory, fileDialog.getFile());
                try {
                    Psd psd = new Psd(psdFile);