From 539eb15f75c24ef90ea4f69dc6eca08c0ebe2840 Mon Sep 17 00:00:00 2001 From: Nymphxyz Date: Tue, 10 Oct 2023 15:06:51 +1100 Subject: [PATCH 1/6] chore: make initial windows size smaller --- muon-app/src/main/java/muon/app/ui/AppWindow.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/muon-app/src/main/java/muon/app/ui/AppWindow.java b/muon-app/src/main/java/muon/app/ui/AppWindow.java index 39d5f2af..29482619 100644 --- a/muon-app/src/main/java/muon/app/ui/AppWindow.java +++ b/muon-app/src/main/java/muon/app/ui/AppWindow.java @@ -64,8 +64,8 @@ public AppWindow() { Dimension screenD = Toolkit.getDefaultToolkit().getScreenSize(); - int screenWidth = screenD.width - inset.left - inset.right; - int screenHeight = screenD.height - inset.top - inset.bottom; + int screenWidth = (screenD.width - inset.left - inset.right)/2; + int screenHeight = (screenD.height - inset.top - inset.bottom)*2/3; if (screenWidth < 1024 || screenHeight < 650 || App.getGlobalSettings().isStartMaximized()) { setSize(screenWidth, screenHeight); From d8079d07c42324f8b8c30830fc48cbceeca276c9 Mon Sep 17 00:00:00 2001 From: Nymphxyz Date: Tue, 10 Oct 2023 15:07:15 +1100 Subject: [PATCH 2/6] chore: bump sshj to 0.36.0 --- muon-app/pom.xml | 2 +- muon-app/src/main/java/muon/app/ssh/SshClient2.java | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/muon-app/pom.xml b/muon-app/pom.xml index ae98e127..3a00e3f8 100644 --- a/muon-app/pom.xml +++ b/muon-app/pom.xml @@ -139,7 +139,7 @@ com.hierynomus sshj - 0.31.0 + 0.36.0 diff --git a/muon-app/src/main/java/muon/app/ssh/SshClient2.java b/muon-app/src/main/java/muon/app/ssh/SshClient2.java index 6c78b766..7b7418c5 100644 --- a/muon-app/src/main/java/muon/app/ssh/SshClient2.java +++ b/muon-app/src/main/java/muon/app/ssh/SshClient2.java @@ -453,9 +453,8 @@ public LocalPortForwarder newLocalPortForwarder(Parameters parameters, ServerSoc return this.sshj.newLocalPortForwarder(parameters, serverSocket); } - @SuppressWarnings("deprecation") public RemotePortForwarder getRemotePortForwarder() { - this.sshj.getTransport().setHeartbeatInterval(30); + this.sshj.getConnection().getKeepAlive().setKeepAliveInterval(30); return this.sshj.getRemotePortForwarder(); } From db435beaaee7380daa7aaf5a8fa800684a8b2fa9 Mon Sep 17 00:00:00 2001 From: Nymphxyz Date: Tue, 10 Oct 2023 15:08:54 +1100 Subject: [PATCH 3/6] fix: separate the logic between using sudo and transferring to temporary folder --- .../session/files/transfer/FileTransfer.java | 32 +++++++++++-------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/muon-app/src/main/java/muon/app/ui/components/session/files/transfer/FileTransfer.java b/muon-app/src/main/java/muon/app/ui/components/session/files/transfer/FileTransfer.java index b138d958..458271f6 100644 --- a/muon-app/src/main/java/muon/app/ui/components/session/files/transfer/FileTransfer.java +++ b/muon-app/src/main/java/muon/app/ui/components/session/files/transfer/FileTransfer.java @@ -122,24 +122,28 @@ public void run() { tmpFilePath.setText("Files copied in " + tmpDir + " due to permission issues"); tmpFilePath.setEnabled(true); JOptionPane.showMessageDialog(null, tmpFilePath, "Copied to temp directory", JOptionPane.WARNING_MESSAGE); + } - if (!App.getGlobalSettings().isPromptForSudo() || - JOptionPane.showConfirmDialog(null, - "Permission denied, do you want to copy files from the temporary folder to destination with sudo?", - App.bundle.getString("insufficient_permisions"), JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) { - String command = "sh -c \"cd '" + tmpDir + "'; cp -r * '" + this.targetFolder + "'\""; - - System.out.println("Invoke sudo: " + command); - int ret = SudoUtils.runSudo(command, instance); - if (ret == 0) { - callback.done(this); - return; - } + if (!App.getGlobalSettings().isPromptForSudo() || + JOptionPane.showConfirmDialog(null, + "Permission denied, do you want to copy files from the temporary folder to destination with sudo?", + App.bundle.getString("insufficient_permisions"), JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) { + // Because transferTemporaryDirectory already create and transfer files, here can skip these steps + if (App.getGlobalSettings().isTransferTemporaryDirectory()) { + targetFs.mkdir(tmpDir); + transfer(tmpDir, instance); } - } + String command = "sh -c \"cd '" + tmpDir + "'; cp -r * '" + this.targetFolder + "'\""; - throw e; + System.out.println("Invoke sudo: " + command); + int ret = SudoUtils.runSudo(command, instance); + if (ret == 0) { + callback.done(this); + return; + } + throw e; + } } } } catch (Exception e) { From b564576eeb2d3df6a2d02a99924716600cab34af Mon Sep 17 00:00:00 2001 From: Nymphxyz Date: Tue, 10 Oct 2023 15:09:19 +1100 Subject: [PATCH 4/6] fix: reload file browser if background transfer is done --- .../muon/app/ui/components/session/SessionContentPanel.java | 2 +- .../java/muon/app/ui/components/session/files/FileBrowser.java | 2 +- .../session/files/transfer/BackgroundTransferPanel.java | 3 +++ 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/muon-app/src/main/java/muon/app/ui/components/session/SessionContentPanel.java b/muon-app/src/main/java/muon/app/ui/components/session/SessionContentPanel.java index 69143e0e..77c40352 100644 --- a/muon-app/src/main/java/muon/app/ui/components/session/SessionContentPanel.java +++ b/muon-app/src/main/java/muon/app/ui/components/session/SessionContentPanel.java @@ -49,7 +49,7 @@ public class SessionContentPanel extends JPanel implements PageHolder, CachedCre private final DisabledPanel disabledPanel; private final TransferProgressPanel progressPanel = new TransferProgressPanel(); private final TabbedPage[] pages; - private final FileBrowser fileBrowser; + public final FileBrowser fileBrowser; private final LogViewer logViewer; private final TerminalHolder terminalHolder; private final DiskspaceAnalyzer diskspaceAnalyzer; diff --git a/muon-app/src/main/java/muon/app/ui/components/session/files/FileBrowser.java b/muon-app/src/main/java/muon/app/ui/components/session/files/FileBrowser.java index ba19a099..8f67c961 100644 --- a/muon-app/src/main/java/muon/app/ui/components/session/files/FileBrowser.java +++ b/muon-app/src/main/java/muon/app/ui/components/session/files/FileBrowser.java @@ -213,7 +213,7 @@ public void done(FileTransfer fileTransfer) { holder.EXECUTOR.submit(this.ongoingFileTransfer); } - private void reloadView() { + public void reloadView() { Component c = leftTabs.getSelectedContent(); System.out.println("c1 " + c); if (c instanceof AbstractFileBrowserView) { diff --git a/muon-app/src/main/java/muon/app/ui/components/session/files/transfer/BackgroundTransferPanel.java b/muon-app/src/main/java/muon/app/ui/components/session/files/transfer/BackgroundTransferPanel.java index 9dac55e5..50da1ba1 100644 --- a/muon-app/src/main/java/muon/app/ui/components/session/files/transfer/BackgroundTransferPanel.java +++ b/muon-app/src/main/java/muon/app/ui/components/session/files/transfer/BackgroundTransferPanel.java @@ -150,6 +150,9 @@ public void done(FileTransfer fileTransfer) { callback.accept(transferCount.get()); this.fileTransfer.getSession().addToSessionCache(this.fileTransfer.getInstance()); System.out.println("done transfer"); + + this.fileTransfer.getSession().fileBrowser.reloadView(); + SwingUtilities.invokeLater(() -> { BackgroundTransferPanel.this.verticalBox.remove(this); BackgroundTransferPanel.this.revalidate(); From 30a75d5bfe798acaba418aef2140c08409c5b01b Mon Sep 17 00:00:00 2001 From: Nymphxyz Date: Wed, 11 Oct 2023 14:09:17 +1100 Subject: [PATCH 5/6] fix: missing ! symbol --- .../app/ui/components/session/files/transfer/FileTransfer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/muon-app/src/main/java/muon/app/ui/components/session/files/transfer/FileTransfer.java b/muon-app/src/main/java/muon/app/ui/components/session/files/transfer/FileTransfer.java index 458271f6..a798d217 100644 --- a/muon-app/src/main/java/muon/app/ui/components/session/files/transfer/FileTransfer.java +++ b/muon-app/src/main/java/muon/app/ui/components/session/files/transfer/FileTransfer.java @@ -129,7 +129,7 @@ public void run() { "Permission denied, do you want to copy files from the temporary folder to destination with sudo?", App.bundle.getString("insufficient_permisions"), JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) { // Because transferTemporaryDirectory already create and transfer files, here can skip these steps - if (App.getGlobalSettings().isTransferTemporaryDirectory()) { + if (!App.getGlobalSettings().isTransferTemporaryDirectory()) { targetFs.mkdir(tmpDir); transfer(tmpDir, instance); } From d9a8a59a8a84d54f4a954c0931eefc1c0cb4a635 Mon Sep 17 00:00:00 2001 From: Nymphxyz Date: Tue, 12 Dec 2023 11:52:27 +1100 Subject: [PATCH 6/6] feat: add delte file shortcut --- .../session/files/local/LocalMenuHandler.java | 64 +++++++++++++------ 1 file changed, 43 insertions(+), 21 deletions(-) diff --git a/muon-app/src/main/java/muon/app/ui/components/session/files/local/LocalMenuHandler.java b/muon-app/src/main/java/muon/app/ui/components/session/files/local/LocalMenuHandler.java index 21a99044..d3cfcc96 100644 --- a/muon-app/src/main/java/muon/app/ui/components/session/files/local/LocalMenuHandler.java +++ b/muon-app/src/main/java/muon/app/ui/components/session/files/local/LocalMenuHandler.java @@ -15,6 +15,7 @@ import java.awt.datatransfer.StringSelection; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.awt.event.KeyEvent; import java.io.FileNotFoundException; import java.util.Arrays; import java.util.stream.Collectors; @@ -39,10 +40,21 @@ public void initMenuHandler(FolderView folderView) { this.folderView = folderView; InputMap map = folderView.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); ActionMap act = folderView.getActionMap(); - this.initMenuItems(); + this.initMenuItems(map, act); } - private void initMenuItems() { + /** + * Add shortcut for menu item + */ + private static void addShortcut(JMenuItem menuItem, KeyStroke keyStroke, InputMap inputMap, + ActionMap actionMap, String actionKey, Action action) { + menuItem.addActionListener(action); + inputMap.put(keyStroke, actionKey); + actionMap.put(actionKey, action); + menuItem.setAccelerator(keyStroke); + } + + private void initMenuItems(InputMap map, ActionMap act) { mOpen = new JMenuItem(bundle.getString("open")); mOpen.addActionListener(new ActionListener() { @Override @@ -81,12 +93,19 @@ public void actionPerformed(ActionEvent e) { }); mDelete = new JMenuItem(bundle.getString("delete")); - mDelete.addActionListener(new ActionListener() { + AbstractAction aDelete = new AbstractAction() { @Override public void actionPerformed(ActionEvent e) { - delete(folderView.getSelectedFiles()); + delete(folderView.getSelectedFiles(), fileBrowserView.getCurrentDirectory()); } - }); + }; + + // create delete file shortcut + mDelete.addActionListener(aDelete); + KeyStroke ksDelete = KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0); + map.put(ksDelete, "ksDelete"); + act.put("ksDelete", aDelete); + mDelete.setAccelerator(ksDelete); mNewFile = new JMenuItem(bundle.getString("new_file")); mNewFile.addActionListener(new ActionListener() { @@ -140,30 +159,26 @@ public void createMenu(JPopupMenu popup, FileInfo[] selectedFiles) { private void createMenuContext(JPopupMenu popup, FileInfo[] files) { popup.removeAll(); - int selectionCount = files.length; - createBuitinItems1(selectionCount, popup, files); - createBuitinItems2(selectionCount, popup); - } - private void createBuitinItems1(int selectionCount, JPopupMenu popup, FileInfo[] selectedFiles) { + //create Common Menu Items + popup.add(mDelete); + popup.add(mNewFolder); + popup.add(mNewFile); + // check only if folder is selected + popup.add(mAddToFav); + + int selectionCount = files.length; + //create Menu Items For Single Selection if (selectionCount == 1) { - if (selectedFiles[0].getType() == FileType.File || selectedFiles[0].getType() == FileType.FileLink) { + if (files[0].getType() == FileType.File || files[0].getType() == FileType.FileLink) { popup.add(mOpen); } - if (selectedFiles[0].getType() == FileType.Directory || selectedFiles[0].getType() == FileType.DirLink) { + if (files[0].getType() == FileType.Directory || files[0].getType() == FileType.DirLink) { popup.add(mOpenInNewTab); popup.add(mOpenInFileExplorer); } popup.add(mRename); } - - } - - private void createBuitinItems2(int selectionCount, JPopupMenu popup) { - popup.add(mNewFolder); - popup.add(mNewFile); - // check only if folder is selected - popup.add(mAddToFav); } private void open() { @@ -203,7 +218,13 @@ private void renameAsync(String oldName, String newName, String baseFolder) { }); } - private void delete(FileInfo[] selectedFiles) { + /** + * Delete files and refresh folder view. + * + * @param selectedFiles Files need to be deleted. + * @param baseFolder Used to refresh the folder view. + */ + private void delete(FileInfo[] selectedFiles, String baseFolder) { fileBrowser.getHolder().EXECUTOR.submit(() -> { fileBrowser.disableUi(); for (FileInfo f : selectedFiles) { @@ -213,6 +234,7 @@ private void delete(FileInfo[] selectedFiles) { e.printStackTrace(); } } + fileBrowserView.render(baseFolder); fileBrowser.enableUi(); }); }