/*
* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.hierarchyviewerlib.ui;
import com.android.ddmuilib.ImageLoader;
import com.android.hierarchyviewerlib.HierarchyViewerDirector;
import com.android.hierarchyviewerlib.device.ViewNode;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.events.ShellAdapter;
import org.eclipse.swt.events.ShellEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
public class CaptureDisplay {
private static Shell sShell;
private static Canvas sCanvas;
private static Image sImage;
private static ViewNode sViewNode;
private static Composite sButtonBar;
private static Button sOnWhite;
private static Button sOnBlack;
private static Button sShowExtras;
public static void show(Shell parentShell, ViewNode viewNode, Image image) {
if (sShell == null) {
createShell();
}
if (sShell.isVisible() && CaptureDisplay.sViewNode != null) {
CaptureDisplay.sViewNode.dereferenceImage();
}
CaptureDisplay.sImage = image;
CaptureDisplay.sViewNode = viewNode;
viewNode.referenceImage();
sShell.setText(viewNode.name);
boolean shellVisible = sShell.isVisible();
if (!shellVisible) {
sShell.setSize(0, 0);
}
Rectangle bounds =
sShell.computeTrim(0, 0, Math.max(sButtonBar.getBounds().width,
image.getBounds().width), sButtonBar.getBounds().height
+ image.getBounds().height + 5);
sShell.setSize(bounds.width, bounds.height);
if (!shellVisible) {
sShell.setLocation(parentShell.getBounds().x
+ (parentShell.getBounds().width - bounds.width) / 2, parentShell.getBounds().y
+ (parentShell.getBounds().height - bounds.height) / 2);
}
sShell.open();
if (shellVisible) {
sCanvas.redraw();
}
}
private static void createShell() {
sShell = new Shell(Display.getDefault(), SWT.CLOSE | SWT.TITLE);
GridLayout gridLayout = new GridLayout();
gridLayout.marginWidth = 0;
gridLayout.marginHeight = 0;
sShell.setLayout(gridLayout);
sButtonBar = new Composite(sShell, SWT.NONE);
RowLayout rowLayout = new RowLayout(SWT.HORIZONTAL);
rowLayout.pack = true;
rowLayout.center = true;
sButtonBar.setLayout(rowLayout);
Composite buttons = new Composite(sButtonBar, SWT.NONE);
buttons.setLayout(new FillLayout());
sOnWhite = new Button(buttons, SWT.TOGGLE);
sOnWhite.setText("On White");
sOnBlack = new Button(buttons, SWT.TOGGLE);
sOnBlack.setText("On Black");
sOnBlack.setSelection(true);
sOnWhite.addSelectionListener(sWhiteSelectionListener);
sOnBlack.addSelectionListener(sBlackSelectionListener);
sShowExtras = new Button(sButtonBar, SWT.CHECK);
sShowExtras.setText("Show Extras");
sShowExtras.addSelectionListener(sExtrasSelectionListener);
sCanvas = new Canvas(sShell, SWT.NONE);
sCanvas.setLayoutData(new GridData(GridData.FILL_BOTH));
sCanvas.addPaintListener(sPaintListener);
sShell.addShellListener(sShellListener);
ImageLoader imageLoader = ImageLoader.getLoader(HierarchyViewerDirector.class);
Image image = imageLoader.loadImage("display.png", Display.getDefault()); //$NON-NLS-1$
sShell.setImage(image);
}
private static PaintListener sPaintListener = new PaintListener() {
public void paintControl(PaintEvent e) {
if (sOnWhite.getSelection()) {
e.gc.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_WHITE));
} else {
e.gc.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_BLACK));
}
e.gc.fillRectangle(0, 0, sCanvas.getBounds().width, sCanvas.getBounds().height);
if (sImage != null) {
int width = sImage.getBounds().width;
int height = sImage.getBounds().height;
int x = (sCanvas.getBounds().width - width) / 2;
int y = (sCanvas.getBounds().height - height) / 2;
e.gc.drawImage(sImage, x, y);
if (sShowExtras.getSelection()) {
if ((sViewNode.paddingLeft | sViewNode.paddingRight | sViewNode.paddingTop | sViewNode.paddingBottom) != 0) {
e.gc.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_BLUE));
e.gc.drawRectangle(x + sViewNode.paddingLeft, y + sViewNode.paddingTop, width
- sViewNode.paddingLeft - sViewNode.paddingRight - 1, height
- sViewNode.paddingTop - sViewNode.paddingBottom - 1);
}
if (sViewNode.hasMargins) {
e.gc.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_GREEN));
e.gc.drawRectangle(x - sViewNode.marginLeft, y - sViewNode.marginTop, width
+ sViewNode.marginLeft + sViewNode.marginRight - 1, height
+ sViewNode.marginTop + sViewNode.marginBottom - 1);
}
if (sViewNode.baseline != -1) {
e.gc.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_RED));
e.gc.drawLine(x, y + sViewNode.baseline, x + width - 1, sViewNode.baseline);
}
}
}
}
};
private static ShellAdapter sShellListener = new ShellAdapter() {
@Override
public void shellClosed(ShellEvent e) {
e.doit = false;
sShell.setVisible(false);
if (sViewNode != null) {
sViewNode.dereferenceImage();
}
}
};
private static SelectionListener sWhiteSelectionListener = new SelectionListener() {
public void widgetDefaultSelected(SelectionEvent e) {
// pass
}
public void widgetSelected(SelectionEvent e) {
sOnWhite.setSelection(true);
sOnBlack.setSelection(false);
sCanvas.redraw();
}
};
private static SelectionListener sBlackSelectionListener = new SelectionListener() {
public void widgetDefaultSelected(SelectionEvent e) {
// pass
}
public void widgetSelected(SelectionEvent e) {
sOnBlack.setSelection(true);
sOnWhite.setSelection(false);
sCanvas.redraw();
}
};
private static SelectionListener sExtrasSelectionListener = new SelectionListener() {
public void widgetDefaultSelected(SelectionEvent e) {
// pass
}
public void widgetSelected(SelectionEvent e) {
sCanvas.redraw();
}
};
}