/* * Copyright 2000-2012 JetBrains s.r.o. * * 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.intellij.designer.model; import com.intellij.designer.designSurface.ScalableComponent; import org.jetbrains.annotations.NotNull; import javax.swing.*; import java.awt.*; /** * @author Alexander Lobas */ public abstract class RadVisualComponent extends RadComponent { private Component myNativeComponent; private final Rectangle myBounds = new Rectangle(); @Override public Rectangle getBounds() { return myBounds; } @Override public Rectangle getBounds(Component relativeTo) { return fromModel(relativeTo, getBounds()); } @Override public Rectangle fromModel(@NotNull Component target, @NotNull Rectangle bounds) { if (target != myNativeComponent && myNativeComponent instanceof ScalableComponent) { ScalableComponent scalableComponent = (ScalableComponent)myNativeComponent; double zoom = scalableComponent.getScale(); if (zoom != 1) { bounds = new Rectangle(bounds); bounds.x *= zoom; bounds.y *= zoom; bounds.width *= zoom; bounds.height *= zoom; } } return myNativeComponent == target ? new Rectangle(bounds) : SwingUtilities.convertRectangle(myNativeComponent, bounds, target); } @Override public Rectangle toModel(@NotNull Component source, @NotNull Rectangle rectangle) { Rectangle bounds = myNativeComponent == source ? new Rectangle(rectangle) : SwingUtilities.convertRectangle(source, rectangle, myNativeComponent); if (myNativeComponent != source && myNativeComponent instanceof ScalableComponent) { ScalableComponent scalableComponent = (ScalableComponent)myNativeComponent; double zoom = scalableComponent.getScale(); if (zoom != 1) { bounds = new Rectangle(bounds); bounds.x /= zoom; bounds.y /= zoom; bounds.width /= zoom; bounds.height /= zoom; } } return bounds; } @Override public Point fromModel(@NotNull Component target, @NotNull Point point) { if (target != myNativeComponent && myNativeComponent instanceof ScalableComponent) { ScalableComponent scalableComponent = (ScalableComponent)myNativeComponent; double zoom = scalableComponent.getScale(); if (zoom != 1) { point = new Point(point); point.x *= zoom; point.y *= zoom; } } return myNativeComponent == target ? new Point(point) : SwingUtilities.convertPoint(myNativeComponent, point, target); } @Override public Point toModel(@NotNull Component source, @NotNull Point point) { Point p = myNativeComponent == source ? new Point(point) : SwingUtilities.convertPoint(source, point, myNativeComponent); if (myNativeComponent != source && myNativeComponent instanceof ScalableComponent) { ScalableComponent scalableComponent = (ScalableComponent)myNativeComponent; double zoom = scalableComponent.getScale(); if (zoom != 1) { p = new Point(p); p.x /= zoom; p.y /= zoom; } } return p; } @Override public Dimension fromModel(@NotNull Component target, @NotNull Dimension size) { size = new Dimension(size); if (target != myNativeComponent && myNativeComponent instanceof ScalableComponent) { ScalableComponent scalableComponent = (ScalableComponent)myNativeComponent; double zoom = scalableComponent.getScale(); if (zoom != 1) { size.width *= zoom; size.height *= zoom; } } return size; } @Override public Dimension toModel(@NotNull Component source, @NotNull Dimension size) { size = new Dimension(size); if (myNativeComponent != source && myNativeComponent instanceof ScalableComponent) { ScalableComponent scalableComponent = (ScalableComponent)myNativeComponent; double zoom = scalableComponent.getScale(); if (zoom != 1) { size.width /= zoom; size.height /= zoom; } } return size; } public void setBounds(int x, int y, int width, int height) { myBounds.setBounds(x, y, width, height); } @Override public Point convertPoint(Component relativeFrom, int x, int y) { Point p = myNativeComponent == relativeFrom ? new Point(x, y) : SwingUtilities.convertPoint(relativeFrom, x, y, myNativeComponent); if (myNativeComponent != relativeFrom && myNativeComponent instanceof ScalableComponent) { ScalableComponent scalableComponent = (ScalableComponent)myNativeComponent; double zoom = scalableComponent.getScale(); if (zoom != 1) { p.x /= zoom; p.y /= zoom; } } return p; } public Component getNativeComponent() { return myNativeComponent; } public void setNativeComponent(Component nativeComponent) { myNativeComponent = nativeComponent; } }