/*
* 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.messageTargets;
import jetbrains.mps.errors.MessageStatus;
import jetbrains.mps.errors.messageTargets.MessageTarget;
import jetbrains.mps.nodeEditor.DefaultEditorMessage;
import jetbrains.mps.nodeEditor.EditorComponent;
import jetbrains.mps.openapi.editor.cells.EditorCell;
import jetbrains.mps.openapi.editor.message.EditorMessageOwner;
import jetbrains.mps.nodeEditor.cells.EditorCell_Property;
import jetbrains.mps.nodeEditor.cells.ModelAccessor;
import jetbrains.mps.nodeEditor.cells.PropertyAccessor;
import jetbrains.mps.openapi.editor.message.SimpleEditorMessage;
import org.jetbrains.mps.openapi.model.SNode;
import org.jetbrains.annotations.NotNull;
import java.awt.Color;
/**
* Cyril.Konopko, 18.02.2010
*/
public class EditorMessageWithTarget extends DefaultEditorMessage {
protected MessageTarget myMessageTarget;
public EditorMessageWithTarget(SNode errorNode, MessageStatus status, @NotNull MessageTarget target, Color color, String string, EditorMessageOwner owner) {
super(errorNode, status, color, string, owner);
myMessageTarget = target;
}
@Override
public boolean acceptCell(EditorCell cell, EditorComponent editor) {
//cell can be not a big one so we don't call super.acceptCell
if (cell == null || !editor.isValid(cell) || cell.getSNode() != getNode()) {
return false;
}
switch (myMessageTarget.getTarget()) {
case NODE:
return cell.isBig();
case REFERENCE:
if (cell.isReferenceCell()) {
return myMessageTarget.getRole().equals(cell.getRole());
} else {
return cell.isBig() && getCell(editor) == cell;
}
case PROPERTY:
return CellFinder.isCellForProperty(cell, getNode(), myMessageTarget.getRole())
|| (cell.isBig() && getCell(editor) == cell);
case DELETED_CHILD:
return getCell(editor) == cell;
default:
return false;
}
}
@Override
public EditorCell getCell(EditorComponent editor) {
switch (myMessageTarget.getTarget()) {
case NODE:
return super.getCell(editor);
case REFERENCE:
return CellFinder.getCellForReference(editor, getNode(), myMessageTarget.getRole());
case PROPERTY:
return CellFinder.getCellForProperty(editor, getNode(), myMessageTarget.getRole());
case DELETED_CHILD:
return CellFinder.getCellForChild(editor, getNode(), myMessageTarget.getRole());
default:
return null;
}
}
@Override
public boolean sameAs(SimpleEditorMessage message) {
return super.sameAs(message) && message instanceof EditorMessageWithTarget
&& myMessageTarget.sameAs(((EditorMessageWithTarget) message).myMessageTarget);
}
}