/**
* Copyright (c) 2013 by JP Moresmau
* This code is made available under the terms of the Eclipse Public License,
* version 1.0 (EPL). See http://www.eclipse.org/legal/epl-v10.html
*/
package net.sf.eclipsefp.haskell.ui.internal.editors.haskell;
import net.sf.eclipsefp.haskell.ui.HaskellUIPlugin;
import net.sf.eclipsefp.haskell.ui.internal.preferences.editor.IEditorPreferenceNames;
import net.sf.eclipsefp.haskell.ui.internal.util.UITexts;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.text.IDocument;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IPartListener;
import org.eclipse.ui.IPartService;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.texteditor.AbstractDecoratedTextEditor;
import org.eclipse.ui.texteditor.IDocumentProvider;
/**
* run the tab checker as a part listener to avoid multiple activation of the editor, a single invocation, etc.
*
* @author JP Moresmau
*
*/
public class TabChecker implements IPartListener{
private final AbstractDecoratedTextEditor editor;
public TabChecker(final AbstractDecoratedTextEditor part){
this.editor=part;
IPartService service = (IPartService) editor.getSite().getService(IPartService.class);
service.addPartListener( this );
}
@Override
public void partActivated( final IWorkbenchPart part ) {
//NOOP
}
@Override
public void partBroughtToTop( final IWorkbenchPart part ) {
//NOOP
}
@Override
public void partClosed( final IWorkbenchPart part ) {
//NOOP
}
@Override
public void partDeactivated( final IWorkbenchPart part ) {
//NOOP
}
@Override
public void partOpened( final IWorkbenchPart part ) {
checkTabs( editor.getSite().getShell().getDisplay(), getDocument() );
IPartService service = (IPartService) editor.getSite().getService(IPartService.class);
service.removePartListener( this );
}
private IDocument getDocument() {
IDocumentProvider docProvider = editor.getDocumentProvider();
if (docProvider!=null){
return docProvider.getDocument( editor.getEditorInput() );
}
return null;
}
private static void checkTabs(final Display display,final IDocument doc){
if (doc!=null){
final String contents=doc.get();
if (contents!=null && contents.contains( "\t" )){
// we should not be in a job
if (MessageDialog.openConfirm( display.getActiveShell() , UITexts.error_tabs , UITexts.error_tabs_message )){
int tw=HaskellUIPlugin.getDefault().getPreferenceStore().getInt( IEditorPreferenceNames.EDITOR_TAB_WIDTH );
StringBuilder sb=new StringBuilder();
for (int a=0;a<tw;a++){
sb.append(" ");
}
String contents2=contents.replace( "\t",sb.toString() );
doc.set(contents2);
}
}
}
}
}