/* * 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 org.eclipse.core.runtime.IAdaptable; import org.eclipse.jface.preference.PreferenceDialog; import org.eclipse.sequoyah.device.framework.events.InstanceEvent; import org.eclipse.sequoyah.device.framework.events.InstanceEventManager; import org.eclipse.sequoyah.device.framework.events.InstanceEvent.InstanceEventType; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; 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.emulator.device.IDevicePropertiesConstants; import com.motorola.studio.android.emulator.device.instance.AndroidDeviceInstance; import com.motorola.studio.android.emulator.device.ui.AbstractPropertiesComposite.PropertyCompositeChangeEvent; import com.motorola.studio.android.emulator.device.ui.AbstractPropertiesComposite.PropertyCompositeChangeListener; /** * DESCRIPTION: * <br> * This class implements the Property Page for Android Emulator Device Instances. * <br> * It shows all Android Emulator Device Instance properties on the UI so that the user * is able to edit it (the instance name is not a property and will not be editable). * <br> * RESPONSIBILITY: * <br> * - Allow viewing and editing of Android Emulator Device Instance properties * <br> * COLABORATORS: * <br> * PropertyPage: extends this class * <br> * InfoComposite: uses this composite for exhibiting instance properties 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 AndroidPropertiesPage extends PropertyPage implements IWorkbenchPropertyPage, IDevicePropertiesConstants { // the Android Emulator Device Instance to which this Property Page applies private AndroidDeviceInstance emuInstance; private InfoComposite infoComposite; // 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 String defaultMessage = getMessage(); // handle changes private PropertyCompositeChangeListener compositeChangeListener = new PropertyCompositeChangeListener() { public void compositeChanged(PropertyCompositeChangeEvent e) { String errorMessage = infoComposite.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) { ((PreferenceDialog) this.getContainer()).getTreeViewer().expandAll(); noDefaultAndApplyButton(); GridLayout mainLayout = new GridLayout(1, false); mainLayout.marginWidth = 0; mainLayout.marginHeight = 0; Composite composite = new Composite(parent, SWT.NULL); composite.setLayout(mainLayout); infoComposite = new InfoComposite(composite, emuInstance.getProperties(), emuInstance.getName(), !emuInstance.isStarted()); infoComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); AbstractPropertiesComposite.addCompositeChangeListener(compositeChangeListener); // there may be some info message for the composite String initialMessage = infoComposite.getInfoMessage(); // if no info message, check if there is some error message if (initialMessage == null) { // if anything is not correct with instance property values, // show the error message, but as an information to follow // UI guidelines initialMessage = infoComposite.getErrorMessage(); setValid((initialMessage == null)); } if (initialMessage != null) { defaultMessageNeedsReset = true; setMessage(initialMessage, INFORMATION); } return composite; } /** * 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 properties as the * properties for the Android Emulator Device Instance to which this * Property Page applies (the object for which it was created). */ @Override public boolean performOk() { if (emuInstance != null) { emuInstance.setProperties(infoComposite.getPropertiesWorkingCopy()); InstanceEventManager.getInstance().notifyListeners( new InstanceEvent(InstanceEventType.INSTANCE_UPDATED, emuInstance)); } return super.performOk(); } /** * Remove listeners and dispose widgets */ @Override public void dispose() { AbstractPropertiesComposite.removeCompositeChangeListener(compositeChangeListener); infoComposite.dispose(); super.dispose(); } }