/* * 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.view; import static com.motorola.studio.android.common.log.StudioLogger.error; import org.eclipse.sequoyah.vnc.protocol.lib.ProtocolHandle; import org.eclipse.sequoyah.vnc.vncviewer.config.IPropertiesFileHandler; import org.eclipse.sequoyah.vnc.vncviewer.config.VNCConfiguration; import org.eclipse.sequoyah.vnc.vncviewer.graphics.swt.ISWTPainter; import org.eclipse.sequoyah.vnc.vncviewer.graphics.swt.SWTRemoteDisplay; import org.eclipse.sequoyah.vnc.vncviewer.graphics.swt.img.SWTRemoteDisplayImg; import org.eclipse.sequoyah.vnc.vncviewer.network.VNCProtocolData; import org.eclipse.sequoyah.vnc.vncviewer.registry.VNCProtocolRegistry; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.ScrolledComposite; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.TabItem; import org.eclipse.ui.IViewSite; import org.eclipse.ui.commands.ICommandService; import com.motorola.studio.android.common.utilities.EclipseUtils; import com.motorola.studio.android.emulator.EmulatorPlugin; import com.motorola.studio.android.emulator.core.exception.InstanceStopException; import com.motorola.studio.android.emulator.core.exception.SkinException; import com.motorola.studio.android.emulator.core.model.IAndroidEmulatorInstance; import com.motorola.studio.android.emulator.core.skin.IAndroidSkin; import com.motorola.studio.android.emulator.core.skin.ISkinKeyXmlTags; import com.motorola.studio.android.emulator.i18n.EmulatorNLS; import com.motorola.studio.android.emulator.ui.controls.IAndroidComposite; import com.motorola.studio.android.emulator.ui.controls.maindisplay.MainDisplayComposite; import com.motorola.studio.android.emulator.ui.controls.nativewindow.NativeWindowComposite; import com.motorola.studio.android.emulator.ui.controls.skin.SkinComposite; import com.motorola.studio.android.emulator.ui.handlers.IHandlerConstants; import com.motorola.studio.android.nativeos.IDevicePropertiesOSConstants; import com.motorola.studio.android.nativeos.NativeUIUtils; /** * DESCRIPTION: This class represents the Android Emulator view * * RESPONSIBILITY: - Show the skin to the end user * * COLABORATORS: None. * * USAGE: All the public interface is extended from * <code>AbstractAndroidView</code>. */ public class AndroidView extends AbstractAndroidView { /** * The Android Emulator view ID */ public static final String ANDROID_VIEW_ID = EmulatorPlugin.PLUGIN_ID + ".androidView"; /** * @see com.motorola.studio.android.emulator.ui.view.AbstractAndroidView#getViewId() */ @Override protected String getViewId() { return ANDROID_VIEW_ID; } /** * Creates the skin composite, main display and CLI display related to * emulator. * * @param tab * the tab item that will hold the graphical elements that * represents the emulator * @param instance * the emulator instance * @param emulatorData * the object to be defined with the elements created. */ @Override protected void createWidgets(TabItem tab, final IAndroidEmulatorInstance instance, final AndroidViewData tabData) throws SkinException { tabData.loadSkin(instance); IAndroidSkin skin = tabData.getSkin(); ProtocolHandle handle = instance.getProtocolHandle(); VNCProtocolData data = VNCProtocolRegistry.getInstance().get(handle); final SWTRemoteDisplay mainDisplay; Composite parentComposite; if (instance.getProperties().getProperty(IDevicePropertiesOSConstants.useVnc, NativeUIUtils.getDefaultUseVnc()).toString().equals("true")) { if (data != null) { if (instance.getProperties().getProperty("Command_Line").contains("-no-skin")) { int baseWidth = skin.getSkinBean(instance.getCurrentLayout()).getSkinPropertyValue( ISkinKeyXmlTags.SKIN_INTERNAL_VIEW_WIDTH); int baseHeight = skin.getSkinBean(instance.getCurrentLayout()).getSkinPropertyValue( ISkinKeyXmlTags.SKIN_INTERNAL_VIEW_HEIGHT); ScrolledComposite scrolledComposite = new ScrolledComposite(tab.getParent(), SWT.H_SCROLL | SWT.V_SCROLL | SWT.BACKGROUND); final MainDisplayComposite composite = new MainDisplayComposite(scrolledComposite, SWT.BACKGROUND, baseWidth, baseHeight, instance); composite.setLayout(new FillLayout()); mainDisplay = createMainDisplay(composite, skin, instance, (ISWTPainter) data .getVncPainter()); composite.setSize(baseWidth, baseHeight); scrolledComposite.setContent(composite); tab.setControl(scrolledComposite); scrolledComposite.addDisposeListener(new DisposeListener() { public void widgetDisposed(DisposeEvent e) { composite.dispose(); } }); tabData.setCliDisplay(null); tabData.setComposite(composite); tabData.setMainDisplay(mainDisplay); } else { parentComposite = createSkinComposite(tab.getParent(), skin, instance); mainDisplay = createMainDisplay(parentComposite, skin, instance, (ISWTPainter) data .getVncPainter()); tabData.setComposite((IAndroidComposite) parentComposite); tabData.setMainDisplay(mainDisplay); tab.setControl(parentComposite); } } else { error("The protocol object set in the device instance is not supported. Stopping the emulator instance..."); EclipseUtils.showErrorDialog(EmulatorNLS.GEN_Error, EmulatorNLS.ERR_AndroidView_ProtocolImplementerNotSupported); try { instance.stop(true); } catch (InstanceStopException e) { error("Error while running service for stopping virtual machine"); EclipseUtils.showErrorDialog(EmulatorNLS.GEN_Error, EmulatorNLS.EXC_General_CannotRunStopService); } } } else { parentComposite = createNativeWindowComposite(tab.getParent(), skin, instance); tabData.setComposite((IAndroidComposite) parentComposite); tab.setControl(parentComposite); } } /** * Creates the skin composite used by this instance * * @param parent * The parent composite where to place the widgets * @param skin * The object containing skin information used to draw the * widgets */ private SkinComposite createSkinComposite(Composite parent, IAndroidSkin skin, IAndroidEmulatorInstance instance) { SkinComposite skinComposite = new SkinComposite(parent, skin, instance); skinComposite.setBackground(new Color(skinComposite.getDisplay(), 255, 255, 255)); return skinComposite; } private NativeWindowComposite createNativeWindowComposite(Composite parent, IAndroidSkin skin, IAndroidEmulatorInstance instance) { NativeWindowComposite nativeWindowComposite = new NativeWindowComposite(parent, skin, instance); // nativeWindowComposite.setBackground(new Color(nativeWindowComposite.getDisplay(), 255, 255, // 255)); return nativeWindowComposite; } /** * Creates the main display object used by this instance. * * @param parent * The parent composite where to place the widgets * @param skin * The object containing skin information used to draw the * widgets * @param instance * The emulator instance * @param painter * the painter used to draw the images */ private SWTRemoteDisplay createMainDisplay(Composite parent, IAndroidSkin skin, IAndroidEmulatorInstance instance, ISWTPainter painter) { // gets and reads the configuration files of the VNC session IPropertiesFileHandler handler = IAndroidSkin.DEFAULT_PROPS_HANDLER; String configFile = IAndroidSkin.DEFAULT_VNC_CONFIG_FILE; VNCConfiguration config = new VNCConfiguration(configFile, handler); final SWTRemoteDisplay mainDisplay; mainDisplay = new SWTRemoteDisplayImg(parent, config.getConfigurationProperties(), handler, painter); mainDisplay.setBackground(new Color(mainDisplay.getDisplay(), 0, 0, 0)); mainDisplay.setLayout(new FillLayout()); return mainDisplay; } /** * Forces the refreshing of the menu elements. */ @Override protected void refreshMenuElements() { IViewSite viewSite = getViewSite(); // Update the radio button selection in the zoom menu ICommandService service = (ICommandService) viewSite.getService(ICommandService.class); service.refreshElements(IHandlerConstants.CHANGE_EMULATOR_ORIENTATION_COMMAND, null); service.refreshElements(IHandlerConstants.CHANGE_EMULATOR_ZOOM_COMMAND, null); } }