/* * 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.designSurface; import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.diagnostic.Logger; import com.intellij.ui.popup.PopupOwner; import com.intellij.uiDesigner.FormEditingUtil; import com.intellij.uiDesigner.actions.*; import com.intellij.uiDesigner.componentTree.ComponentTree; import com.intellij.uiDesigner.propertyInspector.DesignerToolWindowManager; import com.intellij.uiDesigner.radComponents.RadComponent; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.awt.*; import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; import java.util.ArrayList; /** * @author Anton Katilin * @author Vladimir Kondratyev */ public final class GlassLayer extends JComponent implements DataProvider, PopupOwner { private final GuiEditor myEditor; private static final Logger LOG = Logger.getInstance("#com.intellij.uiDesigner.designSurface.GlassLayer"); private Point myLastMousePosition; public GlassLayer(final GuiEditor editor){ myEditor = editor; enableEvents(AWTEvent.KEY_EVENT_MASK | AWTEvent.MOUSE_EVENT_MASK | AWTEvent.MOUSE_MOTION_EVENT_MASK); registerKeyboardAction(new MoveSelectionToRightAction(myEditor, false, false), IdeActions.ACTION_EDITOR_MOVE_CARET_RIGHT); registerKeyboardAction(new MoveSelectionToLeftAction(myEditor, false, false), IdeActions.ACTION_EDITOR_MOVE_CARET_LEFT); registerKeyboardAction(new MoveSelectionToUpAction(myEditor, false, false), IdeActions.ACTION_EDITOR_MOVE_CARET_UP); registerKeyboardAction(new MoveSelectionToDownAction(myEditor, false, false), IdeActions.ACTION_EDITOR_MOVE_CARET_DOWN); registerKeyboardAction(new MoveSelectionToRightAction(myEditor, true, false), "EditorRightWithSelection"); registerKeyboardAction(new MoveSelectionToLeftAction(myEditor, true, false), "EditorLeftWithSelection"); registerKeyboardAction(new MoveSelectionToUpAction(myEditor, true, false), "EditorUpWithSelection"); registerKeyboardAction(new MoveSelectionToDownAction(myEditor, true, false), "EditorDownWithSelection"); registerKeyboardAction(new MoveSelectionToRightAction(myEditor, false, true), "EditorLineEnd"); registerKeyboardAction(new MoveSelectionToLeftAction(myEditor, false, true), "EditorLineStart"); registerKeyboardAction(new MoveSelectionToUpAction(myEditor, false, true), "EditorPageUp"); registerKeyboardAction(new MoveSelectionToDownAction(myEditor, false, true), "EditorPageDown"); registerKeyboardAction(new MoveSelectionToRightAction(myEditor, true, true), "EditorLineEndWithSelection"); registerKeyboardAction(new MoveSelectionToLeftAction(myEditor, true, true), "EditorLineStartWithSelection"); registerKeyboardAction(new MoveSelectionToUpAction(myEditor, true, true), "EditorPageUpWithSelection"); registerKeyboardAction(new MoveSelectionToDownAction(myEditor, true, true), "EditorPageDownWithSelection"); registerKeyboardAction(new MoveComponentAction(-1, 0, 0, 0), "EditorScrollUp"); registerKeyboardAction(new MoveComponentAction(1, 0, 0, 0), "EditorScrollDown"); registerKeyboardAction(new MoveComponentAction(0, -1, 0, 0), "EditorPreviousWord"); registerKeyboardAction(new MoveComponentAction(0, 1, 0, 0), "EditorNextWord"); registerKeyboardAction(new MoveComponentAction(0, 0, -1, 0), IdeActions.ACTION_MOVE_STATEMENT_UP_ACTION); registerKeyboardAction(new MoveComponentAction(0, 0, 1, 0), IdeActions.ACTION_MOVE_STATEMENT_DOWN_ACTION); registerKeyboardAction(new MoveComponentAction(0, 0, 0, -1), "EditorPreviousWordWithSelection"); registerKeyboardAction(new MoveComponentAction(0, 0, 0, 1), "EditorNextWordWithSelection"); registerKeyboardAction(new SelectAllComponentsAction(), "$SelectAll"); // F2 should start inplace editing final StartInplaceEditingAction startInplaceEditingAction = new StartInplaceEditingAction(editor); startInplaceEditingAction.registerCustomShortcutSet( new CustomShortcutSet(KeyStroke.getKeyStroke(KeyEvent.VK_F2, 0)), this ); } private void registerKeyboardAction(final AnAction action, @NonNls final String actionId) { action.registerCustomShortcutSet( ActionManager.getInstance().getAction(actionId).getShortcutSet(), this ); } protected void processKeyEvent(final KeyEvent e){ myEditor.myProcessor.processKeyEvent(e); if (!e.isConsumed()) { super.processKeyEvent(e); } } protected void processMouseEvent(final MouseEvent e){ if(e.getID() == MouseEvent.MOUSE_PRESSED){ requestFocusInWindow(); } try { myEditor.myProcessor.processMouseEvent(e); } catch(Exception ex) { LOG.error(ex); } } protected void processMouseMotionEvent(final MouseEvent e){ myLastMousePosition = e.getPoint(); try { myEditor.myProcessor.processMouseEvent(e); } catch(Exception ex) { LOG.error(ex); } } @NotNull public Point getLastMousePosition() { if (myLastMousePosition == null) { return new Point(10, 10); } return myLastMousePosition; } /** * Provides {@link PlatformDataKeys#NAVIGATABLE} to navigate to * binding of currently selected component (if any) */ public Object getData(final String dataId) { if(CommonDataKeys.NAVIGATABLE.is(dataId)) { final ComponentTree componentTree = DesignerToolWindowManager.getInstance(myEditor).getComponentTree(); if (componentTree != null) { return componentTree.getData(dataId); } } return null; } @Nullable public Point getBestPopupPosition() { final ArrayList<RadComponent> selection = FormEditingUtil.getSelectedComponents(myEditor); if (selection.size() > 0) { final RadComponent component = selection.get(0); final Rectangle bounds = component.getBounds(); int bottom = bounds.height > 4 ? bounds.y+bounds.height-4 : bounds.y; int left = bounds.width > 4 ? bounds.x+4 : bounds.x; Point pnt = new Point(left, bottom); // the location needs to be within the component return SwingUtilities.convertPoint(component.getParent().getDelegee(), pnt, this); } return null; } }