package intrace.ecl.ui.output;
import intrace.ecl.Activator;
import intrace.ecl.Util;
import intrace.ecl.ui.launching.InTraceLaunchConfigTab;
import intrace.ecl.ui.output.EditorInput.InputType;
import java.net.Socket;
import java.util.List;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.jface.resource.ColorRegistry;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.internal.IWorkbenchThemeConstants;
import org.eclipse.ui.part.EditorPart;
import org.eclipse.ui.themes.ITheme;
import org.intrace.client.gui.helper.Connection.ConnectState;
import org.intrace.client.gui.helper.InTraceUI;
import org.intrace.client.gui.helper.InTraceUI.ConfigDataInterface;
import org.intrace.client.gui.helper.InTraceUI.ConfigDataInterface.Callback;
import org.intrace.client.gui.helper.InTraceUI.IConnectionStateCallback;
import org.intrace.client.gui.helper.InTraceUI.UIMode;
import org.intrace.client.gui.helper.InTraceUI.UIModeData;
import org.intrace.client.gui.helper.TraceFilterThread;
@SuppressWarnings("restriction")
public class InTraceEditor extends EditorPart
{
private InTraceUI inTraceUI;
private EditorInput intraceInput;
public InTraceEditor()
{
// Do nothing
}
public static UIModeData getUIModeData()
{
IWorkbench workBench = PlatformUI.getWorkbench();
ITheme theme = workBench.getThemeManager().getCurrentTheme();
ColorRegistry colreg = theme.getColorRegistry();
Color activec1 = colreg.get(IWorkbenchThemeConstants.ACTIVE_TAB_BG_START);
Color activec2 = colreg.get(IWorkbenchThemeConstants.ACTIVE_TAB_BG_END);
Color inactivec1 = colreg.get(IWorkbenchThemeConstants.INACTIVE_TAB_BG_START);
Color inactivec2 = colreg.get(IWorkbenchThemeConstants.INACTIVE_TAB_BG_END);
UIModeData data = new UIModeData(activec1, activec2,
inactivec1, inactivec2);
return data;
}
@SuppressWarnings("unchecked")
@Override
public void createPartControl(final Composite parent)
{
Composite ui = new Composite(parent, SWT.NONE);
UIModeData data = getUIModeData();
intraceInput = (EditorInput)getEditorInput();
final ILaunchConfiguration config = intraceInput.callback.configuration;
String classIncludePattern = null;
String classExcludePattern = null;
List<String> outputIncludePattern = null;
List<String> outputExcludePattern = null;
if (intraceInput.type == InputType.NEWCONNECTION)
{
try
{
// Only apply class patterns for a new connection as the agent will remember them
// for an existing connection.
classIncludePattern = config.getAttribute(InTraceLaunchConfigTab.CLASS_INCL_ATTR, "");
classExcludePattern = config.getAttribute(InTraceLaunchConfigTab.CLASS_EXCL_ATTR, "");
}
catch (CoreException e)
{
Activator.getDefault().getLog().log(Util.createErrorStatus("Error", e));
}
}
try
{
outputIncludePattern = config.getAttribute(InTraceLaunchConfigTab.OUTPUT_INCL_ATTR, TraceFilterThread.MATCH_ALL);
outputExcludePattern = config.getAttribute(InTraceLaunchConfigTab.OUTPUT_EXCL_ATTR, TraceFilterThread.MATCH_NONE);
}
catch (CoreException e)
{
Activator.getDefault().getLog().log(Util.createErrorStatus("Error", e));
}
Callback cb = new Callback()
{
@Override
public void setClassConfig(String classIncludePattern,
String classExcludePattern)
{
try
{
ILaunchConfigurationWorkingCopy wc = config.getWorkingCopy();
wc.setAttribute(InTraceLaunchConfigTab.CLASS_INCL_ATTR, classIncludePattern);
wc.setAttribute(InTraceLaunchConfigTab.CLASS_EXCL_ATTR, classExcludePattern);
wc.doSave();
}
catch (CoreException e)
{
Activator.getDefault().getLog().log(Util.createErrorStatus("Error", e));
}
}
@Override
public void setOutputConfig(List<String> outputIncludePattern,
List<String> outputExcludePattern)
{
try
{
ILaunchConfigurationWorkingCopy wc = config.getWorkingCopy();
wc.setAttribute(InTraceLaunchConfigTab.OUTPUT_INCL_ATTR, outputIncludePattern);
wc.setAttribute(InTraceLaunchConfigTab.OUTPUT_EXCL_ATTR, outputExcludePattern);
wc.doSave();
}
catch (CoreException e)
{
Activator.getDefault().getLog().log(Util.createErrorStatus("Error", e));
}
}
};
ConfigDataInterface configInterface = new ConfigDataInterface(classIncludePattern,
classExcludePattern,
outputIncludePattern,
outputExcludePattern,
cb);
IWorkbench workbench = PlatformUI.getWorkbench();
final Display display = workbench.getDisplay();
Shell window = display.getActiveShell();
inTraceUI = new InTraceUI(window, ui, UIMode.ECLIPSE, data, configInterface);
inTraceUI.setConnCallback(new IConnectionStateCallback()
{
@Override
public void setConnectionState(final ConnectState state)
{
if (!parent.isDisposed())
{
display.syncExec(new Runnable()
{
@Override
public void run()
{
setPartName("InTrace: " + state.str);
}
});
}
}
});
inTraceUI.setConnectionState(ConnectState.CONNECTING);
if (intraceInput.type == InputType.NEWCONNECTION)
{
new Thread(new Runnable()
{
@Override
public void run()
{
try
{
Socket connection = intraceInput.callback.getClientConnection();
inTraceUI.setFixedLocalConnection(connection);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}).start();
}
else
{
inTraceUI.setFixedLocalConnection(intraceInput.callback.agentServerPort);
}
intraceInput.callback.setEditor(this);
}
@Override
public void init(IEditorSite site,
IEditorInput input)
throws PartInitException
{
setSite(site);
setInput(input);
}
@Override
public void dispose()
{
if (intraceInput != null)
{
intraceInput.callback.setEditor(null);
}
if (inTraceUI != null)
{
inTraceUI.dispose();
}
super.dispose();
}
@Override
public void setFocus()
{
// Do nothing
}
@Override
public void doSave(IProgressMonitor monitor)
{
// Do nothing
}
@Override
public void doSaveAs()
{
// Do nothing
}
@Override
public boolean isDirty()
{
return false;
}
@Override
public boolean isSaveAsAllowed()
{
return false;
}
}