/*
* This file is part of muCommander, http://www.mucommander.com
* Copyright (C) 2002-2012 Maxence Bernard
*
* muCommander 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 3 of the License, or
* (at your option) any later version.
*
* muCommander 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, see <http://www.gnu.org/licenses/>.
*/
package com.mucommander.conf;
import java.awt.Dimension;
import java.awt.HeadlessException;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import javax.swing.JSplitPane;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.mucommander.commons.conf.Configuration;
import com.mucommander.commons.conf.ConfigurationException;
import com.mucommander.commons.file.FileURL;
import com.mucommander.core.GlobalLocationHistory;
import com.mucommander.ui.main.FolderPanel;
import com.mucommander.ui.main.MainFrame;
import com.mucommander.ui.main.WindowManager;
import com.mucommander.ui.main.table.Column;
import com.mucommander.ui.main.table.FileTable;
import com.mucommander.ui.main.tabs.FileTableTab;
import com.mucommander.ui.main.tabs.FileTableTabs;
import com.mucommander.ui.viewer.text.TextViewer;
/**
* muCommander specific wrapper for the <code>com.mucommander.conf</code> API which is used to save 'dynamic' configurations.
* 'dynamic' configurations refer to properties that represent the state of the last running instance which is not set from the
* preferences dialog. those properties are changed often.
*
* @author Arik Hadas
*/
public class MuSnapshot {
private static final Logger LOGGER = LoggerFactory.getLogger(MuSnapshot.class);
// - Last screen variables -----------------------------------------------
// -----------------------------------------------------------------------
/** Section describing last known screen properties. */
private static final String SCREEN_SECTION = "screen";
/** Last known screen width. */
public static final String SCREEN_WIDTH = SCREEN_SECTION + "." + "width";
/** Last known screen height. */
public static final String SCREEN_HEIGHT = SCREEN_SECTION + "." + "height";
// - Text file presenter (viewer/editor) variables -----------------------
// -----------------------------------------------------------------------
/** Section describing information about features used by the last file presenter instance. */
private static final String FILE_PRESENTER_SECTION = "file_presenter";
/** Section describing information specific to text file presenter. */
private static final String TEXT_FILE_PRESENTER_SECTION = FILE_PRESENTER_SECTION + "." + "text";
/** Whether or not to wrap long lines. */
public static final String TEXT_FILE_PRESENTER_LINE_WRAP = TEXT_FILE_PRESENTER_SECTION + "." + "line_wrap";
/** Default wrap value. */
public static final boolean DEFAULT_LINE_WRAP = false;
/** Whether or not to show line numbers. */
public static final String TEXT_FILE_PRESENTER_LINE_NUMBERS = TEXT_FILE_PRESENTER_SECTION + "." + "line_numbers";
/** Default line numbers value. */
public static final boolean DEFAULT_LINE_NUMBERS = true;
/** Last known file presenter full screen mode. */
public static final String TEXT_FILE_PRESENTER_FULL_SCREEN = TEXT_FILE_PRESENTER_SECTION + "." + "full_screen";
// - Location history ---- -----------------------------------------------
// -----------------------------------------------------------------------
/** Section containing the visited location in each folder panel. */
private static final String RECENT_LOCATIONS_SECTION = "recent_locations";
/** A location that was visited within the folder panel. */
public static final String LOCATION = "location";
/** Describes the number of visited locations saved for the folder panel */
private static final String LOCATIONS_COUNT = "count";
// - Last windows variables ----------------------------------------------
// -----------------------------------------------------------------------
/** Section describing known information about last muCommander windows. */
private static final String WINDOWS_SECTION = "windows";
/** Describes the number of windows that were open. */
public static final String WINDOWS_COUNT = WINDOWS_SECTION + '.' + "count";
/** Describes the index of the selected window. */
public static final String WINDOWS_SELECTION = WINDOWS_SECTION + '.' + "selection";
/** Subsection describing information which is specific to a particular window. */
private static final String WINDOW = "window";
// - Window variables ----------------------------------------------------
// -----------------------------------------------------------------------
/** Section describing known general information of muCommander window. */
private static final String WINDOW_PROPERTIES_SECTION = "window_properties";
/** Describes the window's horizontal position. */
private static final String X = "x";
/** Describes the window's vertical position. */
private static final String Y = "y";
/** Describes the window's width. */
private static final String WIDTH = "width";
/** Describes the window's height. */
private static final String HEIGHT = "height";
/** Describes the orientation used to split folder panels. */
private static final String SPLIT_ORIENTATION = "split_orientation";
/** Vertical split pane orientation. */
public static final String VERTICAL_SPLIT_ORIENTATION = "vertical";
/** Horizontal split pane orientation. */
public static final String HORIZONTAL_SPLIT_ORIENTATION = "horizontal";
/** Default split pane orientation. */
public static final String DEFAULT_SPLIT_ORIENTATION = VERTICAL_SPLIT_ORIENTATION;
// - Panels variables ----------------------------------------------------
// -----------------------------------------------------------------------
/** Section describing the dynamic information contained in the folder panels */
private static final String PANELS_SECTION = "panels";
/** Identifier of the left panel. */
private static final String LEFT = "left";
/** Identifier of the right panel. */
private static final String RIGHT = "right";
// - Tree variables ------------------------------------------------------
// -----------------------------------------------------------------------
/** Subsection describing the tree view CONFIGURATION. */
private static final String TREE_SECTION = "tree";
/** Describes whether the tree is visible */
private static final String TREE_VISIBLE = "visible";
/** Describes the tree's width */
private static final String TREE_WIDTH = "width";
// - File Table variables ------------------------------------------------
// -----------------------------------------------------------------------
/** Subsection describing the folders view CONFIGURATION. */
private static final String FILE_TABLE_SECTION = "file_table";
/** Describes an ascending sort order. */
public static final String SORT_ORDER_ASCENDING = "asc";
/** Describes a descending sort order. */
public static final String SORT_ORDER_DESCENDING = "desc";
/** Default 'sort order' column for the file table. */
public static final String DEFAULT_SORT_ORDER = SORT_ORDER_ASCENDING;
/** Name of the 'show column' variable. */
private static final String SHOW_COLUMN = "show";
/** Name of the 'column position' variable. */
private static final String COLUMN_POSITION = "position";
/** Name of the 'column width' variable. */
private static final String COLUMN_WIDTH = "width";
/** Default 'sort by' column for the file table. */
public static final String DEFAULT_SORT_BY = "name";
/** Identifier of the sort section in a file table's CONFIGURATION. */
private static final String SORT = "sort";
/** Identifier of the sort criteria in a file table's CONFIGURATION. */
private static final String SORT_BY = "by";
/** Identifier of the sort order in a file table's CONFIGURATION. */
private static final String SORT_ORDER = "order";
// - Tabs variables ------------------------------------------------------
// -----------------------------------------------------------------------
/** Subsection describing the tabs CONFIGURATION. */
private static final String TABS_SECTION = "tabs";
/** Describes the number of tabs presented in the panel */
private static final String TABS_COUNT = "count";
/** Subsection describing information which is specific to a particular tab */
private static final String TAB = "tab";
/** Describes the location presented in a tab */
private static final String TAB_LOCATION = "location";
/** Describes whether a tab is locked */
private static final String TAB_LOCKED = "locked";
/** The index of the selected tab within the folder panel */
private static final String SELECTED_TAB = "selection";
/** Describes the title that was set for the tab */
private static final String TAB_TITLE = "title";
/** Cache the screen's size. this value isn't computed during the shutdown process since it cause a deadlock then */
private Dimension screenSize;
public static String getSelectedWindow() {
return WINDOWS_SELECTION;
}
public static String getWindowsCount() {
return WINDOWS_COUNT;
}
/**
* Returns the section of the {@link com.mucommander.ui.main.MainFrame} at a given index
*
* @param index index of MainFrame
* @return the section of the MainFrame at the given index
*/
private static String getWindowSection(int index) {
return WINDOWS_SECTION + "." + WINDOW + "-" + index;
}
/**
* Returns the section of the properties for the {@link com.mucommander.ui.main.MainFrame} at a given index
*
* @param window index of MainFrame
* @return the section of the properties for the MainFrame at the given index
*/
private static String getWindowPropertiesSection(int window) {
return getWindowSection(window) + "." + WINDOW_PROPERTIES_SECTION;
}
/**
* Returns the horizontal position on the screen of the {@link com.mucommander.ui.main.MainFrame} at a given index
*
* @param window index of MainFrame
* @return the horizontal position of the MainFrame at the given index
*/
public static String getX(int window) {
return getWindowPropertiesSection(window) + "." + X;
}
/**
* Return the vertical position on the screen of the {@link com.mucommander.ui.main.MainFrame} at a given index
*
* @param window index of MainFrame
* @return the vertical position of the MainFrame at the given index
*/
public static String getY(int window) {
return getWindowPropertiesSection(window) + "." + Y;
}
/**
* Returns the width of the {@link com.mucommander.ui.main.MainFrame} at a given index
*
* @param window index of MainFrame
* @return the width of the MainFrame at the given index
*/
public static String getWidth(int window) {
return getWindowPropertiesSection(window) + "." + WIDTH;
}
/**
* Return the height of the {@link com.mucommander.ui.main.MainFrame} in a given index
*
* @param window index of MainFrame
* @return the height of the MainFrame at the given index
*/
public static String getHeight(int window) {
return getWindowPropertiesSection(window) + "." + HEIGHT;
}
/**
* Returns the orientation used to split folder panels in the {@link com.mucommander.ui.main.MainFrame} at a given index
*
* @param window index of MainFrame
* @return the orientation used to split folder panel in the MainFrame at the given index
*/
public static String getSplitOrientation(int window) {
return getWindowPropertiesSection(window) + "." + SPLIT_ORIENTATION;
}
/**
* Returns the CONFIGURATION section corresponding to the specified {@link com.mucommander.ui.main.FolderPanel},
* left or right one in the {@link com.mucommander.ui.main.MainFrame} at the given index.
*
* @param window index of MainFrame
* @param left true for the left FolderPanel, false for the right one
* @return the CONFIGURATION section corresponding to the specified FolderPanel
*/
private static String getFolderPanelSection(int window, boolean left) {
return getWindowSection(window) + "." + PANELS_SECTION + "." + (left?LEFT:RIGHT);
}
/**
* Returns the CONFIGURATION section corresponding to the specified {@link com.mucommander.ui.main.FoldersTreePanel},
* left or right one in the {@link com.mucommander.ui.main.MainFrame} at the given index.
*
* @param window index of MainFrame
* @param left true for the left FoldersTreePanel, false for the right one
* @return the CONFIGURATION section corresponding to the specified FoldersTreePanel
*/
private static String getTreeSection(int window, boolean left) {
return getFolderPanelSection(window, left) + "." + TREE_SECTION;
}
/**
* Returns the variable that controls the visibility of the tree view, in the left or right
* {@link com.mucommander.ui.main.FolderPanel} at the {@link com.mucommander.ui.main.MainFrame} in the given index.
*
* @param window index of MainFrame
* @param left true for the left FolderPanel, false for the right one
* @return the variable that controls the visibility of the tree view in the specified FolderPanel
*/
public static String getTreeVisiblityVariable(int window, boolean left) {
return getTreeSection(window, left) + "." + TREE_VISIBLE;
}
/**
* Returns the variable that holds the width of the tree view, in the left or right
* {@link com.mucommander.ui.main.FolderPanel} at the {@link com.mucommander.ui.main.MainFrame} in the given index.
*
* @param window index of MainFrame
* @param left true for the left FolderPanel, false for the right one
* @return the variable that holds the width of the tree view in the specified FolderPanel
*/
public static String getTreeWidthVariable(int window, boolean left) {
return getTreeSection(window, left) + "." + TREE_WIDTH;
}
/**
* Returns the CONFIGURATION section corresponding to the specified {@link com.mucommander.ui.main.table.FileTable},
* left or right one in the {@link com.mucommander.ui.main.MainFrame} at the given index.
*
* @param window index of MainFrame
* @param left true for the left FileTable, false for the right one
* @return the CONFIGURATION section corresponding to the specified FileTable
*/
private static String getFileTableSection(int window, boolean left) {
return getFolderPanelSection(window, left) + "." + FILE_TABLE_SECTION;
}
/**
* Returns the CONFIGURATION section that describes the sorting of the specified {@link com.mucommander.ui.main.FileTable},
* left or right one in the {@link com.mucommander.ui.main.MainFrame} at the given index.
*
* @param window index of MainFrame
* @param left true for the left FileTable, false for the right one
* @return the CONFIGURATION section that describes the sorting of the specified FileTable
*/
private static String getFileTableSortSection(int window, boolean left) {
return getFileTableSection(window, left) + "." + SORT;
}
/**
* Returns the variable that controls the sort criteria of the file table, in the left or right
* {@link com.mucommander.ui.main.FolderPanel} at the {@link com.mucommander.ui.main.MainFrame} in the given index.
*
* @param window index of MainFrame
* @param left true for the left FolderPanel, false for the right one
* @return the variable that controls the sort criteria of the file table in the specified FolderPanel
*/
public static String getFileTableSortByVariable(int window, boolean left) {
return getFileTableSortSection(window, left) + "." + SORT_BY;
}
/**
* Returns the variable that controls the sort order (ascending\descending) of the file table,
* in the left or right {@link com.mucommander.ui.main.FolderPanel} at the {@link com.mucommander.ui.main.MainFrame} in the given index.
*
* @param window index of MainFrame
* @param left true for the left FolderPanel, false for the right one
* @return the variable that controls the sort order of the file table in the specified FolderPanel
*/
public static String getFileTableSortOrderVariable(int window, boolean left) {
return getFileTableSortSection(window, left) + "." + SORT_ORDER;
}
/**
* Returns the CONFIGURATION section corresponding to the specified column in the left or right
* {@link com.mucommander.ui.main.table.FileTable} at the {@link com.mucommander.ui.main.MainFrame} in the given index.
*
* @param window index of MainFrame
* @param column column, see {@link com.mucommander.ui.main.table.Column} for possible values
* @param left true for the left FileTable, false for the right one
* @return the CONFIGURATION section corresponding to the specified FileTable
*/
private static String getColumnSection(int window, Column column, boolean left) {
return getFileTableSection(window, left) + "." + column.toString().toLowerCase();
}
/**
* Returns the variable that controls the visibility of the specified column, in the left or right
* {@link com.mucommander.ui.main.table.FileTable} at the {@link com.mucommander.ui.main.MainFrame} in the given index.
*
* @param window index of MainFrame
* @param column column, see {@link com.mucommander.ui.main.table.Column} for possible values
* @param left true for the left FileTable, false for the right one
* @return the variable that controls the visibility of the specified column
*/
public static String getShowColumnVariable(int window, Column column, boolean left) {
return getColumnSection(window, column, left) + "." + SHOW_COLUMN;
}
/**
* Returns the variable that holds the width of the specified column, in the left or right
* {@link com.mucommander.ui.main.table.FileTable} at the {@link com.mucommander.ui.main.MainFrame} in the given index.
*
* @param window index of MainFrame
* @param column column, see {@link com.mucommander.ui.main.table.Column} for possible values
* @param left true for the left FileTable, false for the right one
* @return the variable that holds the width of the specified column
*/
public static String getColumnWidthVariable(int window, Column column, boolean left) {
return getColumnSection(window, column, left) + "." + COLUMN_WIDTH;
}
/**
* Returns the variable that holds the position of the specified column, in the left or right
* {@link com.mucommander.ui.main.table.FileTable} at the {@link com.mucommander.ui.main.MainFrame} in the given index.
*
* @param window index of MainFrame
* @param column column, see {@link com.mucommander.ui.main.table.Column} for possible values
* @param left true for the left FileTable, false for the right one
* @return the variable that holds the position of the specified column
*/
public static String getColumnPositionVariable(int window, Column column, boolean left) {
return getColumnSection(window, column, left) + "." + COLUMN_POSITION;
}
/**
* Returns the CONFIGURATION section corresponding to the specified {@link com.mucommander.ui.main.tabs.FileTableTabs},
* left or right one in the {@link com.mucommander.ui.main.MainFrame} at the given index.
*
* @param window index of MainFrame
* @param left true for the left FileTableTabs, false for the right one
* @return the CONFIGURATION section corresponding to the specified FileTableTabs
*/
private static String getTabsSection(int window, boolean left) {
return getFolderPanelSection(window, left) + "." + TABS_SECTION;
}
/**
* Returns the variable that holds the number of presented tabs, in the left or right
* {@link com.mucommander.ui.main.FolderPanel} at the {@link com.mucommander.ui.main.MainFrame} in the given index.
*
* @param window index of MainFrame
* @param left true for the left FolderPanel, false for the right one
* @return the variable that holds the number of presented tabs in the specified FolderPanel
*/
public static String getTabsCountVariable(int window, boolean left) {
return getTabsSection(window, left) + "." + TABS_COUNT;
}
/**
* Returns the variable that holds the index of the selected tab, in the left or right
* {@link com.mucommander.ui.main.FolderPanel} at the {@link com.mucommander.ui.main.MainFrame} in the given index.
*
* @param window index of MainFrame
* @param left true for the left FileTableTab, false for the right one
* @return the variable that holds the index of the selected tab in the specified FolderPanel
*/
public static String getTabsSelectionVariable(int window, boolean left) {
return getTabsSection(window, left) + "." + SELECTED_TAB;
}
/**
* Returns the CONFIGURATION section corresponding to the specified {@link com.mucommander.ui.main.tabs.FileTableTab},
* left or right one in the {@link com.mucommander.ui.main.MainFrame} at the given index.
*
* @param window index of MainFrame
* @param left true for the left FileTableTab, false for the right one
* @return the CONFIGURATION section corresponding to the specified FileTableTab
*/
private static String getTabSection(int window, boolean left, int index) {
return getTabsSection(window, left) + "." + TAB + "-" + index;
}
/**
* Returns the variable that holds the location presented at the tab in the given index,
* in the left or right {@link com.mucommander.ui.main.FolderPanel} at the {@link com.mucommander.ui.main.MainFrame} in the given index.
*
* @param window index of MainFrame
* @param left true for the left FolderPanel, false for the right one
* @param index the index of tab at the FolderPanel's tabs
* @return the variable that holds the location presented at the tab in the given index in the specified FolderPanel
*/
public static String getTabLocationVariable(int window, boolean left, int index) {
return getTabSection(window, left, index) + "." + TAB_LOCATION;
}
/**
* Returns the variable that holds the title of the tab in the given index,
* in the left or right {@link com.mucommander.ui.main.FolderPanel} at the {@link com.mucommander.ui.main.MainFrame} in the given index.
*
* @param window index of MainFrame
* @param left true for the left FolderPanel, false for the right one
* @param index the index of tab at the FolderPanel's tabs
* @return the variable that holds the title of the tab in the given index in the specified FolderPanel
*/
public static String getTabTitleVariable(int window, boolean left, int index) {
return getTabSection(window, left, index) + "." + TAB_TITLE;
}
/**
* Returns the variable that indicates whether the tab in the given index,
* in the left or right {@link com.mucommander.ui.main.FolderPanel} at the {@link com.mucommander.ui.main.MainFrame} in the given index,
* is locked
*
* @param window index of MainFrame
* @param left true for the left FolderPanel, false for the right one
* @param index the index of tab at the FolderPanel's tabs
* @return the variable that indicates whether the tab in the given index in the specified FolderPanel is locked
*/
public static String getTabLockedVariable(int window, boolean left, int index) {
return getTabSection(window, left, index) + "." + TAB_LOCKED;
}
/**
* Returns the CONFIGURATION section corresponding to the specified {@link com.mucommander.core.GlobalLocationHistory}
* @return the CONFIGURATION section corresponding to the specified {@link com.mucommander.core.GlobalLocationHistory}
*/
private static String getRecentLocationsSection() {
return RECENT_LOCATIONS_SECTION;
}
/**
* Returns the variable that holds number of the saved visited locations
*
* @return the variable that holds the number of saved visited locations
*/
public static String getRecentLocationsCountVariable() {
return getRecentLocationsSection() + "." + LOCATIONS_COUNT;
}
/**
* Returns the variable that holds a location contained in the global locations history at the given index
*
* @param index the index of location in the visited location history
* @return the variable that holds a location contained in the global locations history at the given index
*/
public static String getRecentLocationVariable(int index) {
return getRecentLocationsSection() + "." + LOCATION + "-" + index;
}
private static final String ROOT_ELEMENT = "snapshot";
// - Instance fields -----------------------------------------------------
// -----------------------------------------------------------------------
private final Configuration configuration;
/**
* Prevents instantiation of this class from outside of this package.
*/
MuSnapshot() {
configuration = new Configuration(MuSnapshotFile.getSnapshotFile(), new VersionedXmlConfigurationReaderFactory(),
new VersionedXmlConfigurationWriterFactory(ROOT_ELEMENT));
try {
screenSize = Toolkit.getDefaultToolkit().getScreenSize();
}
catch(HeadlessException e) {
LOGGER.debug("Could not fetch screen size: " + e.getMessage());
}
}
/**
* TODO: change this method such that it will return a more specific API
*/
Configuration getConfiguration() {
return configuration;
}
// - Configuration reading / writing -------------------------------------
// -----------------------------------------------------------------------
/**
* Loads the muCommander CONFIGURATION.
* Here, we don't try to convert preferences that were changed between muCommander versions,
* as those are 'dynamic' preferences and as such can be ignored when the user installs new version.
*
* @throws IOException if an I/O error occurs.
* @throws ConfigurationException if a CONFIGURATION related error occurs.
*/
void read() throws IOException, ConfigurationException {
VersionedXmlConfigurationReader reader = new VersionedXmlConfigurationReader();
configuration.read(reader);
}
/**
* Saves the muCommander CONFIGURATION.
* @throws IOException if an I/O error occurs.
* @throws ConfigurationException if a CONFIGURATION related error occurs.
*/
void write() throws IOException, ConfigurationException {
//Clear the configuration before saving to drop preferences which are unused anymore
configuration.clear();
// Get opened main frames list
List<MainFrame> mainFrames = WindowManager.getMainFrames();
// Save windows count
int nbMainFrames = mainFrames.size();
configuration.setVariable(WINDOWS_COUNT, nbMainFrames);
// Save the index of the selected window
int indexOfSelectedWindow = WindowManager.getCurrentWindowIndex();
configuration.setVariable(WINDOWS_SELECTION, indexOfSelectedWindow);
// Save attributes for each window
for (int i=0; i<nbMainFrames; ++i)
setFrameAttributes(mainFrames.get(i), i);
if (screenSize != null) {
configuration.setVariable(MuSnapshot.SCREEN_WIDTH, screenSize.width);
configuration.setVariable(MuSnapshot.SCREEN_HEIGHT, screenSize.height);
}
setGlobalHistory();
setTextPresenterProperties();
configuration.write();
}
private void setTextPresenterProperties() {
configuration.setVariable(MuSnapshot.TEXT_FILE_PRESENTER_FULL_SCREEN, TextViewer.isFullScreen());
configuration.setVariable(MuSnapshot.TEXT_FILE_PRESENTER_LINE_WRAP, TextViewer.isLineWrap());
configuration.setVariable(MuSnapshot.TEXT_FILE_PRESENTER_LINE_NUMBERS, TextViewer.isLineNumbers());
}
private void setFrameAttributes(MainFrame mainFrame, int index) {
// Save window position, size and screen resolution
setWindowAttributes(index, mainFrame);
// Save left panel dynamic properties
setPanelAttributes(index, true, mainFrame.getLeftPanel());
// Save right panel dynamic properties
setPanelAttributes(index, false, mainFrame.getRightPanel());
}
private void setPanelAttributes(int index, boolean isLeft, FolderPanel panel) {
// Save tree folders preferences
setTreeAttributes(index, isLeft, panel);
setTableAttributes(index, isLeft, panel.getFileTable());
setTabsAttributes(index, isLeft, panel.getTabs());
}
private void setGlobalHistory() {
List<FileURL> locations = GlobalLocationHistory.Instance().getHistory();
configuration.setVariable(getRecentLocationsCountVariable(), locations.size());
Iterator<FileURL> iterator = locations.iterator();
for (int i=0; iterator.hasNext(); ++i)
configuration.setVariable(getRecentLocationVariable(i), iterator.next().toString());
}
private void setTabsAttributes(int index, boolean isLeft, FileTableTabs tabs) {
int tabsCounter = 0;
Iterator<FileTableTab> tabsIterator = tabs.iterator();
// Save tabs locations
while (tabsIterator.hasNext()) {
FileTableTab tab = tabsIterator.next();
configuration.setVariable(getTabLocationVariable(index, isLeft, tabsCounter), tab.getLocation().toString());
configuration.setVariable(getTabLockedVariable(index, isLeft, tabsCounter), tab.isLocked());
configuration.setVariable(getTabTitleVariable(index, isLeft, tabsCounter), tab.getTitle());
++tabsCounter;
}
if (tabsCounter > 0) {
// Save tabs count
configuration.setVariable(getTabsCountVariable(index, isLeft), tabsCounter);
// Save the index of the selected tab
configuration.setVariable(getTabsSelectionVariable(index, isLeft), tabs.getSelectedIndex());
}
}
private void setTableAttributes(int index, boolean isLeft, FileTable table) {
// Saves table sort order.
configuration.setVariable(MuSnapshot.getFileTableSortByVariable(index, isLeft), table.getSortInfo().getCriterion().toString().toLowerCase());
configuration.setVariable(MuSnapshot.getFileTableSortOrderVariable(index, isLeft), table.getSortInfo().getAscendingOrder() ? MuSnapshot.SORT_ORDER_ASCENDING : MuSnapshot.SORT_ORDER_DESCENDING);
// Loop on columns
for(Column c : Column.values()) {
if(c!=Column.NAME) { // Skip the special name column (always enabled, width automatically calculated)
MuConfigurations.getSnapshot().setVariable(
MuSnapshot.getShowColumnVariable(index, c, isLeft),
table.isColumnEnabled(c)
);
MuConfigurations.getSnapshot().setVariable(
MuSnapshot.getColumnWidthVariable(index, c, isLeft),
table.getColumnWidth(c)
);
}
MuConfigurations.getSnapshot().setVariable(
MuSnapshot.getColumnPositionVariable(index, c, isLeft),
table.getColumnPosition(c)
);
}
}
private void setTreeAttributes(int index, boolean isLeft, FolderPanel panel) {
configuration.setVariable(MuSnapshot.getTreeVisiblityVariable(index, isLeft), panel.isTreeVisible());
configuration.setVariable(MuSnapshot.getTreeWidthVariable(index, isLeft), panel.getTreeWidth());
}
private void setWindowAttributes(int index, MainFrame currentMainFrame) {
Rectangle bounds = currentMainFrame.getBounds();
configuration.setVariable(getX(index), (int)bounds.getX());
configuration.setVariable(getY(index), (int)bounds.getY());
configuration.setVariable(getWidth(index), (int)bounds.getWidth());
configuration.setVariable(getHeight(index), (int)bounds.getHeight());
// Save split pane orientation
// Note: the vertical/horizontal terminology used in muCommander is just the opposite of the one used
// in JSplitPane which is anti-natural / confusing
configuration.setVariable(getSplitOrientation(index), currentMainFrame.getSplitPane().getOrientation()==JSplitPane.HORIZONTAL_SPLIT?MuSnapshot.VERTICAL_SPLIT_ORIENTATION:MuSnapshot.HORIZONTAL_SPLIT_ORIENTATION);
}
}