/*
* Copyright 2015 Nokia Solutions and Networks
* Licensed under the Apache License, Version 2.0,
* see license.txt file for details.
*/
package org.robotframework.ide.eclipse.main.plugin.tableeditor;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IContributionItem;
import org.eclipse.jface.action.IStatusLineManager;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.part.MultiPageEditorActionBarContributor;
import org.eclipse.ui.texteditor.ITextEditor;
import org.eclipse.ui.texteditor.ITextEditorActionConstants;
import org.eclipse.ui.texteditor.StatusLineContributionItem;
import org.robotframework.ide.eclipse.main.plugin.RedImages;
import org.robotframework.ide.eclipse.main.plugin.tableeditor.source.SuiteSourceEditor;
public class RobotFormEditorActionBarContributor extends MultiPageEditorActionBarContributor {
public static final String DELIMITERS_INFO_ID = "ChangeDelimiters";
private final Map<StatusFieldDef, StatusLineContributionItem> statusFields = new LinkedHashMap<>();
public RobotFormEditorActionBarContributor() {
final StatusFieldDef linesDef = new StatusFieldDef(ITextEditorActionConstants.STATUS_CATEGORY_INPUT_POSITION,
ITextEditorActionConstants.GOTO_LINE);
final StatusLineContributionItem positionItem = new StatusLineContributionItem(linesDef.category);
positionItem.setText("1:1");
statusFields.put(linesDef, positionItem);
final StatusFieldDef delimiterDef = new StatusFieldDef(DELIMITERS_INFO_ID, "ConvertDelimiters");
final StatusLineContributionItem delimiterItem = new StatusLineContributionItem(delimiterDef.category);
delimiterItem.setText("LF");
statusFields.put(delimiterDef, delimiterItem);
}
@Override
public void init(final IActionBars bars) {
super.init(bars);
}
@Override
public void setActivePage(final IEditorPart activeEditor) {
updateStatusLineContributions(activeEditor);
if (activeEditor instanceof ITextEditor) {
final ITextEditor editor = (ITextEditor) activeEditor;
addTextActionIfNeeded(editor, ITextEditorActionConstants.BLOCK_SELECTION_MODE,
RedImages.getBlockSelectionModeImage());
addTextActionIfNeeded(editor, ITextEditorActionConstants.SHOW_WHITESPACE_CHARACTERS,
RedImages.getShowWhitespaceCharImage());
} else {
getActionBars().getToolBarManager().remove(ITextEditorActionConstants.BLOCK_SELECTION_MODE);
getActionBars().getToolBarManager().remove(ITextEditorActionConstants.SHOW_WHITESPACE_CHARACTERS);
}
getActionBars().getToolBarManager().update(true);
getActionBars().updateActionBars();
}
private void addTextActionIfNeeded(final ITextEditor editor, final String id, final ImageDescriptor image) {
final IContributionItem item = getActionBars().getToolBarManager().find(id);
if (item == null) {
final IAction action = getAction(editor, id);
action.setImageDescriptor(image);
getActionBars().getToolBarManager().add(action);
}
}
private void updateStatusLineContributions(final IEditorPart activeEditor) {
final boolean isSourceEditor = activeEditor instanceof SuiteSourceEditor;
if (isSourceEditor) {
for (final Entry<StatusFieldDef, StatusLineContributionItem> contribution : statusFields.entrySet()) {
contribution.getValue().setVisible(true);
contribution.getValue()
.setActionHandler(getAction((ITextEditor) activeEditor, contribution.getKey().actionId));
}
} else {
for (final Entry<StatusFieldDef, StatusLineContributionItem> contribution : statusFields.entrySet()) {
contribution.getValue().setVisible(false);
contribution.getValue().setActionHandler(null);
}
}
getActionBars().getStatusLineManager().update(true);
}
private final IAction getAction(final ITextEditor editor, final String actionId) {
return (editor == null || actionId == null ? null : editor.getAction(actionId));
}
@Override
public void contributeToStatusLine(final IStatusLineManager statusLineManager) {
for (final StatusLineContributionItem item : statusFields.values()) {
statusLineManager.add(item);
}
statusLineManager.update(true);
}
private static class StatusFieldDef {
private final String category;
private final String actionId;
private StatusFieldDef(final String category, final String actionId) {
this.category = category;
this.actionId = actionId;
}
}
}