/*
Copywrite 2016 Will Winder
This file is part of Universal Gcode Sender (UGS).
UGS 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.
UGS 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 UGS. If not, see <http://www.gnu.org/licenses/>.
*/
package com.willwinder.ugs.nbp.lib.services;
import java.io.IOException;
import javax.swing.Action;
import org.apache.commons.lang3.StringUtils;
import org.openide.filesystems.FileObject;
import org.openide.filesystems.FileUtil;
import org.openide.util.Exceptions;
import org.openide.util.lookup.ServiceProvider;
/**
*
* @author wwinder
*/
@ServiceProvider(service=ActionRegistrationService.class)
public class ActionRegistrationService {
private static final String SHADOW = "shadow";
/**
* Registers an action with the platform along with optional shortcuts and
* menu items.
*
* @param id The unique id of the action
* @param name Display name of the action.
* @param category Category in the Keymap tool.
* @param shortcut Default shortcut, use an empty string or null for none.
* @param menuPath Menu location starting with "Menu", like "Menu/Head/Hats"
* @param localMenu Localized menu location starting with "Menu", like "Menu/Cabeza/Sombreros"
* @param action an action object to attach to the action entry.
* @throws IOException
*/
public void registerAction(String id, String name, String category, String localCategory, String shortcut, String menuPath, String localMenu, Action action) throws IOException {
///////////////////////
// Add/Update Action //
///////////////////////
String originalFile = "Actions/" + category + "/" + id + ".instance";
FileObject root = FileUtil.getConfigRoot();
FileObject in = FileUtil.createFolder(root, "Actions/" + category);
//in.setAttribute("displayName", localCategory);
//in.setAttribute("SystemFileSystem.localizingBundle", localCategory + "lkhaglk");
//in.setAttribute("SystemFileSystem.localizingBundle", localCategory);
in.refresh();
FileObject obj = in.getFileObject(id, "instance");
if (obj == null) {
obj = in.createData(id, "instance");
}
action.putValue(Action.NAME, name);
obj.setAttribute("instanceCreate", action);
obj.setAttribute("instanceClass", action.getClass().getName());
/////////////////////
// Add/Update Menu //
/////////////////////
if (StringUtils.isNotEmpty(menuPath) && StringUtils.isNotEmpty(id)) {
in = createAndLocalizeFullMenu(menuPath, localMenu);
obj = in.getFileObject(id, SHADOW);
// Create if missing.
if (obj == null) {
obj = in.createData(id, SHADOW);
obj.setAttribute("originalFile", originalFile);
}
}
/////////////////////////
// Add/Update Shortcut //
/////////////////////////
if (shortcut != null && shortcut.length() > 0) {
in = FileUtil.createFolder(root, "Shortcuts");
obj = in.getFileObject(shortcut, SHADOW);
if (obj == null) {
obj = in.createData(shortcut, SHADOW);
obj.setAttribute("originalFile", originalFile);
}
}
}
/**
* Creates a folder path in the netbeans filesystem and sets a localized
* display name or each level of the path.
*/
public FileObject createAndLocalizeFullMenu(String path, String localizedPath) throws IOException {
FileObject root = FileUtil.getConfigRoot();
String[] paths = path.split("/");
String[] names = localizedPath.split("/");
if (paths.length != names.length) {
throw new IllegalArgumentException("Path length must equal localized path length: " + path + ", " + localizedPath);
}
if (! paths[0].equals(names[0])) {
throw new IllegalArgumentException(
"Path and localized path must be in the same top level directory. Found: "
+ paths[0] + " and " + names[0]);
}
String fullPath = paths[0];
FileObject in = FileUtil.createFolder(root, fullPath);
for (int i = 1; i < paths.length; i++) {
fullPath = fullPath + "/" + paths[i];
in = FileUtil.createFolder(root, fullPath);
in.setAttribute("displayName", names[i]);
in.refresh();
}
return in;
}
/**
* Set the display name of an action for a given category.
* @param category which category the key is in.
* @param key identifier for the action.
* @param name display name to set.
*/
public void overrideActionName(String category, String key, String name) {
try {
FileObject root = FileUtil.getConfigRoot();
FileObject in = FileUtil.createFolder(root, "Actions/" + category);
FileObject obj = in.getFileObject(key.replaceAll("\\.", "-"), "instance");
if (obj != null) {
obj.setAttribute("displayName", name);
}
} catch (IOException ex) {
Exceptions.printStackTrace(ex);
}
}
}