blob: 751811de09b080d4c2328f358261c10de2c9d548 [file] [log] [blame]
/*
* 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;
}
}