/*******************************************************************************
* Copyright (c) 2005, 2006 Eclipse Foundation
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Bjorn Freeman-Benson - initial implementation
* Ward Cunningham - initial implementation
* Channing Walton - bug 143456
*******************************************************************************/
package org.eclipse.eclipsemonkey.actions;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import java.util.SortedSet;
import java.util.TreeSet;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.eclipse.core.runtime.IPath;
import org.eclipse.eclipsemonkey.EclipseMonkeyPlugin;
import org.eclipse.eclipsemonkey.MenuRunMonkeyScript;
import org.eclipse.eclipsemonkey.RunMonkeyException;
import org.eclipse.eclipsemonkey.ScriptMetadata;
import org.eclipse.eclipsemonkey.StoredScript;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.ActionContributionItem;
import org.eclipse.jface.action.CoolBarManager;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IContributionItem;
import org.eclipse.jface.action.ICoolBarManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.ToolBarManager;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.IWorkbenchWindowActionDelegate;
import org.eclipse.ui.internal.WorkbenchWindow;
/**
*
*/
public class RecreateMonkeyCoolbarAction implements IWorkbenchWindowActionDelegate {
public static Hashtable toolbars = new Hashtable();
/**
*
*/
public RecreateMonkeyCoolbarAction() {
}
/**
* @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
*/
public void run(IAction action) {
clearTheToolbar();
Collection metaDatas = getAllMetadatas();
List toolbarData = createToolbarFromMetadatas(metaDatas);
createTheToolbar(toolbarData, action);
}
private Collection getAllMetadatas() {
ArrayList result = new ArrayList();
Iterator iter = EclipseMonkeyPlugin.getDefault().getScriptStore()
.values().iterator();
for (; iter.hasNext();) {
StoredScript element = (StoredScript) iter.next();
result.add(element.metadata);
}
return result;
}
private void clearTheToolbar() {
CoolBarManager manager = ((WorkbenchWindow) window).getCoolBarManager();
if(manager != null)
{
for (Iterator iter = toolbars.values().iterator(); iter.hasNext();) {
IToolBarManager element = (IToolBarManager) iter.next();
IContributionItem[] items = element.getItems();
for (int i = 0; i < items.length; i++) {
element.remove(items[i]);
}
}
}
}
private Pattern subtoolbar_pattern = Pattern.compile("^(.+?)>(.*)$"); //$NON-NLS-1$
class MonkeyToolbarStruct {
String key;
IToolBarManager toolbar;
MonkeyToolbarStruct subtoolbar;
}
private void createTheToolbar(List toolbarData, final IAction action) {
CoolBarManager outerManager = ((WorkbenchWindow) window).getCoolBarManager();
MonkeyToolbarStruct current = new MonkeyToolbarStruct();
current.key = ""; //$NON-NLS-1$
current.subtoolbar = new MonkeyToolbarStruct();
SortedSet sorted = new TreeSet();
sorted.addAll(toolbarData);
Iterator iter = sorted.iterator();
while (iter.hasNext()) {
Association element = (Association) iter.next();
final IPath script_file_to_run = element.path;
addNestedToolbarAction(current, outerManager, element.key, script_file_to_run,
element.imagePath);
}
outerManager.update(true);
}
private void addNestedToolbarAction(MonkeyToolbarStruct current, ICoolBarManager manager,
String toolbar_string, final IPath script_file_to_run,
String imagePath) {
if (toolbar_string == null)
return;
Matcher match = subtoolbar_pattern.matcher(toolbar_string);
if (match.find()) {
String primary_key = match.group(1).trim();
String secondary_key = match.group(2).trim();
IToolBarManager tManager = (IToolBarManager)toolbars.get(primary_key);
if(tManager == null)
{
tManager = new ToolBarManager();
toolbars.put(primary_key, tManager);
manager.add(tManager);
}
ActionContributionItem item = new ActionContributionItem(toolbarAction(secondary_key, script_file_to_run, imagePath));
tManager.add(item);
}
}
private Action toolbarAction(String key, final IPath path, String imagePath) {
final MenuRunMonkeyScript runner = new MenuRunMonkeyScript(path,
window);
Action action = new Action(key) {
public void run() {
try {
runner.run("main", new Object[] {}); //$NON-NLS-1$
} catch (RunMonkeyException x) {
MessageDialog.openError(window.getShell(), x.exceptionName,
x.errorMessage + "\n" + x.fileName + x.optionalLineNumber()); //$NON-NLS-1$
}
}
};
action.setId(key);
if(imagePath != null)
{
IPath newPath = path.removeLastSegments(1).append(imagePath);
ImageDescriptor id = ImageDescriptor.createFromFile(null, newPath.toFile().getAbsolutePath());
if(id != null)
{
action.setImageDescriptor(id);
}
}
return action;
}
private List createToolbarFromMetadatas(Collection metaDatas) {
List toolbarData = new ArrayList();
for (Iterator iter = metaDatas.iterator(); iter.hasNext();) {
ScriptMetadata data = (ScriptMetadata) iter.next();
if (data.getToolbarName() != null)
toolbarData.add(new Association(data.getToolbarName(),
data.getPath(), data.getAccelerator(), data.getImage()));
}
return toolbarData;
}
private static int id = 0;
class Association implements Comparable {
String accelerator;
String key;
IPath path;
int uniqueId;
String imagePath;
Association(String k, IPath p, String accelerator, String imagePath) {
this.key = k;
this.path = p;
this.accelerator = accelerator;
this.uniqueId = id++;
this.imagePath = imagePath;
}
/**
* @see java.lang.Comparable#compareTo(java.lang.Object)
*/
public int compareTo(Object arg0) {
Association b = (Association) arg0;
int value = key.compareTo(b.key);
if (value == 0) {
if (uniqueId < b.uniqueId)
return -1;
else
return 1;
} else
return value;
}
}
/**
* @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
*/
public void selectionChanged(IAction action, ISelection selection) {
}
/**
* @see org.eclipse.ui.IWorkbenchWindowActionDelegate#dispose()
*/
public void dispose() {
}
/**
* @see org.eclipse.ui.IWorkbenchWindowActionDelegate#init(org.eclipse.ui.IWorkbenchWindow)
*/
public void init(IWorkbenchWindow window) {
this.window = window;
}
private IWorkbenchWindow window;
}