/*
* 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.IUIHelpConstants;
import com.motorola.studio.android.emulator.ui.controls.maindisplay.MainDisplayComposite;
import com.motorola.studio.android.emulator.ui.handlers.IHandlerConstants;
/**
* This class represents the view that shows the Main Display (without skin)
* of the emulator to the end user.
*/
public class MainDisplayView extends AbstractAndroidView
{
/**
* The Android Emulator Main Display View view ID
*/
public static final String EMULATOR_MAIN_DISPLAY_VIEW_ID =
EmulatorPlugin.PLUGIN_ID + ".mainDisplayView";
/**
* @see com.motorola.studio.android.emulator.ui.view.AbstractAndroidView#getViewId()
*/
@Override
public String getViewId()
{
return EMULATOR_MAIN_DISPLAY_VIEW_ID;
}
/**
* @see com.motorola.studio.android.emulator.ui.view.AbstractAndroidView#getHelpId()
*/
@Override
protected String getHelpId()
{
return IUIHelpConstants.EMULATOR_VIEW_MAIN_DISPLAY_HELP;
}
/**
* Creates the scrolled composite, the detached composite and the main
* 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)
{
try
{
tabData.loadSkin(instance);
IAndroidSkin skin = tabData.getSkin();
ProtocolHandle handle = instance.getProtocolHandle();
VNCProtocolData data = VNCProtocolRegistry.getInstance().get(handle);
if (data != null)
{
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());
final SWTRemoteDisplay 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
{
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);
}
}
}
catch (SkinException e)
{
error("The skin associated to this instance (" + instance.getName()
+ ") is not installed or is corrupted.");
EclipseUtils.showErrorDialog(e);
try
{
instance.stop(true);
}
catch (InstanceStopException e1)
{
error("Error while running service for stopping virtual machine");
EclipseUtils.showErrorDialog(EmulatorNLS.GEN_Error,
EmulatorNLS.EXC_General_CannotRunStopService);
}
}
}
/**
* Creates the main display 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 image
*/
private SWTRemoteDisplay createMainDisplay(Composite parent, IAndroidSkin skin,
IAndroidEmulatorInstance instance, ISWTPainter painter)
{
// gets and reads the configuration files of the VNC session
IPropertiesFileHandler handler;
String configFile;
handler = IAndroidSkin.DEFAULT_PROPS_HANDLER;
configFile = IAndroidSkin.DEFAULT_VNC_CONFIG_FILE;
VNCConfiguration config = new VNCConfiguration(configFile, handler);
SWTRemoteDisplay 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_ZOOM_COMMAND, null);
service.refreshElements(IHandlerConstants.CHANGE_EMULATOR_ORIENTATION_COMMAND, null);
}
}