/*
* 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.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import com.motorola.studio.android.adt.SdkUtils;
import com.motorola.studio.android.emulator.device.IDevicePropertiesConstants;
import com.motorola.studio.android.emulator.i18n.EmulatorNLS;
/**
* DESCRIPTION:
* <br>
* This class is a composite which shows all Android Emulator Device Instance information.
* All displayed information can be edited and kept on a Properties object, which can be
* later used to be set to an actual Android Emulator Device Instance object as its new values.
* <br>
* It extends the AbstractPropertiesComposite so as to use its common functionalities.
* <br>
* RESPONSIBILITY:
* <br>
* - Show all available UI information of a Android Emulator Device Instance
* <br>
* COLABORATORS:
* <br>
* AbstractPropertiesComposite: extends this class
* <br>
* IDevicePropertiesConstants: implements this interface in order to have direct use of its
* constants for populating the device instance's Properties object
* <br>
* USAGE:
* <br>
* This composite can be used for any UI that shows all Android Emulator Device Instance
* UI information. It can either allow of stop the editing of the name of the instance,
* while other information is always editable.
* It should be instantiated as a regular composite.
*/
public class InfoComposite extends AbstractPropertiesComposite implements
IDevicePropertiesConstants
{
private boolean showEmulatorDefNotFoundMsg = false;
private Properties emuPropertiesWorkingCopy;
private String emuName;
private PropertiesMainComposite mainComposite;
// the listener to changes on all AbstractPropertiesComposite objects used on this composite
private PropertyCompositeChangeListener listener = new PropertyCompositeChangeListener()
{
public void compositeChanged(PropertyCompositeChangeEvent e)
{
if (e.getSource() instanceof PropertiesMainComposite)
{
emuPropertiesWorkingCopy.setProperty(timeout, mainComposite.getTimeout());
emuPropertiesWorkingCopy.setProperty(skinId, mainComposite.getSkinId());
emuPropertiesWorkingCopy.setProperty(useVnc, mainComposite.getUseVnc());
emuPropertiesWorkingCopy.setProperty(useProxy, mainComposite.getUseProxy());
emuPropertiesWorkingCopy.setProperty(startFromSnapshot,
mainComposite.getstartFromSnapshot());
emuPropertiesWorkingCopy.setProperty(saveSnapshot, mainComposite.getSaveSnapshot());
emuPropertiesWorkingCopy.setProperty(abiType, mainComposite.getAbiType());
notifyCompositeChangeListeners();
}
}
};
/**
* Creates a InfoComposite object.
*
* @param parent the parent composite
* @param emuProperties the instance properties to be shown on the UI
* @param emuName the name of the instance
* @param isNameEditable whether the instance name should be made editable or not
* @param areOtherFieldsEditable True if the user will be able to edit other data in the composite; false otherwise
*/
public InfoComposite(Composite parent, Properties emuProperties, String emuName,
boolean areOtherFieldsEditable)
{
super(parent);
this.emuPropertiesWorkingCopy = (Properties) emuProperties.clone();
this.emuName = emuName;
createUI(areOtherFieldsEditable);
parent.addDisposeListener(new DisposeListener()
{
public void widgetDisposed(DisposeEvent e)
{
AbstractPropertiesComposite.removeCompositeChangeListener(listener);
InfoComposite.this.dispose();
}
});
}
/**
* Creates all the UI for this composite. The listener declared as attribute to this class
* is added to all composites extending AbstractPropertiesComposite.
* Information is organized on 3 tabs:<br>
* - "Main" tab: uses the PropertiesMainComposite;<br>
* - "Advanced" tab: uses the PropertiesAdvancedComposite;<br>
*
* @param editable True if the user will be able to edit data in the composite; false otherwise
*/
private void createUI(boolean editable)
{
GridLayout mainLayout = new GridLayout(1, false);
mainLayout.marginWidth = 0;
mainLayout.marginHeight = 0;
this.setLayout(mainLayout);
mainComposite =
new PropertiesMainComposite(this, emuName, getProperty(emulatorDefId),
getProperty(timeout), Boolean.parseBoolean(getProperty(useVnc)),
Boolean.parseBoolean(getProperty(useProxy)),
Boolean.parseBoolean(getProperty(useSnapshots)),
Boolean.parseBoolean(getProperty(saveSnapshot)),
Boolean.parseBoolean(getProperty(startFromSnapshot)),
SdkUtils.getTargetByName(getProperty(vmTarget)), getProperty(vmSkin),
getProperty(vmPath), getProperty(abiType), true, false, editable);
mainComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
AbstractPropertiesComposite.addCompositeChangeListener(listener);
}
/**
* Retrieves the given property from the instance.
*
* @param propertyName the name of the property (key)
*
* @return the property value
*/
private String getProperty(String propertyName)
{
String emuProperty = emuPropertiesWorkingCopy.getProperty(propertyName);
if (emuProperty == null)
{
emuProperty = "";
}
return emuProperty;
}
/**
* Retrieves the (potentially) edited properties.
*
* @return the edited properties
*/
public Properties getPropertiesWorkingCopy()
{
return emuPropertiesWorkingCopy;
}
/**
* Retrieves the error message associated to this composites current state.
* "Main" tab's error message is returned if any; if none, "Skin" tab's error
* message is returned if any; if none, "VM" tab's error message is returned if
* any; if none, <code>null</code> is returned to state there is no error with
* the current state.
*
* @return the error message, or <code>null</code> if there are no errors
*/
@Override
public String getErrorMessage()
{
String errorMessage = mainComposite.getErrorMessage();
return errorMessage;
}
/**
* Retrieves the information message associated to this composites current state.
*
* @return the information message, or <code>null</code> if there are no information messages
*/
public String getInfoMessage()
{
String infoMessage = null;
if (showEmulatorDefNotFoundMsg)
{
infoMessage = EmulatorNLS.INFO_InfoComposite_EmulatorDefinitionNotFound;
}
return infoMessage;
}
}