/*
* This file is part of muCommander, http://www.mucommander.com
* Copyright (C) 2002-2016 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.ui.main.toolbar;
import java.util.WeakHashMap;
import com.mucommander.ui.action.impl.AddBookmarkAction;
import com.mucommander.ui.action.impl.NewTabAction;
import com.mucommander.ui.action.impl.ConnectToServerAction;
import com.mucommander.ui.action.impl.EditBookmarksAction;
import com.mucommander.ui.action.impl.EditCredentialsAction;
import com.mucommander.ui.action.impl.EmailAction;
import com.mucommander.ui.action.impl.GoBackAction;
import com.mucommander.ui.action.impl.GoForwardAction;
import com.mucommander.ui.action.impl.GoToHomeAction;
import com.mucommander.ui.action.impl.GoToParentAction;
import com.mucommander.ui.action.impl.MarkGroupAction;
import com.mucommander.ui.action.impl.NewWindowAction;
import com.mucommander.ui.action.impl.PackAction;
import com.mucommander.ui.action.impl.RevealInDesktopAction;
import com.mucommander.ui.action.impl.RunCommandAction;
import com.mucommander.ui.action.impl.SetSameFolderAction;
import com.mucommander.ui.action.impl.ShowFilePropertiesAction;
import com.mucommander.ui.action.impl.ShowPreferencesAction;
import com.mucommander.ui.action.impl.ShowServerConnectionsAction;
import com.mucommander.ui.action.impl.StopAction;
import com.mucommander.ui.action.impl.SwapFoldersAction;
import com.mucommander.ui.action.impl.UnmarkGroupAction;
import com.mucommander.ui.action.impl.UnpackAction;
/**
* This class is responsible to handle the attributes of ToolBars - their actions and separators.
* Every ToolBar should get its attributes from this class, and register in it for receiving attributes modifications.
*
* @author Arik Hadas
*/
public class ToolBarAttributes {
/** Command bar actions: Class instances or null to signify a separator */
private static String actionIds[];
private static boolean useDefaultActions = true;
/** Contains all registered toolbar-attributes listeners, stored as weak references */
private final static WeakHashMap<ToolBarAttributesListener, ?> listeners = new WeakHashMap<ToolBarAttributesListener, Object>();
/** Default command bar actions: Class instances or null to signify a separator */
private final static String[] DEFAULT_TOOLBAR_ACTIONS = new String[] {
NewWindowAction.Descriptor.ACTION_ID,
NewTabAction.Descriptor.ACTION_ID,
null,
GoBackAction.Descriptor.ACTION_ID,
GoForwardAction.Descriptor.ACTION_ID,
null,
GoToParentAction.Descriptor.ACTION_ID,
GoToHomeAction.Descriptor.ACTION_ID,
null,
StopAction.Descriptor.ACTION_ID,
null,
MarkGroupAction.Descriptor.ACTION_ID,
UnmarkGroupAction.Descriptor.ACTION_ID,
null,
SwapFoldersAction.Descriptor.ACTION_ID,
SetSameFolderAction.Descriptor.ACTION_ID,
null,
PackAction.Descriptor.ACTION_ID,
UnpackAction.Descriptor.ACTION_ID,
null,
AddBookmarkAction.Descriptor.ACTION_ID,
EditBookmarksAction.Descriptor.ACTION_ID,
EditCredentialsAction.Descriptor.ACTION_ID,
null,
ConnectToServerAction.Descriptor.ACTION_ID,
ShowServerConnectionsAction.Descriptor.ACTION_ID,
RunCommandAction.Descriptor.ACTION_ID,
EmailAction.Descriptor.ACTION_ID,
null,
RevealInDesktopAction.Descriptor.ACTION_ID,
ShowFilePropertiesAction.Descriptor.ACTION_ID,
null,
ShowPreferencesAction.Descriptor.ACTION_ID
};
/**
* Removes leading and trailing separators (<code>null</code> elements) from the given action Class array, and
* returns the trimmed action array.
*
* @param actions the action Class array to trim.
* @return the trimmed action Class array, free of leading and trailing separators.
*/
private static String[] trimActionsArray(String[] actions) {
int start = 0;
int end = actions.length;
while(start<end && actions[start]==null)
start++;
if(start==end)
return new String[]{};
while(end>start && actions[end-1]==null)
end--;
int newLen = end-start;
String newActions[] = new String[newLen];
System.arraycopy(actions, start, newActions, 0, newLen);
return newActions;
}
/**
* Sets the toolbar actions to the given action classes. <code>null</code> elements are used to insert a separator
* between buttons.
*
* @param actions the new toolbar actions classes
*/
public static void setActions(String[] actions) {
ToolBarAttributes.actionIds = trimActionsArray(actions);
useDefaultActions = false;
fireActionsChanged();
}
/**
* Check whether the default attributes are used.
*
* @return true if the default attributes are used, false otherwise.
*/
public static boolean areDefaultAttributes() {
if (useDefaultActions)
return true;
int nbActions = actionIds.length;
if (nbActions != DEFAULT_TOOLBAR_ACTIONS.length)
return false;
for (int i=0; i<nbActions; ++i)
if (!equals(actionIds[i], DEFAULT_TOOLBAR_ACTIONS[i]))
return false;
return true;
}
private static boolean equals(Object action1, Object action2) {
if (action1 == null)
return action2 == null;
return action1.equals(action2);
}
/**
* Returns the actions classes that constitute the toolbar. <code>null</code> elements are used to insert a separator
* between buttons.
*
* @return the actions classes that constitute the toolbar.
*/
public static String[] getActions() {
return useDefaultActions ? DEFAULT_TOOLBAR_ACTIONS : actionIds;
}
// - Listeners -------------------------------------------------------------
// -------------------------------------------------------------------------
public static void addToolBarAttributesListener(ToolBarAttributesListener listener) {
synchronized(listeners) {listeners.put(listener, null);}
}
public static void removeToolBarAttributesListener(ToolBarAttributesListener listener) {
synchronized(listeners) {listeners.remove(listener);}
}
public static void fireActionsChanged() {
synchronized(listeners) {
for(ToolBarAttributesListener listener : listeners.keySet())
listener.toolBarActionsChanged();
}
}
}