package de.urszeidler.shr5.webserver.mgnt;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Collection;
import java.util.Enumeration;
import java.util.Iterator;
import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.beans.PojoObservables;
import org.eclipse.core.databinding.observable.map.IObservableMap;
import org.eclipse.core.databinding.observable.set.IObservableSet;
import org.eclipse.core.databinding.property.Properties;
import org.eclipse.jface.databinding.viewers.ObservableMapLabelProvider;
import org.eclipse.jface.databinding.viewers.ObservableSetContentProvider;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import de.urszeidler.shr5.webserver.Activator;
import de.urszeidler.shr5.webserver.preferences.PreferenceConstants;
public class ServerStatusDialog extends TitleAreaDialog {
private DataBindingContext m_bindingContext;
private Table table;
private ScriptViewerWrapper viewerWrapper;
private Collection<PlayerManager> registeredPlayers;
private TableViewer tableViewer;
/**
* Create the dialog.
*
* @param parentShell
*/
public ServerStatusDialog(Shell parentShell) {
super(parentShell);
viewerWrapper = Activator.getDefault().getScriptViewerWrapper();
if (viewerWrapper != null)
registeredPlayers = viewerWrapper.getRegisteredPlayers();
}
/**
* Create contents of the dialog.
*
* @param parent
*/
@Override
protected Control createDialogArea(Composite parent) {
Composite area = (Composite)super.createDialogArea(parent);
Composite container = new Composite(area, SWT.NONE);
container.setLayout(new GridLayout(1, false));
container.setLayoutData(new GridData(GridData.FILL_BOTH));
Group grpSetverState = new Group(container, SWT.NONE);
grpSetverState.setText("server state");
grpSetverState.setLayout(new GridLayout(1, false));
grpSetverState.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
Label lblNewLabel = new Label(grpSetverState, SWT.NONE);
Label lblServeriplabel = new Label(grpSetverState, SWT.NONE);
if (viewerWrapper == null)
lblNewLabel.setText("server not startet");
else {
lblNewLabel.setText("server startet");
try {
StringBuffer sb = new StringBuffer();
printIpUrls(sb);
lblServeriplabel.setText(sb.toString());
} catch (SocketException e) {
throw new RuntimeException(e);
}
}
Group grpConnectedPlayer = new Group(container, SWT.NONE);
grpConnectedPlayer.setLayout(new GridLayout(1, false));
grpConnectedPlayer.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, true, 1, 1));
grpConnectedPlayer.setText("connected player");
tableViewer = new TableViewer(grpConnectedPlayer, SWT.BORDER | SWT.FULL_SELECTION);
table = tableViewer.getTable();
table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
Composite composite = new Composite(grpConnectedPlayer, SWT.NONE);
composite.setLayout(new GridLayout(1, false));
composite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
final Button btnDisconnect = new Button(composite, SWT.NONE);
btnDisconnect.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
ISelection selection = tableViewer.getSelection();
if (selection instanceof IStructuredSelection) {
IStructuredSelection ss = (IStructuredSelection)selection;
// Iterator<?> iterator = ss.iterator();
for (Iterator<?> iter = ss.iterator(); iter.hasNext();) {
PlayerManager pm = (PlayerManager)iter.next();
viewerWrapper.removePlayer(pm);
}
tableViewer.refresh();
}
}
});
btnDisconnect.setText("disconnect");
tableViewer.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
btnDisconnect.setEnabled(!event.getSelection().isEmpty());
}
});
return area;
}
/**
* @param sb
* @throws SocketException
*/
private void printIpUrls(StringBuffer sb) throws SocketException {
IPreferenceStore store = Activator.getDefault().getPreferenceStore();
int port = store.getInt(PreferenceConstants.SERVER_PORT);
Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
while (interfaces.hasMoreElements()) {
NetworkInterface iface = interfaces.nextElement();
// filters out 127.0.0.1 and inactive interfaces
if (iface.isLoopback() || !iface.isUp())
continue;
Enumeration<InetAddress> addresses = iface.getInetAddresses();
while (addresses.hasMoreElements()) {
InetAddress addr = addresses.nextElement();
// filter out ip6
if (addr.getAddress().length > 4)
continue;
sb.append(iface.getDisplayName()).append(" ").append("http://").append(addr.getHostAddress()).append(":").append(port)
.append("/main");
sb.append("\n");
}
}
}
/**
* Create contents of the button bar.
*
* @param parent
*/
@Override
protected void createButtonsForButtonBar(Composite parent) {
createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
m_bindingContext = initDataBindings();
}
/**
* Return the initial size of the dialog.
*/
@Override
protected Point getInitialSize() {
return new Point(450, 392);
}
protected DataBindingContext initDataBindings() {
DataBindingContext bindingContext = new DataBindingContext();
if (viewerWrapper == null)
return bindingContext;
//
ObservableSetContentProvider listContentProvider = new ObservableSetContentProvider();
IObservableMap observeMap = PojoObservables.observeMap(listContentProvider.getKnownElements(), PlayerManager.class,
"character.character.persona.name");
tableViewer.setLabelProvider(new ObservableMapLabelProvider(observeMap));
tableViewer.setContentProvider(listContentProvider);
//
IObservableSet selfList = Properties.selfSet(PlayerManager.class).observe(registeredPlayers);
tableViewer.setInput(selfList);
//
// ObservableSetContentProvider setprovider = ObservableSetContentProvider
return bindingContext;
}
}