/*
* 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.device.ui;
import java.util.Properties;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.sequoyah.device.framework.events.InstanceEvent;
import org.eclipse.sequoyah.device.framework.events.InstanceEvent.InstanceEventType;
import org.eclipse.sequoyah.device.framework.events.InstanceEventManager;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.ui.IWorkbenchPropertyPage;
import org.eclipse.ui.dialogs.PropertyPage;
import com.motorola.studio.android.common.log.StudioLogger;
import com.motorola.studio.android.emulator.core.exception.SkinException;
import com.motorola.studio.android.emulator.core.skin.IAndroidSkin;
import com.motorola.studio.android.emulator.core.skin.SkinFramework;
import com.motorola.studio.android.emulator.device.IDevicePropertiesConstants;
import com.motorola.studio.android.emulator.device.instance.AndroidDeviceInstance;
import com.motorola.studio.android.emulator.device.instance.options.StartupOptionsMgt;
import com.motorola.studio.android.emulator.device.ui.AbstractPropertiesComposite.PropertyCompositeChangeEvent;
import com.motorola.studio.android.emulator.device.ui.AbstractPropertiesComposite.PropertyCompositeChangeListener;
import com.motorola.studio.android.nativeos.NativeUIUtils;
/**
* DESCRIPTION:
* <br>
* This class implements the Startup Options Property Page for Android Emulator Device Instances.
* <br>
* It shows the Startup Options for the Android Emulator Device Instance on the UI so that the user
* is able to edit it.
* <br>
* RESPONSIBILITY:
* <br>
* - Allow viewing and editing Startup Options of an Android Emulator Device Instance
* <br>
* COLABORATORS:
* <br>
* PropertyPage: extends this class
* <br>
* StartupOptionsComposite: uses this composite for exhibiting startup options on the UI
* <br>
* USAGE:
* <br>
* This class should be defined by the plugin.xml file as a regular Eclipse Property Page.
* It should be enabled for AndroidEmulatorInstance objects.
*
*/
public class AndroidPropertiesStartupOptionsPage extends PropertyPage implements
IWorkbenchPropertyPage, IDevicePropertiesConstants
{
// the Android Emulator Device Instance to which this Property Page applies
private AndroidDeviceInstance emuInstance;
private StartupOptionsComposite startupOptionsComposite;
// whether this property page will need its default message to be reset
// this happens in case the initial state of the property page when it is
// opened is an erroneous state (any of the properties contain invalid value)
private boolean defaultMessageNeedsReset = false;
// the default message defined by Eclipse implementation for reset purposes
private final String defaultMessage = getMessage();
// handle changes
private final PropertyCompositeChangeListener compositeChangeListener =
new PropertyCompositeChangeListener()
{
public void compositeChanged(PropertyCompositeChangeEvent e)
{
String errorMessage = startupOptionsComposite.getErrorMessage();
setErrorMessage(errorMessage);
setValid((errorMessage == null) && (getMessage() == null));
if (defaultMessageNeedsReset)
{
defaultMessageNeedsReset = false;
setMessage(defaultMessage);
}
}
};
/**
* Creates the UI contents of this Property Page.
* It shows the Android Emulator Device Instance properties
* organized into tabs.
*/
@Override
protected Control createContents(Composite parent)
{
// Create Startup Options area
SkinFramework sm = new SkinFramework();
IAndroidSkin skin = null;
boolean canCalculateScale = true;
try
{
skin = sm.getSkinById(emuInstance.getSkinId(), emuInstance.getSkinPath());
}
catch (SkinException e)
{
StudioLogger.error(this.getClass(),
"Error reading instance skin during startup options page creation", e);
canCalculateScale = false;
}
startupOptionsComposite =
new StartupOptionsComposite(parent, emuInstance.getCommandLineArguments(), skin,
canCalculateScale);
startupOptionsComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
AbstractPropertiesComposite.addCompositeChangeListener(compositeChangeListener);
// If anything is not correct with instance property values,
// show the error message, but as an information to follow
// UI guidelines
String errorMessage = startupOptionsComposite.getErrorMessage();
setValid((errorMessage == null));
if (errorMessage != null)
{
defaultMessageNeedsReset = true;
setMessage(errorMessage, INFORMATION);
}
return startupOptionsComposite;
}
/**
* Sets the element that owns the properties
*/
@Override
public void setElement(IAdaptable element)
{
// save the instance for direct use
if (element instanceof AndroidDeviceInstance)
{
emuInstance = (AndroidDeviceInstance) element;
}
super.setElement(element);
}
/**
* Performs the OK operation by setting the edited startup options as the
* startup options for the Android Emulator Device Instance to which this
* Property Page applies (the object for which it was created).
*
* @see org.eclipse.jface.preference.PreferencePage#performOk()
*/
@Override
public boolean performOk()
{
save();
return super.performOk();
}
/**
* Performs the Apply operation (which is the same as OK)
*
* @see org.eclipse.jface.preference.PreferencePage#performApply()
*/
@Override
protected void performApply()
{
save();
super.performApply();
}
/**
* Save the edited startup options in the Android Emulator Device Instance
*/
private void save()
{
if (emuInstance != null)
{
Properties emuProperties = emuInstance.getProperties();
emuProperties.setProperty(IDevicePropertiesConstants.commandline,
StartupOptionsMgt.getParamList());
emuInstance.setProperties(emuProperties);
InstanceEventManager.getInstance().notifyListeners(
new InstanceEvent(InstanceEventType.INSTANCE_UPDATED, emuInstance));
}
}
/**
* Set the default initial properties
*
* @see org.eclipse.jface.preference.PreferencePage#performDefaults()
*/
@Override
protected void performDefaults()
{
startupOptionsComposite.reloadValues(NativeUIUtils.getDefaultCommandLine());
super.performDefaults();
}
/**
* Remove listeners and dispose widgets
*/
@Override
public void dispose()
{
AbstractPropertiesComposite.removeCompositeChangeListener(compositeChangeListener);
startupOptionsComposite.dispose();
startupOptionsComposite = null;
super.dispose();
}
}