package eu.jucy.gui.itemhandler;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import logger.LoggerFactory;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.jface.action.IContributionItem;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.ImageLoader;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Monitor;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.CompoundContributionItem;
import org.eclipse.ui.handlers.HandlerUtil;
import org.eclipse.ui.menus.CommandContributionItem;
import org.eclipse.ui.menus.CommandContributionItemParameter;
import eu.jucy.gui.GuiHelpers;
import eu.jucy.gui.Lang;
import eu.jucy.gui.texteditor.UCTextEditor;
import uc.PI;
/**
* Creates and sends a screenshot via PM or mainchat to another user..
*
* @author Quicksilver
*
*/
public class SendScreenHandler extends AbstractHandler {
private static final Logger logger = LoggerFactory.make(Level.DEBUG);
public static final String COMMAND_ID ="eu.jucy.gui.itemhandler.send_screen";
public static final String SEND_BOUNDS = "SEND_BOUNDS";
@Override
public Object execute(ExecutionEvent event) throws ExecutionException {
Display display = Display.getCurrent();
GC gc = new GC(display);
String bound = event.getParameter(SEND_BOUNDS);
if (bound == null) {
bound = "";
}
Rectangle rect = GuiHelpers.fromString(bound);
logger.debug("rect: "+rect+" "+bound);
if (rect == null) {
rect = display.getBounds();
}
Image image = new Image(display, rect);
gc.copyArea(image, rect.x, rect.y);
gc.dispose();
ImageLoader loader = new ImageLoader();
loader.data = new ImageData[] {image.getImageData()};
int i = 0;
File screenshot;
while ((screenshot = new File(PI.getTempPath(),"Screenshot."+i+".png")).isFile() ) {
i++;
}
logger.debug("Storing file: "+screenshot);
loader.save(screenshot.toString(), SWT.IMAGE_PNG);
image.dispose();
screenshot.deleteOnExit();
UCTextEditor textEdit = (UCTextEditor) HandlerUtil.getActiveEditorChecked(event);
textEdit.dropFile(screenshot, false);
return null;
}
public static class ScreenShotContributions extends CompoundContributionItem {
@Override
public IContributionItem[] getContributionItems() {
List<IContributionItem> items = new ArrayList<IContributionItem>();
IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
Display display = Display.getCurrent();
Monitor[] monitors = display.getMonitors();
if (monitors.length > 1) {
CommandContributionItemParameter cpAll =
new CommandContributionItemParameter(window, null,
COMMAND_ID,SWT.PUSH);
cpAll.label = Lang.All_cpscreen;
cpAll.icon = fromDisplay(Display.getCurrent().getBounds());
items.add(new CommandContributionItem(cpAll));
items.add(new Separator());
}
int i = 0;
for (Monitor m : monitors) {
CommandContributionItemParameter ccip =
new CommandContributionItemParameter(window, null,
COMMAND_ID,SWT.PUSH);
i++;
ccip.label = String.format(Lang.ScreenXYZ,i,m.getBounds().width,m.getBounds().height); ccip.parameters = Collections.singletonMap(
SEND_BOUNDS,m.getBounds().toString());
ccip.icon = fromDisplay(m.getBounds());
items.add(new CommandContributionItem(ccip));
items.add(new Separator());
}
return items.toArray(new IContributionItem[]{});
}
}
private static ImageDescriptor fromDisplay(Rectangle rect) {
Display display = Display.getCurrent();
GC gc = new GC(display);
Image image = new Image(display, rect);
gc.copyArea(image, rect.x, rect.y);
int x = 128;
int y =(int) (((double)x/rect.width) *rect.height);
Image small = new Image(display, x,y);
gc.dispose();
gc = new GC(small);
gc.setInterpolation(SWT.HIGH);
gc.drawImage(image, 0, 0, rect.width, rect.height, 0, 0, x, y);
gc.dispose();
image.dispose();
ImageDescriptor id = ImageDescriptor.createFromImageData(small.getImageData());
small.dispose();
return id;
}
}