package networkinggui;
import java.util.List;
import java.util.LinkedList;
import java.util.HashSet;
import java.net.URL;
import java.util.Map;
import java.awt.Component;
import java.awt.Dimension;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JFrame;
import javax.swing.UIManager;
import javax.swing.plaf.FontUIResource;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.awt.Font;
import com.buglabs.util.ui.IDesktopApp;
import com.buglabs.bug.module.lcd.pub.IModuleDisplay;
import com.buglabs.bug.networking.pub.INetworking;
import com.buglabs.util.osgi.LogServiceUtil;
import com.buglabs.util.osgi.ServiceTrackerUtil;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceRegistration;
import org.osgi.util.tracker.ServiceTracker;
import org.osgi.framework.ServiceReference;
import org.osgi.service.log.LogService;
import org.osgi.util.tracker.ServiceTrackerCustomizer;
import org.osgi.framework.Bundle;
public class Activator implements BundleActivator, IDesktopApp, WindowListener, ServiceTrackerCustomizer {
private static LogService logger = null;
private BundleContext context;
private ServiceRegistration sr;
private IModuleDisplay display;
private WifiAccessPointPicker wifiAccessPointPicker;
private NetworkSettingsEditor networkSettingsEditor;
private DeviceActivator deviceActivator;
private JFrame frame;
private INetworking networking;
private final String MENU_ITEMS[] = {};
private static final String [] services = {
IModuleDisplay.class.getName(),
INetworking.class.getName(),
};
private ServiceTracker serviceTracker;
public static void setUIFont (FontUIResource f) {
for (Object key : UIManager.getDefaults().keySet()) {
Object value = UIManager.get(key);
if (value instanceof javax.swing.plaf.FontUIResource) {
UIManager.put (key, f);
}
}
List lookAndFeelSettings = new LinkedList();
for (Object key : new HashSet(UIManager.getLookAndFeelDefaults().keySet())) {
Object value = UIManager.get(key);
if (value instanceof javax.swing.plaf.FontUIResource) {
lookAndFeelSettings.add(key);
}
}
for (Object key : lookAndFeelSettings) {
UIManager.put(key, f);
}
}
public Activator() {
super();
setUIFont(new FontUIResource("Liberation Sans", Font.BOLD, 12));
}
public void start(BundleContext ctx) throws Exception {
this.context = ctx;
logger = LogServiceUtil.getLogService(context);
Activator.logDebug("starting tracker");
serviceTracker = ServiceTrackerUtil.openServiceTracker(context, new ServiceTrackerUtil.ManagedInlineRunnable() {
@Override
public void run(Map<String, Object> services) {
display = (IModuleDisplay) services.get(IModuleDisplay.class.getName());
networking = (INetworking) services.get(INetworking.class.getName());
// Warning, this method will be called from within the same thread as the OSGi framework. Long running operations should be avoided here.
// Implement application here.
wifiAccessPointPicker = new WifiAccessPointPicker(networking, context);
networkSettingsEditor = new NetworkSettingsEditor(networking, context);
deviceActivator = new DeviceActivator(networking, context);
registerDesktopApp();
}
@Override
public void shutdown() {
unregisterDesktopApp();
}
}, services);
}
public void stop(BundleContext context) throws Exception {
if (sr != null) {
sr.unregister();
sr = null;
}
if (frame != null) {
frame.dispose();
frame = null;
}
}
public void click() {
Activator.logDebug("clicked on networking GUI icon");
showFullGUI();
}
private void showFullGUI() {
if (frame != null) {
frame.dispose();
}
JTabbedPane tp = new JTabbedPane();
tp.add("Wifi", wifiAccessPointPicker.getPanel());
tp.add("Config", networkSettingsEditor.getPanel());
tp.add("Enable", deviceActivator.getPanel());
JScrollPane scrollPane = new JScrollPane(tp);
scrollPane.getVerticalScrollBar().setPreferredSize(new Dimension(30, Integer.MAX_VALUE));
showFrame(scrollPane);
}
public URL getIcon(int width, int height, int depth) {
return context.getBundle().getResource("resources/icon.png");
}
public String[] getMenuItems() {
return MENU_ITEMS;
}
public void menuSelected(String item) {
}
private void showFrame(Component component) {
if (frame != null) {
frame.dispose();
}
frame = new JFrame();
// frame.setLayout(null);
frame.add(component);
frame.addWindowListener(this);
frame.pack();
frame.show();
}
public void windowActivated(WindowEvent arg0) {
}
public void windowClosed(WindowEvent arg0) {
}
public void windowClosing(WindowEvent arg0) {
if (frame != null) {
frame.dispose();
frame = null;
}
}
public void windowDeactivated(WindowEvent arg0) {
}
public void windowDeiconified(WindowEvent arg0) {
}
public void windowIconified(WindowEvent arg0) {
}
public void windowOpened(WindowEvent arg0) {
}
public IDesktopApp getDesktopApp() {
return this;
}
public void registerDesktopApp() {
if (sr == null) {
sr = context.registerService(IDesktopApp.class.getName(), this, null);
}
}
public void unregisterDesktopApp() {
if (sr != null) {
sr.unregister();
sr = null;
}
}
public BundleContext getContext() {
return context;
}
public Bundle getBundle() {
return context.getBundle();
}
public String getName() {
return "Example";
}
public Object addingService(ServiceReference reference) {
Object svc = context.getService(reference);
return svc;
}
public void modifiedService(ServiceReference reference, Object service) {
}
public void removedService(ServiceReference reference, Object service) {
if (sr != null) {
sr.unregister();
sr = null;
}
}
/**
* @return an instance of the LogService.
*/
public static LogService getLogger() {
return logger;
}
public static void log(int level, String msg) {
getLogger().log(level, msg);
}
public static void logError(String msg) {
log(LogService.LOG_ERROR, msg);
}
public static void logWarning(String msg) {
log(LogService.LOG_WARNING, msg);
}
public static void logDebug(String msg) {
log(LogService.LOG_INFO, msg);
}
public static void logInfo(String msg) {
log(LogService.LOG_INFO, msg);
}
}