use of org.exbin.deltahex.CaretPosition in project deltahex-java by exbin.
the class CodeAreaOperationCommandHandler method keyTyped.
@Override
public void keyTyped(KeyEvent keyEvent) {
char keyValue = keyEvent.getKeyChar();
if (keyValue == KeyEvent.CHAR_UNDEFINED) {
return;
}
if (!((EditationModeCapable) codeArea.getWorker()).isEditable()) {
return;
}
DefaultCodeAreaCaret caret = (DefaultCodeAreaCaret) ((CaretCapable) codeArea.getWorker()).getCaret();
CaretPosition caretPosition = caret.getCaretPosition();
if (caretPosition.getSection() == BasicCodeAreaSection.CODE_MATRIX.getSection()) {
long dataPosition = caretPosition.getDataPosition();
int startCodeOffset = caretPosition.getCodeOffset();
CodeType codeType = getCodeType();
boolean validKey = CodeAreaUtils.isValidCodeKeyValue(keyValue, startCodeOffset, codeType);
if (validKey) {
DeleteSelectionCommand deleteSelectionCommand = null;
if (codeArea.hasSelection()) {
long selectionStart = ((SelectionCapable) codeArea.getWorker()).getSelection().getFirst();
deleteSelectionCommand = new DeleteSelectionCommand(codeArea);
((CaretCapable) codeArea.getWorker()).getCaret().setCaretPosition(selectionStart);
}
int value;
if (keyValue >= '0' && keyValue <= '9') {
value = keyValue - '0';
} else {
value = Character.toLowerCase(keyValue) - 'a' + 10;
}
// }
if (editCommand != null && editCommand.wasReverted()) {
editCommand = null;
}
int codeOffset = ((CaretCapable) codeArea.getWorker()).getCaret().getCaretPosition().getCodeOffset();
if (((EditationModeCapable) codeArea.getWorker()).getEditationMode() == EditationMode.OVERWRITE) {
if (editCommand == null || !(editCommand instanceof EditCodeDataCommand) || editCommand.getCommandType() != EditDataCommand.EditCommandType.OVERWRITE) {
editCommand = new EditCodeDataCommand(codeArea, EditCodeDataCommand.EditCommandType.OVERWRITE, dataPosition, codeOffset);
if (deleteSelectionCommand != null) {
HexCompoundCommand compoundCommand = new HexCompoundCommand(codeArea);
compoundCommand.appendCommand(deleteSelectionCommand);
try {
undoHandler.execute(compoundCommand);
} catch (BinaryDataOperationException ex) {
Logger.getLogger(CodeAreaOperationCommandHandler.class.getName()).log(Level.SEVERE, null, ex);
}
compoundCommand.appendCommand(editCommand);
} else {
undoHandler.addCommand(editCommand);
}
}
((EditCodeDataCommand) editCommand).appendEdit((byte) value);
} else {
if (editCommand == null || !(editCommand instanceof EditCodeDataCommand) || editCommand.getCommandType() != EditCodeDataCommand.EditCommandType.INSERT) {
editCommand = new EditCodeDataCommand(codeArea, EditCharDataCommand.EditCommandType.INSERT, dataPosition, codeOffset);
if (deleteSelectionCommand != null) {
HexCompoundCommand compoundCommand = new HexCompoundCommand(codeArea);
compoundCommand.appendCommand(deleteSelectionCommand);
try {
undoHandler.execute(compoundCommand);
} catch (BinaryDataOperationException ex) {
Logger.getLogger(CodeAreaOperationCommandHandler.class.getName()).log(Level.SEVERE, null, ex);
}
compoundCommand.appendCommand(editCommand);
} else {
undoHandler.addCommand(editCommand);
}
}
((EditCodeDataCommand) editCommand).appendEdit((byte) value);
}
codeArea.notifyDataChanged();
move(NO_MODIFIER, MovementDirection.RIGHT);
revealCursor();
}
} else {
char keyChar = keyValue;
boolean validKey = keyChar > 31 && keyChar != DELETE_CHAR && isValidChar(keyValue);
if (validKey) {
if (editCommand != null && editCommand.wasReverted()) {
editCommand = null;
}
long dataPosition = ((CaretCapable) codeArea.getWorker()).getCaret().getCaretPosition().getDataPosition();
DeleteSelectionCommand deleteCommand = null;
if (codeArea.hasSelection()) {
deleteCommand = new DeleteSelectionCommand(codeArea);
}
if (((EditationModeCapable) codeArea.getWorker()).getEditationMode() == EditationMode.OVERWRITE) {
if (editCommand == null || !(editCommand instanceof EditCharDataCommand) || editCommand.getCommandType() != EditCodeDataCommand.EditCommandType.OVERWRITE) {
editCommand = new EditCharDataCommand(codeArea, EditCodeDataCommand.EditCommandType.OVERWRITE, dataPosition);
if (deleteCommand != null) {
HexCompoundCommand compoundCommand = new HexCompoundCommand(codeArea);
compoundCommand.appendCommand(deleteCommand);
try {
undoHandler.execute(compoundCommand);
} catch (BinaryDataOperationException ex) {
Logger.getLogger(CodeAreaOperationCommandHandler.class.getName()).log(Level.SEVERE, null, ex);
}
compoundCommand.appendCommand(editCommand);
} else {
undoHandler.addCommand(editCommand);
}
}
((EditCharDataCommand) editCommand).appendEdit(keyChar);
} else {
if (editCommand == null || !(editCommand instanceof EditCharDataCommand) || editCommand.getCommandType() != EditCodeDataCommand.EditCommandType.INSERT) {
editCommand = new EditCharDataCommand(codeArea, EditCodeDataCommand.EditCommandType.INSERT, dataPosition);
if (deleteCommand != null) {
HexCompoundCommand compoundCommand = new HexCompoundCommand(codeArea);
compoundCommand.appendCommand(deleteCommand);
try {
undoHandler.execute(compoundCommand);
} catch (BinaryDataOperationException ex) {
Logger.getLogger(CodeAreaOperationCommandHandler.class.getName()).log(Level.SEVERE, null, ex);
}
compoundCommand.appendCommand(editCommand);
} else {
undoHandler.addCommand(editCommand);
}
}
((EditCharDataCommand) editCommand).appendEdit(keyChar);
}
codeArea.notifyDataChanged();
revealCursor();
codeArea.repaint();
}
}
}
use of org.exbin.deltahex.CaretPosition in project deltahex-java by exbin.
the class DeltaHexEditorBasic method postInit.
private void postInit() {
codeArea.setComponentPopupMenu(mainPopupMenu);
setIconImage(new javax.swing.ImageIcon(getClass().getResource("/org/exbin/deltahex/editor/basic/resources/icons/icon.png")).getImage());
undoHandler.addUndoUpdateListener(new BinaryDataUndoUpdateListener() {
@Override
public void undoCommandPositionChanged() {
updateUndoState();
codeArea.repaint();
}
@Override
public void undoCommandAdded(@Nonnull BinaryDataCommand command) {
updateUndoState();
codeArea.repaint();
}
});
((EditationModeCapable) codeArea.getWorker()).addEditationModeChangedListener(new EditationModeChangedListener() {
@Override
public void editationModeChanged(EditationMode editationMode) {
switch(editationMode) {
case INSERT:
{
editationModeLabel.setText("INS");
break;
}
case OVERWRITE:
{
editationModeLabel.setText("OVR");
break;
}
default:
{
throw new IllegalStateException("Unexpected editation mode " + editationMode.name());
}
}
}
});
((CaretCapable) codeArea.getWorker()).addCaretMovedListener(new CaretMovedListener() {
@Override
public void caretMoved(CaretPosition caretPosition) {
positionLabel.setText(caretPosition.getDataPosition() + ":" + caretPosition.getCodeOffset());
}
});
((SelectionCapable) codeArea.getWorker()).addSelectionChangedListener(new SelectionChangedListener() {
@Override
public void selectionChanged(SelectionRange selection) {
updateClipboardState();
}
});
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
clipboard.addFlavorListener(new FlavorListener() {
@Override
public void flavorsChanged(FlavorEvent e) {
updateClipboardState();
}
});
updateUndoState();
updateClipboardState();
openFileButton.setText("Open");
}
use of org.exbin.deltahex.CaretPosition in project deltahex-java by exbin.
the class DefaultCodeAreaCommandHandler method move.
public void move(int modifiers, @Nonnull MovementDirection direction) {
DefaultCodeAreaCaret caret = (DefaultCodeAreaCaret) ((CaretCapable) codeArea.getWorker()).getCaret();
CaretPosition caretPosition = caret.getCaretPosition();
CaretPosition movePosition = codeArea.getWorker().computeMovePosition(caretPosition, direction);
if (!caretPosition.equals(movePosition)) {
caret.setCaretPosition(movePosition);
updateSelection((modifiers & KeyEvent.SHIFT_DOWN_MASK) > 0, movePosition);
notifyCaretMoved();
}
}
Aggregations