// Copyright (c) 2003-2005 by Leif Frenzel - see http://leiffrenzel.de
package net.sf.eclipsefp.haskell.hugs.ui.preferences;
import java.io.*;
import net.sf.eclipsefp.common.ui.dialog.ExecutableDialogField;
import net.sf.eclipsefp.common.ui.dialog.IDialogFieldListener;
import net.sf.eclipsefp.common.ui.preferences.Tab;
import net.sf.eclipsefp.haskell.hugs.core.preferences.IHugsPreferenceNames;
import net.sf.eclipsefp.haskell.util.PlatformUtil;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
/** <p>The tab on the HUGS preference page that displays general
* information.</p>
*
* @author Leif Frenzel
*/
public class GeneralTab extends Tab implements IHugsPreferenceNames {
private ExecutableDialogField dlgField;
public GeneralTab( final IPreferenceStore store ) {
super( store );
}
// interface methods of Tab
///////////////////////////
@Override
public Control createControl( final Composite parent ) {
String labelText = UITexts.prefs_name;
dlgField = new ExecutableDialogField( parent,
labelText ){
@Override
protected String createDisplayContent( final String info ) {
try {
File f=new File(info);
if (f.exists() && f.canRead()){
ProcessBuilder pb=new ProcessBuilder( info );
Process p=pb.start();
//Runtime.getRuntime().exec(info);
InputStream is=p.getInputStream();
// read all text given by the console till the Hugs> prompt
// this rely on the > at the prompt
int r=is.read();
while (((char)r)!='>' && r>-1){
r=is.read();
}
// read first space
is.read();
try (OutputStream os=p.getOutputStream()) {
// write version command
os.write((":version"+PlatformUtil.NL).getBytes());
os.flush();
StringBuffer sb=new StringBuffer();
r=is.read();
// read everything till the first line return
while (((char)r)!='\n' && ((char)r)!='\r' && r>-1){
sb.append((char)r);
r=is.read();
}
// read the rest
while (is.available()>0){
is.read();
}
// quit
os.write((":quit"+PlatformUtil.NL).getBytes());
os.flush();
is.close();
// the version, usually starting with --
String version=sb.toString();
if (version.startsWith("--")){
version=version.substring(2).trim();
}
return version;
}
}
return UITexts.prefs_notfound;
} catch (IOException ioe){
ioe.printStackTrace();
return ioe.getMessage();
}
}
};
dlgField.setInfo( getPreferenceStore().getString( EXECUTABLE_NAME ) );
dlgField.addDialogFieldListener( new IDialogFieldListener() {
@Override
public void infoChanged( final Object newInfo ) {
getPreferenceStore().setValue( EXECUTABLE_NAME, ( String )newInfo );
}
} );
return dlgField;
}
@Override
public void propertyChange( final PropertyChangeEvent event ) {
dlgField.setInfo( getPreferenceStore().getString( EXECUTABLE_NAME ) );
}
}