package com.lightd.ideap.maven.execution.actions; import com.intellij.execution.impl.EditorHyperlinkSupport; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.Presentation; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.FoldRegion; import com.intellij.openapi.editor.FoldingModel; import com.intellij.openapi.editor.actions.ToggleUseSoftWrapsToolbarAction; import com.intellij.openapi.editor.impl.softwrap.SoftWrapAppliancePlaces; import com.lightd.ideap.maven.MvnCommandFolding; class MvnSoftWrapsAction extends ToggleUseSoftWrapsToolbarAction { private final MvnCommandFolding commandFolding; public MvnSoftWrapsAction(MvnCommandFolding commandFolding) { super(SoftWrapAppliancePlaces.CONSOLE); this.commandFolding = commandFolding; } @Override public boolean isSelected(AnActionEvent e) { boolean selected = super.isSelected(e); if (selected && !(getLastState(e.getPresentation()))) { setSelected(e, true); } return selected; } @Override public void setSelected(AnActionEvent event, final boolean state) { super.setSelected(event, state); Editor editor = getEditor(event); if (editor == null) return; String text = EditorHyperlinkSupport.getLineText(editor.getDocument(), 0, false); if (state && text == null) return; final String placeholder = commandFolding.getPlaceHolder(text); if (placeholder == null) return; final FoldingModel foldingModel = editor.getFoldingModel(); FoldRegion[] foldRegions = foldingModel.getAllFoldRegions(); if (!state && foldRegions.length <= 0) return; Runnable foldTask = null; final int endFoldRegionOffset = editor.getDocument().getLineEndOffset(0); Runnable addCollapsedFoldRegionTask = new Runnable() { @Override public void run() { FoldRegion foldRegion = foldingModel.addFoldRegion(0, endFoldRegionOffset, placeholder); if (foldRegion != null) { foldRegion.setExpanded(false); } } }; if (foldRegions.length <= 0 || state) { if (endFoldRegionOffset > 0) foldTask = addCollapsedFoldRegionTask; } else { final FoldRegion foldRegion = foldRegions[0]; if (foldRegion.getStartOffset() == 0 && foldRegion.getEndOffset() == endFoldRegionOffset) { foldTask = new Runnable() { @Override public void run() { foldRegion.setExpanded(true); } }; } } if (foldTask != null) foldingModel.runBatchFoldingOperation(foldTask); } private boolean getLastState(Presentation presentation) { Object rs = presentation.getClientProperty(SELECTED_PROPERTY); if (rs instanceof Boolean) return (Boolean)rs; return false; } }