/** * Sets the currently active FileTable. This method is to be called by FolderPanel only. * * @param table the currently active FileTable */ void setActiveTable(FileTable table) { boolean activeTableChanged = activeTable != table; if (activeTableChanged) { this.activeTable = table; // Update window title to reflect new active table updateWindowTitle(); // Fire table change events on registered ActivePanelListener instances. fireActivePanelChanged(table.getFolderPanel()); } }
/** * Updates this window's title to show currently active folder and window number. This method is * called by this class and WindowManager. */ public void updateWindowTitle() { // Update window title String title = activeTable.getFolderPanel().getCurrentFolder().getAbsolutePath(); // Add the application name to window title on all OSs except MAC if (!OsFamily.MAC_OS_X.isCurrent()) title += " - muCommander"; java.util.List<MainFrame> mainFrames = WindowManager.getMainFrames(); if (mainFrames.size() > 1) title += " [" + (mainFrames.indexOf(this) + 1) + "]"; setTitle(title); // Use new Window decorations introduced in Mac OS X 10.5 (Leopard) if (OsFamily.MAC_OS_X.isCurrent() && OsVersion.MAC_OS_X_10_5.isCurrentOrHigher()) { // Displays the document icon in the window title bar, works only for local files AbstractFile currentFolder = activeTable.getFolderPanel().getCurrentFolder(); Object javaIoFile; if (currentFolder.getURL().getScheme().equals(FileProtocols.FILE)) { // If the current folder is an archive entry, display the archive file, this is the closest // we can get // with a java.io.File if (currentFolder.hasAncestor(AbstractArchiveEntryFile.class)) javaIoFile = currentFolder.getParentArchive().getUnderlyingFileObject(); else javaIoFile = currentFolder.getUnderlyingFileObject(); } else { // If the current folder is not a local file, use the special /Network directory which is // sort of // 'Network Neighborhood'. javaIoFile = new java.io.File("/Network"); } // Note that for some strange reason (looks like a bug), setting the property to null won't // remove // the previous icon. getRootPane().putClientProperty("Window.documentFile", javaIoFile); } }
/** Makes both folders the same, choosing the one which is currently active. */ public void setSameFolder() { (activeTable == leftTable ? rightTable : leftTable) .getFolderPanel() .tryChangeCurrentFolder(activeTable.getFolderPanel().getCurrentFolder()); }
/** * Returns the currently active panel. * * <p>The returned panel doesn't necessarily have focus, for example if the MainFrame is currently * not in the foreground. * * @return the currently active panel */ public FolderPanel getActivePanel() { return activeTable.getFolderPanel(); }
private void init(FolderPanel leftFolderPanel, FolderPanel rightFolderPanel) { // Set the window icon setWindowIcon(); if (OsFamily.MAC_OS_X.isCurrent()) { // Lion Fullscreen support FullScreenUtilities.setWindowCanFullScreen(this, true); } // Enable window resize setResizable(true); // The toolbar should have no inset, this is why it is left out of the insetsPane JPanel contentPane = new JPanel(new BorderLayout()); setContentPane(contentPane); // Initializes the folder panels and file tables. this.leftFolderPanel = leftFolderPanel; this.rightFolderPanel = rightFolderPanel; leftTable = leftFolderPanel.getFileTable(); rightTable = rightFolderPanel.getFileTable(); activeTable = leftTable; // Create the toolbar and corresponding panel wrapping it, and show it only if it hasn't been // disabled in the // preferences. // Note: Toolbar.setVisible() has to be called no matter if Toolbar is visible or not, in order // for it to be // properly initialized this.toolbar = new ToolBar(this); this.toolbarPanel = ToolbarMoreButton.wrapToolBar(toolbar); this.toolbarPanel.setVisible( MuConfigurations.getPreferences() .getVariable(MuPreference.TOOLBAR_VISIBLE, MuPreferences.DEFAULT_TOOLBAR_VISIBLE)); contentPane.add(toolbarPanel, BorderLayout.NORTH); JPanel insetsPane = new JPanel(new BorderLayout()) { // Add an x=3,y=3 gap around content pane @Override public Insets getInsets() { return new Insets(0, 3, 3, 3); // No top inset } }; // Below the toolbar there is the pane with insets contentPane.add(insetsPane, BorderLayout.CENTER); // Listen to location change events to display the current folder in the window's title leftFolderPanel.getLocationManager().addLocationListener(this); rightFolderPanel.getLocationManager().addLocationListener(this); // Create menu bar (has to be created after toolbar) MainMenuBar menuBar = new MainMenuBar(this); setJMenuBar(menuBar); // Create the split pane that separates folder panels and allows to resize how much space is // allocated to the // both of them. The split orientation is loaded from and saved to the preferences. // Note: the vertical/horizontal terminology used in muCommander is just the opposite of the one // used // in JSplitPane which is anti-natural / confusing. splitPane = new ProportionalSplitPane( this, MuConfigurations.getSnapshot() .getVariable( MuSnapshot.getSplitOrientation(0), MuSnapshot.DEFAULT_SPLIT_ORIENTATION) .equals(MuSnapshot.VERTICAL_SPLIT_ORIENTATION) ? JSplitPane.HORIZONTAL_SPLIT : JSplitPane.VERTICAL_SPLIT, false, MainFrame.this.leftFolderPanel, MainFrame.this.rightFolderPanel) { // We don't want any extra space around split pane @Override public Insets getInsets() { return new Insets(0, 0, 0, 0); } }; // Remove any default border the split pane has splitPane.setBorder(null); // Adds buttons that allow to collapse and expand the split pane in both directions splitPane.setOneTouchExpandable(true); // Disable all the JSPlitPane accessibility shortcuts that are registered by default, as some of // them // conflict with default mucommander action shortcuts (e.g. F6 and F8) splitPane.disableAccessibilityShortcuts(); // Split pane will be given any extra space insetsPane.add(splitPane, BorderLayout.CENTER); // Add a 2-pixel gap between the file table and status bar YBoxPanel southPanel = new YBoxPanel(); southPanel.addSpace(2); // Add status bar this.statusBar = new StatusBar(this); southPanel.add(statusBar); // Show command bar only if it hasn't been disabled in the preferences this.commandBar = new CommandBar(this); // Note: CommandBar.setVisible() has to be called no matter if CommandBar is visible or not, in // order for it to be properly initialized this.commandBar.setVisible( MuConfigurations.getPreferences() .getVariable( MuPreference.COMMAND_BAR_VISIBLE, MuPreferences.DEFAULT_COMMAND_BAR_VISIBLE)); southPanel.add(commandBar); insetsPane.add(southPanel, BorderLayout.SOUTH); // Perform CloseAction when the user asked the window to close setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); addWindowListener( new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { ActionManager.performAction(CloseWindowAction.Descriptor.ACTION_ID, MainFrame.this); } }); ActionKeymap.registerActions(this); // Fire table change events on registered ActivePanelListener instances, to notify of the intial // active table. fireActivePanelChanged(activeTable.getFolderPanel()); // Set the custom FocusTraversalPolicy that manages focus for both FolderPanel and their // subcomponents. setFocusTraversalPolicy(new CustomFocusTraversalPolicy()); }