/*******************************************************************************
* Copyright (c) 2011 Arapiki Solutions Inc.
* 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:
* "Peter Smith <psmith@arapiki.com>" - initial API and
* implementation and/or initial documentation
*******************************************************************************/
package com.buildml.eclipse.actions;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.swt.graphics.Image;
import com.buildml.eclipse.Activator;
import com.buildml.eclipse.ISubEditor;
import com.buildml.eclipse.bobj.UIAction;
import com.buildml.model.IActionMgr;
import com.buildml.model.IBuildStore;
import com.buildml.model.IFileMgr;
import com.buildml.utils.print.PrintUtils;
import com.buildml.utils.string.ShellCommandUtils;
/**
* Label provider for the first column of the TreeViewer which is the main viewer for the
* ActionsEditor class.
*
* @author "Peter Smith <psmith@arapiki.com>"
*/
public class ActionsEditorLabelCol1Provider extends ColumnLabelProvider implements ILabelProvider {
/*=====================================================================================*
* FIELDS/TYPES
*=====================================================================================*/
/** The Action Manager object we'll use for querying information from the BuildStore */
private IActionMgr actionMgr;
/** The BuildStore that we're viewing. */
private IBuildStore buildStore;
/** The FileMgr associated with the BuildStore. */
private IFileMgr fileMgr;
/** Image representing the "action" icon. */
private Image actionImage;
/** The maximum number of characters wide that a tooletip should be */
private final int toolTipWrapWidth = 120;
/*=====================================================================================*
* CONSTRUCTORS
*=====================================================================================*/
/**
* Construct a new ActionsEditorLabelCol1Provider object, which provides text and image
* labels for the FilesEditor class.
* @param editor The editor that we're providing text/images for.
* @param actionMgr The FileMgr object we're graphically representing.
*/
public ActionsEditorLabelCol1Provider(ISubEditor editor, IActionMgr actionMgr) {
this.actionMgr = actionMgr;
this.buildStore = actionMgr.getBuildStore();
this.fileMgr = this.buildStore.getFileMgr();
/* all entries in the first column have an icon - precache it now */
ImageDescriptor descr = Activator.getImageDescriptor("images/action_icon.gif");
actionImage = descr.createImage();
actionMgr.getRootAction("root");
}
/*=====================================================================================*
* PUBLIC METHODS
*=====================================================================================*/
/**
* Get the image for the specified tree element.
* @param element The element for which an image is requested.
* @return An Image for the column.
*/
public Image getImage(Object element) {
return actionImage;
}
/*-------------------------------------------------------------------------------------*/
/**
* Get the column text for the specified tree element.
* @param element The tree element for which a label is requested.
* @return The text that will be displayed. This will be limited in size so that
* it appears on a single line of the tree.
*/
public String getText(Object element) {
if (element instanceof UIAction) {
UIAction uiAction = (UIAction)element;
int actionId = uiAction.getId();
String command = (String) actionMgr.getSlotValue(actionId, IActionMgr.COMMAND_SLOT_ID);
if (command != null) {
return " " + ShellCommandUtils.getCommandSummary(command, 200);
}
}
return " <invalid>";
}
/*-------------------------------------------------------------------------------------*/
/**
* Get the tool-tip text for the specified tree element.
* @param element The tree element for which a label is requested.
* @return The text that will be displayed. This includes the full text of the action
* command, which might be very long, and might wrap over multiple lines.
*/
@Override
public String getToolTipText(Object element) {
if (element instanceof UIAction) {
UIAction uiAction = (UIAction)element;
int actionId = uiAction.getId();
/* We'll accumulate the full text of the tooltip in a StringBuffer */
StringBuffer fullText = new StringBuffer();
/*
* First, output the command's current working directory, taking care to
* wrap the path if it's too long.
*/
int cmdDirId = (Integer) actionMgr.getSlotValue(actionId, IActionMgr.DIRECTORY_SLOT_ID);
String dirString = fileMgr.getPathName(cmdDirId);
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
PrintStream printStream = new PrintStream(outStream);
PrintUtils.indentAndWrap(printStream, dirString, 0, toolTipWrapWidth);
fullText.append("Directory:\n");
fullText.append(outStream.toString());
fullText.append("\n");
/* Compute the action's command string, taking care to wrap it where necessary. */
String cmdText = (String) actionMgr.getSlotValue(actionId, IActionMgr.COMMAND_SLOT_ID);
outStream.reset();
PrintUtils.indentAndWrap(printStream, cmdText, 0, toolTipWrapWidth);
fullText.append("Shell command:\n");
fullText.append(outStream.toString());
/* we're done - return the full string */
return fullText.toString();
}
return null;
}
/*-------------------------------------------------------------------------------------*/
}