/* * 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.controls; import org.eclipse.sequoyah.vnc.vncviewer.graphics.IRemoteDisplay; import org.eclipse.sequoyah.vnc.vncviewer.graphics.swt.SWTRemoteDisplay; import org.eclipse.swt.custom.ScrolledComposite; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.TabFolder; import org.eclipse.swt.widgets.TabItem; import com.motorola.studio.android.emulator.core.model.IAndroidEmulatorInstance; import com.motorola.studio.android.emulator.ui.controls.maindisplay.MainDisplayComposite; /** * DESCRIPTION: * This class provides helper methods for Android Composite UI * * RESPONSIBILITY: * - Provide utility methods related to Android Composite UI * * COLABORATORS: * None. * * USAGE: * Use any of the public methods for getting help with skin UI */ public class UIHelper { /** * Retrieves the instance related to a given control * * @param control The control associated to an instance, which is to be retrieved * * @return The instance associated with the control */ public static IAndroidEmulatorInstance getInstanceAssociatedToControl(Control control) { IAndroidEmulatorInstance result = null; Control composite = null; TabFolder folder = null; if (control instanceof ScrolledComposite) { composite = ((ScrolledComposite) control).getContent(); folder = (TabFolder) composite.getParent(); } else if (control instanceof MainDisplayComposite) { composite = control.getParent(); folder = (TabFolder) control.getParent().getParent(); } else if ((control instanceof Composite) && (control instanceof IAndroidComposite)) { composite = control; folder = (TabFolder) control.getParent(); } else if ((control instanceof SWTRemoteDisplay) || (control instanceof RemoteCLIDisplay)) { composite = control.getParent(); folder = (TabFolder) composite.getParent(); } if (folder != null) { TabItem[] items = folder.getItems(); for (TabItem item : items) { if (item.getControl() == composite) { result = (IAndroidEmulatorInstance) item.getData(); break; } } } return result; } public static SWTRemoteDisplay getRemoteDisplayAssociatedToControl(Control control) { SWTRemoteDisplay remoteDisplay = null; if ((control instanceof Composite) && (control instanceof IAndroidComposite)) { for (Control childControl : ((Composite) control).getChildren()) { if (childControl instanceof SWTRemoteDisplay) { remoteDisplay = (SWTRemoteDisplay) childControl; break; } } } return remoteDisplay; } /** * Ajusts the x,y coordinates of the mouse event according to the current zoom and rotation. * Coordinates are originally set with the x,y coordinates of the UI element which may be resized according to zoom and rotation, * but the x,y coordinates expected by the Android emulator is independent of the zoom and rotation. * @param e the mouse event whose coordinates will be ajusted. */ public static void ajustCoordinates(MouseEvent e, IAndroidComposite composite) { int x; int y; SWTRemoteDisplay mainDisplay = UIHelper.getRemoteDisplayAssociatedToControl((Control) composite); IRemoteDisplay.Rotation rotation = mainDisplay.getRotation(); double zoomFactor = composite.getZoomFactor(); switch (rotation) { case ROTATION_90DEG_COUNTERCLOCKWISE: x = mainDisplay.getScreenWidth() - (int) ((double) e.y / zoomFactor); y = (int) ((double) e.x / zoomFactor); break; default: x = (int) ((double) e.x / zoomFactor); y = (int) ((double) e.y / zoomFactor); } e.x = x; e.y = y; } }