package com.androhi.androiddrawableviewer.form; import com.androhi.androiddrawableviewer.Constants; import com.androhi.androiddrawableviewer.PluginConfig; import com.androhi.androiddrawableviewer.action.EditTargetResDirAction; import com.androhi.androiddrawableviewer.model.DrawableModel; import com.androhi.androiddrawableviewer.util.IconUtils; import com.intellij.openapi.actionSystem.ActionManager; import com.intellij.openapi.actionSystem.ActionToolbar; import com.intellij.openapi.actionSystem.DefaultActionGroup; import com.intellij.openapi.ide.CopyPasteManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.SimpleToolWindowPanel; import com.intellij.ui.ScrollPaneFactory; import com.intellij.ui.components.JBList; import com.intellij.util.ui.TextTransferable; import javax.swing.*; import javax.swing.border.EmptyBorder; import java.awt.*; import java.awt.event.*; import java.io.File; import java.util.ArrayList; import java.util.Vector; public class DrawableViewer extends SimpleToolWindowPanel implements ActionListener { private static final String MENU_ITEM_SHOW = "Show"; private static final String MENU_ITEM_COPY_DRAWABLE_RES = "Copy Drawable Res"; private static final String MENU_ITEM_DETAIL = "Detail"; private File[] drawableMdpiFiles; private File[] drawableHdpiFiles; private File[] drawableXhdpiFiles; private File[] drawableXxhdpiFiles; private File[] drawableXxxhdpiFiles; private File[] mipmapMdpiFiles; private File[] mipmapHdpiFiles; private File[] mipmapXhdpiFiles; private File[] mipmapXxhdpiFiles; private File[] mipmapXxxhdpiFiles; private ArrayList<String> fileNameList; private ArrayList<DrawableModel> drawableModelList; private JBList itemList; private Project project; public DrawableViewer(final Project project) { super(true, true); this.project = project; drawableModelList = new ArrayList<DrawableModel>(); setToolbar(createToolbarPanel()); setContent(createContentPanel()); } private JComponent createToolbarPanel() { final DefaultActionGroup actionGroup = new DefaultActionGroup(); actionGroup.add(new EditTargetResDirAction()); final ActionToolbar actionToolbar = ActionManager.getInstance().createActionToolbar("AndroidDrawableViewer", actionGroup, true); return actionToolbar.getComponent(); } private JScrollPane createContentPanel() { String projectPath = project.getBasePath(); String resDirPath = projectPath + Constants.DEFAULT_RESOURCE_PATH; PluginConfig config = PluginConfig.getInstance(project); if (config != null) { String savedResDirPath = config.getResDir(); if (savedResDirPath != null) { resDirPath = savedResDirPath; } } String baseDrawableDirPath = resDirPath + Constants.PATH_SEPARATOR + Constants.DRAWABLE_PREFIX; boolean isDrawableMdpi = config != null && config.isDrawableMdpi(); boolean isDrawableHdpi = config != null && config.isDrawableHdpi(); boolean isDrawableXhdpi = config != null && config.isDrawableXhdpi(); boolean isDrawableXxhdpi = config != null && config.isDrawableXxhdpi(); boolean isDrawableXxxhdpi = config != null && config.isDrawableXxxhdpi(); fileNameList = new ArrayList<String>(); if (isDrawableMdpi) { String mdpiPath = baseDrawableDirPath + Constants.DENSITY_MDPI; File mdpiDir = new File(mdpiPath); drawableMdpiFiles = mdpiDir.listFiles(); addFileList(drawableMdpiFiles); } if (isDrawableHdpi) { String hdpiPath = baseDrawableDirPath + Constants.DENSITY_HDPI; File hdpiDir = new File(hdpiPath); drawableHdpiFiles = hdpiDir.listFiles(); addFileList(drawableHdpiFiles); } if (isDrawableXhdpi) { String xhdpiPath = baseDrawableDirPath + Constants.DENSITY_XHDPI; File xhdpiDir = new File(xhdpiPath); drawableXhdpiFiles = xhdpiDir.listFiles(); addFileList(drawableXhdpiFiles); } if (isDrawableXxhdpi) { String xxhdpiPath = baseDrawableDirPath + Constants.DENSITY_XXHDPI; File xxhdpiDir = new File(xxhdpiPath); drawableXxhdpiFiles = xxhdpiDir.listFiles(); addFileList(drawableXxhdpiFiles); } if (isDrawableXxxhdpi) { String xxxhdpiPath = baseDrawableDirPath + Constants.DENSITY_XXXHDPI; File xxxhdpiDir = new File(xxxhdpiPath); drawableXxxhdpiFiles = xxxhdpiDir.listFiles(); addFileList(drawableXxxhdpiFiles); } String baseMipmapDirPath = resDirPath + Constants.PATH_SEPARATOR + Constants.MIPMAP_PREFIX; boolean isMipmapMdpi = config != null && config.isMipmapMdpi(); boolean isMipmapHdpi = config != null && config.isMipmapHdpi(); boolean isMipmapXhdpi = config != null && config.isMipmapXhdpi(); boolean isMipmapXxhdpi = config != null && config.isMipmapXxhdpi(); boolean isMipmapXxxhdpi = config != null && config.isMipmapXxxhdpi(); if (isMipmapMdpi) { String mdpiPath = baseMipmapDirPath + Constants.DENSITY_MDPI; File mdpiDir = new File(mdpiPath); mipmapMdpiFiles = mdpiDir.listFiles(); addFileList(mipmapMdpiFiles); } if (isMipmapHdpi) { String hdpiPath = baseMipmapDirPath + Constants.DENSITY_HDPI; File hdpiDir = new File(hdpiPath); mipmapHdpiFiles = hdpiDir.listFiles(); addFileList(mipmapHdpiFiles); } if (isMipmapXhdpi) { String xhdpiPath = baseMipmapDirPath + Constants.DENSITY_XHDPI; File xhdpiDir = new File(xhdpiPath); mipmapXhdpiFiles = xhdpiDir.listFiles(); addFileList(mipmapXhdpiFiles); } if (isMipmapXxhdpi) { String xxhdpiPath = baseMipmapDirPath + Constants.DENSITY_XXHDPI; File xxhdpiDir = new File(xxhdpiPath); mipmapXxhdpiFiles = xxhdpiDir.listFiles(); addFileList(mipmapXxhdpiFiles); } if (isMipmapXxxhdpi) { String xxxhdpiPath = baseMipmapDirPath + Constants.DENSITY_XXXHDPI; File xxxhdpiDir = new File(xxxhdpiPath); mipmapXxxhdpiFiles = xxxhdpiDir.listFiles(); addFileList(mipmapXxxhdpiFiles); } Vector<JPanel> panels = new Vector<JPanel>(fileNameList.size()); for (String fileName : fileNameList) { String filePath = ""; String drawableDensityName; String mipmapDensityName; JPanel itemPanel = new JPanel(); JLabel iconLabel = new JLabel(); JLabel drawableLabel = new JLabel(); JLabel mipmapLabel = new JLabel(); GridLayout layout = new GridLayout(3, 1, 0, 4); itemPanel.setLayout(layout); itemPanel.setBorder(new EmptyBorder(10, 20, 10, 20)); drawableDensityName = "Drawable: "; mipmapDensityName = "Mipmap: "; // create model info ArrayList<String> drawableDensityList = new ArrayList<String>(); ArrayList<String> mipmapDensityList = new ArrayList<String>(); if (drawableMdpiFiles != null) { for (File file : drawableMdpiFiles) { if (file.getName().equals(fileName)) { drawableDensityName += Constants.DENSITY_MDPI; filePath = file.getPath(); drawableDensityList.add(Constants.DENSITY_MDPI); } } } if (drawableHdpiFiles != null) { for (File file : drawableHdpiFiles) { if (file.getName().equals(fileName)) { if (drawableDensityName.contains("dpi")) drawableDensityName += " / "; drawableDensityName += Constants.DENSITY_HDPI; filePath = file.getPath(); drawableDensityList.add(Constants.DENSITY_HDPI); } } } if (drawableXhdpiFiles != null) { for (File file : drawableXhdpiFiles) { if (file.getName().equals(fileName)) { if (drawableDensityName.contains("dpi")) drawableDensityName += " / "; drawableDensityName += Constants.DENSITY_XHDPI; filePath = file.getPath(); drawableDensityList.add(Constants.DENSITY_XHDPI); } } } if (drawableXxhdpiFiles != null) { for (File file : drawableXxhdpiFiles) { if (file.getName().equals(fileName)) { if (drawableDensityName.contains("dpi")) drawableDensityName += " / "; drawableDensityName += Constants.DENSITY_XXHDPI; filePath = file.getPath(); drawableDensityList.add(Constants.DENSITY_XXHDPI); } } } if (drawableXxxhdpiFiles != null) { for (File file : drawableXxxhdpiFiles) { if (file.getName().equals(fileName)) { if (drawableDensityName.contains("dpi")) drawableDensityName += " / "; drawableDensityName += Constants.DENSITY_XXXHDPI; filePath = file.getPath(); drawableDensityList.add(Constants.DENSITY_XXXHDPI); } } } if (mipmapMdpiFiles != null) { for (File file : mipmapMdpiFiles) { if (file.getName().equals(fileName)) { mipmapDensityName += Constants.DENSITY_MDPI; filePath = file.getPath(); mipmapDensityList.add(Constants.DENSITY_MDPI); } } } if (mipmapHdpiFiles != null) { for (File file : mipmapHdpiFiles) { if (file.getName().equals(fileName)) { if (mipmapDensityName.contains("dpi")) mipmapDensityName += " / "; mipmapDensityName += Constants.DENSITY_HDPI; filePath = file.getPath(); mipmapDensityList.add(Constants.DENSITY_HDPI); } } } if (mipmapXhdpiFiles != null) { for (File file : mipmapXhdpiFiles) { if (file.getName().equals(fileName)) { if (mipmapDensityName.contains("dpi")) mipmapDensityName += " / "; mipmapDensityName += Constants.DENSITY_XHDPI; filePath = file.getPath(); mipmapDensityList.add(Constants.DENSITY_XHDPI); } } } if (mipmapXxhdpiFiles != null) { for (File file : mipmapXxhdpiFiles) { if (file.getName().equals(fileName)) { if (mipmapDensityName.contains("dpi")) mipmapDensityName += " / "; mipmapDensityName += Constants.DENSITY_XXHDPI; filePath = file.getPath(); mipmapDensityList.add(Constants.DENSITY_XXHDPI); } } } if (mipmapXxxhdpiFiles != null) { for (File file : mipmapXxxhdpiFiles) { if (file.getName().equals(fileName)) { if (mipmapDensityName.contains("dpi")) mipmapDensityName += " / "; mipmapDensityName += Constants.DENSITY_XXXHDPI; filePath = file.getPath(); mipmapDensityList.add(Constants.DENSITY_XXXHDPI); } } } if (!drawableDensityName.contains("dpi")) drawableDensityName += "-"; if (!mipmapDensityName.contains("dpi")) mipmapDensityName += "-"; // create row of the list Icon icon = IconUtils.createSmallIcon(filePath); if (icon != null) { // set image and name iconLabel.setIcon(icon); iconLabel.setText(fileName); iconLabel.setHorizontalAlignment(JLabel.LEFT); iconLabel.setFont(new Font(Font.SANS_SERIF, Font.PLAIN, 14)); iconLabel.setIconTextGap(12); itemPanel.add(iconLabel); // set name of the drawable density drawableLabel.setText(drawableDensityName); drawableLabel.setHorizontalTextPosition(JLabel.LEFT); drawableLabel.setFont(new Font(Font.SANS_SERIF, Font.PLAIN, 12)); itemPanel.add(drawableLabel); // set name of the mipmap density mipmapLabel.setText(mipmapDensityName); mipmapLabel.setHorizontalTextPosition(JLabel.LEFT); mipmapLabel.setFont(new Font(Font.SANS_SERIF, Font.PLAIN, 12)); itemPanel.add(mipmapLabel); panels.add(itemPanel); } if (icon != null) { DrawableModel model = new DrawableModel(fileName, resDirPath, drawableDensityList, mipmapDensityList); drawableModelList.add(model); } } // create list itemList = new JBList(panels); itemList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); itemList.setLayoutOrientation(JList.VERTICAL); itemList.setCellRenderer(new ImageListCellRenderer()); itemList.addMouseListener(mouseListener); itemList.addKeyListener(keyListener); return ScrollPaneFactory.createScrollPane(itemList); } private void addFileList(File[] files) { if (files == null) return; for (File file : files) { String fileName = file.getName(); if (!isImageFile(fileName)) { continue; } if (isSameFile(fileName)) { continue; } fileNameList.add(fileName); } } private boolean isImageFile(String name) { return (name.endsWith(Constants.PNG_SUFFIX) || name.endsWith(Constants.JPEG_SUFFIX)); } private boolean isSameFile(String name) { for (String fileName : fileNameList) { if (fileName.equals(name)) { return true; } } return false; } private void showDetailDialog() { DrawableModel drawableModel = drawableModelList.get(itemList.getMinSelectionIndex()); DetailDisplayDialog dialog = new DetailDisplayDialog(project, drawableModel); dialog.show(); } private void copyDrawableId() { DrawableModel drawableModel = drawableModelList.get(itemList.getMinSelectionIndex()); String fileName = drawableModel.getFileName(); int position = fileName.lastIndexOf("."); if (position >= 0) { fileName = fileName.substring(0, position); } final String fileNameWithoutExtension = fileName; CopyPasteManager.getInstance().setContents(new TextTransferable("R.drawable." + fileNameWithoutExtension)); } @Override public void actionPerformed(ActionEvent e) { String cmd = e.getActionCommand(); if (MENU_ITEM_SHOW.equals(cmd)) { showDetailDialog(); } else if (MENU_ITEM_COPY_DRAWABLE_RES.equals(cmd)) { copyDrawableId(); } } private MouseListener mouseListener = new MouseListener() { @Override public void mouseClicked(MouseEvent e) { if (itemList.getItemsCount() == 0) return; JPopupMenu popupMenu = new JPopupMenu(); JMenuItem showMenu = new JMenuItem(MENU_ITEM_SHOW); showMenu.addActionListener(DrawableViewer.this); popupMenu.add(showMenu); JMenuItem copyDrawableIdMenu = new JMenuItem(MENU_ITEM_COPY_DRAWABLE_RES); copyDrawableIdMenu.addActionListener(DrawableViewer.this); popupMenu.add(copyDrawableIdMenu); // todo: detailクリックで詳細ビューダイアログを表示する popupMenu.show(e.getComponent(), e.getX(), e.getY()); } @Override public void mousePressed(MouseEvent e) { } @Override public void mouseReleased(MouseEvent e) { } @Override public void mouseEntered(MouseEvent e) { } @Override public void mouseExited(MouseEvent e) { } }; private KeyListener keyListener = new KeyListener() { @Override public void keyTyped(KeyEvent e) { } @Override public void keyPressed(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_ENTER) { showDetailDialog(); } } @Override public void keyReleased(KeyEvent e) { } }; }