diff options
Diffstat (limited to 'src/plugins/emulator/src/com/motorola/studio/android/emulator/ui/controls/RemoteCLIDisplay.java')
-rw-r--r-- | src/plugins/emulator/src/com/motorola/studio/android/emulator/ui/controls/RemoteCLIDisplay.java | 277 |
1 files changed, 277 insertions, 0 deletions
diff --git a/src/plugins/emulator/src/com/motorola/studio/android/emulator/ui/controls/RemoteCLIDisplay.java b/src/plugins/emulator/src/com/motorola/studio/android/emulator/ui/controls/RemoteCLIDisplay.java new file mode 100644 index 0000000..41e6083 --- /dev/null +++ b/src/plugins/emulator/src/com/motorola/studio/android/emulator/ui/controls/RemoteCLIDisplay.java @@ -0,0 +1,277 @@ +/* +* Copyright (C) 2012 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.motorola.studio.android.emulator.ui.controls; + +import java.util.Timer; +import java.util.TimerTask; + +import org.eclipse.sequoyah.vnc.vncviewer.graphics.swt.ISWTPainter; +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.graphics.GC; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.widgets.Canvas; +import org.eclipse.swt.widgets.Composite; + +import com.motorola.studio.android.emulator.core.model.IAndroidEmulatorInstance; + +/** + * DESCRIPTION: + * This class implements the composite that displays the contents of the + * CLI display, according to the provided painter object. + * + * RESPONSIBILITY: + * - Display the contents of the CLI display at screen + * + * COLABORATORS: + * None. + * + * USAGE: + * Add the composite to a view or other equivalent SWT object for it to + * display the result of the communication through VNC Protocol + * + */ +public class RemoteCLIDisplay extends Composite +{ + private Canvas canvas; + + private Image screen = null; + + private ISWTPainter painter; + + private Timer refreshTimer; + + private static long FIRST_REFRESH_DELAY_MS = 500; /* Time in milliseconds for the first update */ + + private static long REFRESH_DELAY_PERIOD_MS = 300; /* Time in milliseconds between 2 updates */ + + private boolean active = false; + + private double zoomFactor = 1; + + /** + * Creates a new RemoteCLIDisplay object. + * + * @param parent The parent composite + * @param cliPainter The object where to retrieve pixels from + */ + public RemoteCLIDisplay(Composite parent, ISWTPainter cliPainter) + { + super(parent, SWT.BACKGROUND); + this.painter = cliPainter; + this.setLayout(parent.getLayout()); + canvas = new Canvas(this, SWT.BACKGROUND); + } + + /** + * Starts the display refresh + */ + synchronized public void start() + { + addRefreshTimer(); + setRunning(true); + } + + /** + * Stops the display refresh + */ + synchronized public void stop() + { + setRunning(false); + refreshTimer.cancel(); + + if (!canvas.isDisposed()) + { + GC gc = new GC(canvas); + canvas.drawBackground(gc, 0, 0, canvas.getSize().x, canvas.getSize().y); + gc.dispose(); + } + } + + /** + * Adds a timer that schedules the screen's update in a fixed period. + */ + private void addRefreshTimer() + { + refreshTimer = new Timer(); + + final IAndroidEmulatorInstance instance = UIHelper.getInstanceAssociatedToControl(this); + + refreshTimer.scheduleAtFixedRate(new TimerTask() + { + @Override + public void run() + { + if (instance.getHasCli()) + { + // Request CLI Update here (when applicable) + + getDisplay().syncExec(new Runnable() + { + public void run() + { + updateScreen(); + } + }); + } + } + }, FIRST_REFRESH_DELAY_MS, REFRESH_DELAY_PERIOD_MS); + } + + /** + * Performs the screen update itself + */ + private void updateScreen() + { + if (screen != null) + { + screen.dispose(); + } + + if ((!getDisplay().isDisposed()) && (isDisplayActive())) + { + if ((painter.getImageData() != null) && (!canvas.isDisposed())) + { + screen = + new Image(canvas.getDisplay(), painter.getImageData().scaledTo( + (int) (painter.getImageData().width * zoomFactor), + (int) (painter.getImageData().height * zoomFactor))); + + GC gc = new GC(canvas); + gc.drawImage(screen, 0, 0); + gc.dispose(); + } + } + else + { + stop(); + } + } + + /** + * Returns true if the component is running. + */ + synchronized public boolean isDisplayActive() + { + return active; + } + + /** + * Gets the Canvas used to show the screen. + * + * @return the Canvas object. + */ + public Canvas getCanvas() + { + return canvas; + } + + /** + * Retrieves the image being drawn at display + * + * @return The image being drawn at display + */ + public Image getScreen() + { + return screen; + } + + /** + * Retrieves the display width + * + * @return The display width + */ + public int getScreenWidth() + { + return painter.getWidth(); + } + + /** + * Retrieves the display height + * + * @return The display height + */ + public int getScreenHeight() + { + return painter.getHeight(); + } + + /** + * Sets the current state of the display + * + * @param running true if the display is refreshing; false otherwise + */ + synchronized private void setRunning(boolean running) + { + this.active = running; + } + + /** + * @see org.eclipse.swt.widgets.Widget#dispose() + */ + @Override + public void dispose() + { + if (isDisplayActive()) + { + stop(); + } + + if (screen != null) + { + screen.dispose(); + } + + canvas.dispose(); + super.dispose(); + } + + /** + * @see org.eclipse.swt.widgets.Control#setBackground(Color) + */ + @Override + public void setBackground(Color color) + { + super.setBackground(color); + canvas.setBackground(color); + } + + /** + * Retrieves the current zoom factor being applied to the screen + * + * @return The current zoom factor + */ + public double getZoomFactor() + { + return zoomFactor; + } + + /** + * Sets a new zoom factor to the screen + * + * @param zoomFactor The zoom factor to set to the screen + */ + public void setZoomFactor(double zoomFactor) + { + this.zoomFactor = zoomFactor; + + IAndroidEmulatorInstance instance = UIHelper.getInstanceAssociatedToControl(this); + if (instance.getHasCli()) + { + updateScreen(); + } + } +} |