blob: dbac27bc3f855f35b00bf1ce142a02d757c52d02 [file] [log] [blame]
/*
* Copyright (C) 2014 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.android.tools.idea.rendering;
import com.android.ide.common.rendering.HardwareConfigHelper;
import com.android.sdklib.devices.Device;
import com.android.sdklib.devices.Screen;
import com.android.tools.idea.configurations.Configuration;
import com.android.tools.idea.configurations.OverlayContainer;
import com.intellij.openapi.Disposable;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.awt.*;
import java.util.List;
public abstract class Overlay implements Disposable {
/** Whether the hover is hidden */
private boolean mHiding;
/**
* Construct the overlay, using the given graphics context for painting.
*/
public Overlay() {
super();
}
/**
* Initializes the overlay before the first use, if applicable. This is a
* good place to initialize resources like colors.
*/
public void create() {
}
/**
* Releases resources held by the overlay. Called by the editor when an
* overlay has been removed.
*/
@Override
public void dispose() {
}
/**
* Paints the overlay.
*
* @param component
* @param gc The Graphics object to draw into
*/
public void paint(@Nullable Component component, @NotNull Graphics2D gc, int deltaX, int deltaY) {
assert false; // probably using wrong paint signature in overlay
}
/**
* Returns whether the overlay is hidden
*
* @return true if the selection overlay is hidden
*/
public boolean isHiding() {
return mHiding;
}
/**
* Hides the overlay
*
* @param hiding true to hide the overlay, false to unhide it (default)
*/
public void setHiding(boolean hiding) {
mHiding = hiding;
}
/** Utility method which paints the overlays for a given container */
public static void paintOverlays(@NotNull OverlayContainer container, @Nullable Component component, @NotNull Graphics g,
int deltaX, int deltaY) {
Graphics2D g2 = (Graphics2D)g;
List<Overlay> overlays = container.getOverlays();
if (overlays != null) {
for (Overlay overlay : overlays) {
if (!overlay.isHiding()) {
overlay.paint(component, g2, deltaX, deltaY);
}
}
}
}
/**
* Sets a screen clip for the overlay if applicable. Returns the new clip if it was set.
*/
@Nullable
protected Shape setScreenClip(@NotNull OverlayContainer container, @NotNull Component component, @NotNull Graphics2D gc,
int deltaX, int deltaY) {
Configuration configuration = container.getConfiguration();
Shape clip = null;
if (configuration != null) {
Device device = configuration.getDevice();
if (device != null && device.isScreenRound()) {
Screen screen = device.getDefaultHardware().getScreen();
int width = screen.getXDimension();
int height = screen.getYDimension();
Rectangle m = container.fromModel(component, new Rectangle(0, 0, width, height));
clip = RenderedImage.getClip(device, m.x + deltaX, m.y + deltaY, m.width, m.height);
}
if (clip != null) {
gc.setClip(clip);
}
}
return clip;
}
}