/*
* Copyright 2003-2011 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 jetbrains.mps.nodeEditor.cells;
import jetbrains.mps.editor.runtime.TextBuilderImpl;
import jetbrains.mps.editor.runtime.cells.EmptyCellAction;
import jetbrains.mps.nodeEditor.EditorComponent;
import jetbrains.mps.openapi.editor.EditorContext;
import jetbrains.mps.openapi.editor.TextBuilder;
import jetbrains.mps.openapi.editor.cells.CellActionType;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.mps.openapi.model.SNode;
import javax.swing.JComponent;
import javax.swing.border.Border;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.event.FocusListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
public class EditorCell_Component extends EditorCell_ComponentBase {
@NotNull
private final JComponent myComponent;
private final FocusListener mySelectCellOnFocusGainedFocusListener = new SelectCellOnFocusGainedFocusListener(this);
public EditorCell_Component(EditorContext editorContext, SNode node, @NotNull JComponent component) {
super(editorContext, node);
myComponent = component;
final EditorComponent nodeEditorComponent = getEditor();
myComponent.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
nodeEditorComponent.sendKeyEvent(e);
}
@Override
public void keyReleased(KeyEvent e) {
nodeEditorComponent.sendKeyEvent(e);
}
});
setAction(CellActionType.COPY, EmptyCellAction.getInstance());
setAction(CellActionType.CUT, EmptyCellAction.getInstance());
setAction(CellActionType.PASTE, EmptyCellAction.getInstance());
setAction(CellActionType.PASTE_AFTER, EmptyCellAction.getInstance());
setAction(CellActionType.PASTE_BEFORE, EmptyCellAction.getInstance());
}
public static EditorCell createComponentCell(EditorContext context, SNode node, JComponent component, String cellId) {
if (component == null) {
throw new IllegalArgumentException("component cannot be null for component cell " + cellId);
}
return new EditorCell_Component(context, node, component);
}
public String toString() {
return "ComponentCell";
}
@NotNull
@Override
public JComponent getComponent() {
return myComponent;
}
@Override
public boolean isDrawBorder() {
return false;
}
/**
* Computes ascent (baseline) of the component for alignment purposes.
*
* @return "component font ascent + border top inset" (this is not generic but works well for buttons). If the component or its font is null, returns
* the height of the cell.
*/
@Override
public int getAscent() {
Font font = myComponent.getFont();
if (font == null) {
return myHeight;
}
FontMetrics metrics = myComponent.getFontMetrics(font);
int ascent = metrics.getAscent();
Border border = myComponent.getBorder();
if (border != null) {
ascent += border.getBorderInsets(myComponent).top;
}
return ascent;
}
@Override
public TextBuilder renderText() {
return new TextBuilderImpl("[JComponent " + myComponent.toString() + " ]");
}
@Override
protected boolean isSelectionPainted() {
return false;
}
/**
* looks like not used
*/
public void paintSelection(Graphics g) {
paintSelection(g, getSelectionColor(), true);
}
@Override
public void onAdd() {
super.onAdd();
getComponent().addFocusListener(mySelectCellOnFocusGainedFocusListener);
}
@Override
public void onRemove() {
getComponent().removeFocusListener(mySelectCellOnFocusGainedFocusListener);
super.onRemove();
}
}