| /* |
| * Copyright 2000-2009 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.uiDesigner.radComponents; |
| |
| import com.intellij.openapi.diagnostic.Logger; |
| import com.intellij.uiDesigner.ModuleProvider; |
| import com.intellij.uiDesigner.UIFormXmlConstants; |
| import com.intellij.uiDesigner.XmlWriter; |
| import com.intellij.uiDesigner.core.GridConstraints; |
| import com.intellij.uiDesigner.designSurface.ComponentDragObject; |
| import com.intellij.uiDesigner.designSurface.ComponentDropLocation; |
| import com.intellij.uiDesigner.designSurface.FeedbackLayer; |
| import com.intellij.uiDesigner.designSurface.GuiEditor; |
| import com.intellij.uiDesigner.palette.Palette; |
| import com.intellij.uiDesigner.snapShooter.SnapshotContext; |
| import org.jetbrains.annotations.NotNull; |
| import org.jetbrains.annotations.Nullable; |
| |
| import javax.swing.*; |
| import java.awt.*; |
| |
| /** |
| * @author Anton Katilin |
| * @author Vladimir Kondratyev |
| */ |
| public final class RadScrollPane extends RadContainer { |
| public static final Class COMPONENT_CLASS = JScrollPane.class; |
| private static final Logger LOG = Logger.getInstance("#com.intellij.uiDesigner.radComponents.RadScrollPane"); |
| |
| public static class Factory extends RadComponentFactory { |
| public RadComponent newInstance(ModuleProvider module, Class aClass, String id) { |
| return new RadScrollPane(module, aClass, id); |
| } |
| |
| public RadComponent newInstance(final Class componentClass, final String id, final Palette palette) { |
| return new RadScrollPane(componentClass, id, palette); |
| } |
| } |
| |
| public RadScrollPane(final ModuleProvider module, final Class componentClass, final String id){ |
| super(module, componentClass, id); |
| } |
| |
| public RadScrollPane(final Class componentClass, final String id, final Palette palette) { |
| super(componentClass, id, palette); |
| } |
| |
| @Nullable @Override |
| protected RadLayoutManager createInitialLayoutManager() { |
| return new RadScrollPaneLayoutManager(); |
| } |
| |
| public void write(final XmlWriter writer) { |
| writer.startElement(UIFormXmlConstants.ELEMENT_SCROLLPANE); |
| try { |
| writeNoLayout(writer, JScrollPane.class.getName()); |
| } finally { |
| writer.endElement(); // scrollpane |
| } |
| } |
| |
| @Override public RadComponent getActionTargetComponent(RadComponent child) { |
| return this; |
| } |
| |
| @Override |
| protected void importSnapshotComponent(final SnapshotContext context, final JComponent component) { |
| JScrollPane scrollPane = (JScrollPane) component; |
| final Component view = scrollPane.getViewport().getView(); |
| if (view instanceof JComponent) { |
| RadComponent childComponent = createSnapshotComponent(context, (JComponent) view); |
| if (childComponent != null) { |
| addComponent(childComponent); |
| } |
| } |
| } |
| |
| private class RadScrollPaneLayoutManager extends RadLayoutManager { |
| private MyDropLocation myDropLocation = null; |
| |
| @Nullable public String getName() { |
| return null; |
| } |
| |
| public void writeChildConstraints(final XmlWriter writer, final RadComponent child) { |
| } |
| |
| @Override @NotNull |
| public ComponentDropLocation getDropLocation(RadContainer container, @Nullable final Point location) { |
| if (myDropLocation == null) { |
| myDropLocation = new MyDropLocation(); |
| } |
| return myDropLocation; |
| } |
| |
| public void addComponentToContainer(final RadContainer container, final RadComponent component, final int index) { |
| try { |
| final JScrollPane scrollPane = (JScrollPane)container.getDelegee(); |
| final JComponent delegee = component.getDelegee(); |
| delegee.setLocation(0,0); |
| scrollPane.setViewportView(delegee); |
| } |
| catch (ClassCastException e) { |
| LOG.info(e); |
| LOG.info("container classloader=" + container.getDelegee().getClass().getClassLoader()); |
| LOG.info("component classloader=" + component.getDelegee().getClass().getClassLoader()); |
| throw e; |
| } |
| } |
| |
| @Override public void removeComponentFromContainer(final RadContainer container, final RadComponent component) { |
| final JScrollPane scrollPane = (JScrollPane)container.getDelegee(); |
| scrollPane.setViewportView(null); |
| } |
| } |
| |
| private class MyDropLocation implements ComponentDropLocation { |
| public RadContainer getContainer() { |
| return RadScrollPane.this; |
| } |
| |
| public boolean canDrop(ComponentDragObject dragObject) { |
| return dragObject.getComponentCount() == 1 && getComponentCount() == 0; |
| } |
| |
| public void placeFeedback(FeedbackLayer feedbackLayer, ComponentDragObject dragObject) { |
| feedbackLayer.putFeedback(getDelegee(), new Rectangle(0, 0, getWidth(), getHeight()), getDisplayName()); |
| } |
| |
| public void processDrop(GuiEditor editor, |
| RadComponent[] components, |
| GridConstraints[] constraintsToAdjust, |
| ComponentDragObject dragObject) { |
| addComponent(components[0]); |
| } |
| |
| @Nullable |
| public ComponentDropLocation getAdjacentLocation(Direction direction) { |
| return null; |
| } |
| } |
| } |