package com.redhat.ceylon.eclipse.code.refactor; import static com.redhat.ceylon.eclipse.util.EditorUtil.getCommandBinding; import static org.eclipse.jface.text.link.LinkedPositionGroup.NO_STOP; import org.eclipse.jface.action.Action; import org.eclipse.jface.bindings.TriggerSequence; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.source.ISourceViewer; import com.redhat.ceylon.eclipse.code.correct.LinkedModeImporter; import com.redhat.ceylon.eclipse.code.editor.CeylonEditor; public abstract class RefactorLinkedMode extends AbstractLinkedMode { private String initialName; protected String getInitialName() { return initialName; } protected final String openDialogKeyBinding; public RefactorLinkedMode(CeylonEditor editor) { super(editor); TriggerSequence binding = getCommandBinding(getActionName()); openDialogKeyBinding = binding==null ? "" : binding.format(); } protected abstract String getActionName(); protected abstract String getNewNameFromNamePosition(); protected abstract String getName(); protected abstract void setName(String name); protected abstract boolean canStart(); protected int performInitialChange(IDocument document) { return 0; } protected abstract void setupLinkedPositions( IDocument document, int adjust) throws BadLocationException; public final void start() { if (canStart() && new RefactoringSaveHelper(getSaveMode()) .saveEditors(editor.getSite().getShell())) { saveEditorState(); ISourceViewer viewer = editor.getCeylonSourceViewer(); IDocument document = viewer.getDocument(); int offset = getOriginalSelection().x; initialName = getName(); int adjust = performInitialChange(document); try { setupLinkedPositions(document, adjust); enterLinkedMode(document, NO_STOP, getExitPosition(offset, adjust)); } catch (BadLocationException e) { e.printStackTrace(); return; } openPopup(); } } @Override protected final Action createOpenDialogAction() { return new Action("Open Dialog..." + '\t' + openDialogKeyBinding) { @Override public void run() { enterDialogMode(); openDialog(); } }; } @Override protected final Action createPreviewAction() { return new Action("Preview...") { @Override public void run() { enterDialogMode(); openPreview(); } }; } protected abstract void openPreview(); protected abstract void openDialog(); public final void enterDialogMode() { setName(getNewNameFromNamePosition()); linkedModeModel.exit(LinkedModeImporter.CANCEL); revertChanges(); } protected int getSaveMode() { return RefactoringSaveHelper.SAVE_NOTHING; } }