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