package com.github.xsavikx.androidscreencast.app;
import com.github.xsavikx.androidscreencast.configuration.ApplicationConfiguration;
import com.github.xsavikx.androidscreencast.exception.AndroidScreenCastRuntimeException;
import com.github.xsavikx.androidscreencast.ui.JDialogError;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.swing.*;
import java.io.PrintWriter;
import java.io.StringWriter;
import static com.github.xsavikx.androidscreencast.configuration.ApplicationConfigurationProperty.APP_NATIVE_LOOK;
public abstract class SwingApplication extends GUIApplication {
private static final Logger LOGGER = LoggerFactory.getLogger(DeviceChooserApplication.class);
private static final String SYNC_TREE_UI = "SynthTreeUI";
protected final ApplicationConfiguration applicationConfiguration;
private JDialogError jd = null;
protected SwingApplication(final ApplicationConfiguration applicationConfiguration) {
this.applicationConfiguration = applicationConfiguration;
}
private boolean useNativeLook() {
return Boolean.valueOf(applicationConfiguration.getProperty(APP_NATIVE_LOOK));
}
@Override
public void init() {
try {
if (useNativeLook())
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception ex) {
throw new AndroidScreenCastRuntimeException(ex);
}
}
@Override
public void handleException(final Thread thread, final Throwable ex) {
try {
final StringWriter sw = new StringWriter();
ex.printStackTrace(new PrintWriter(sw));
if (sw.toString().contains(SYNC_TREE_UI))
return;
LOGGER.error(ex.getClass().getSimpleName(), ex);
if (jd != null && jd.isVisible())
return;
jd = new JDialogError(ex);
SwingUtilities.invokeLater(() -> {
jd.setVisible(true);
});
} catch (Exception e) {
LOGGER.warn("Exception occurred during exception handling.", e);
}
}
}