package eu.jucy.gui.favuser;
import java.util.Arrays;
import java.util.HashSet;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.ExpandBar;
import org.eclipse.swt.widgets.ExpandItem;
import org.eclipse.swt.widgets.Table;
import eu.jucy.gui.ApplicationWorkbenchWindowAdvisor;
import eu.jucy.gui.GUIPI;
import eu.jucy.gui.UCEditor;
import eu.jucy.gui.UserColumns.HubName;
import eu.jucy.gui.UserColumns.LastSeen;
import eu.jucy.gui.UserColumns.Nick;
import eu.jucy.gui.UserColumns.SlotUntil;
import eu.jucy.gui.favuser.FavUsersColumns.FUNick;
import eu.jucy.gui.texteditor.hub.HubEditor;
import uc.IUser;
import uc.IUserChangedListener;
import uc.user.Population;
import uihelpers.SUIJob;
import uihelpers.SelectionProviderIntermediate;
import uihelpers.TableViewerAdministrator;
public class FavUserEditor extends UCEditor implements IUserChangedListener {
public static final String ID = "eu.jucy.gui.favuser";
private CheckboxTableViewer tableViewerFav;
private TableViewerAdministrator<IUser> tvaFav;
private TableViewer tableViewerSlot;
private TableViewerAdministrator<IUser> tvaSlot;
private final Population pop;
public FavUserEditor() {
pop = ApplicationWorkbenchWindowAdvisor.get().getPopulation();
}
private final SelectionProviderIntermediate spi = new SelectionProviderIntermediate();
public void createPartControl(Composite parent) {
parent.setLayout(new FillLayout());
ExpandBar bar = new ExpandBar (parent, SWT.V_SCROLL);
Table table = new Table(bar,SWT.CHECK | SWT.SINGLE|SWT.FULL_SELECTION |SWT.HIDE_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL | SWT.HIDE_SELECTION );
table.setHeaderVisible(true);
tableViewerFav = new CheckboxTableViewer( table );
spi.addViewer(tableViewerFav);
tvaFav = new TableViewerAdministrator<IUser>(tableViewerFav,
Arrays.asList(new FUNick(tableViewerFav),new HubName(),new LastSeen(),new SlotUntil()),
GUIPI.favUsersTable,TableViewerAdministrator.NoSorting);
tvaFav.apply();
tableViewerFav.setContentProvider(new FavUserProvider(true));
Table table2 = new Table(bar, SWT.SINGLE|SWT.FULL_SELECTION |SWT.HIDE_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL | SWT.HIDE_SELECTION );
table2.setHeaderVisible(true);
tableViewerSlot = new TableViewer( table2 );
tvaSlot = new TableViewerAdministrator<IUser>(tableViewerSlot,
Arrays.asList(new Nick(),new HubName(),new LastSeen(),new SlotUntil()),
GUIPI.favUsersSlotTable,TableViewerAdministrator.NoSorting);
tvaSlot.apply();
tableViewerSlot.setContentProvider(new FavUserProvider(false));
spi.addViewer(tableViewerSlot);
createContextPopup(HubEditor.ID,tableViewerFav);
createContextPopup(HubEditor.ID, tableViewerSlot);
pop.registerUserChangedListener(this);
tableViewerFav.setInput(pop);
tableViewerSlot.setInput(pop);
ExpandItem item0 = new ExpandItem (bar, SWT.NONE, 0);
item0.setText("Fav Users");
item0.setHeight(Math.max(table.computeSize(SWT.DEFAULT, SWT.DEFAULT).y,250));
item0.setControl(table);
item0.setExpanded(true);
ExpandItem item1 = new ExpandItem (bar, SWT.NONE, 1);
item1.setText("Slots Granted");
item1.setHeight(Math.max(table2.computeSize(SWT.DEFAULT, SWT.DEFAULT).y,250));
item1.setControl(table2);
item1.setExpanded(true);
getSite().setSelectionProvider(spi);
setControlsForFontAndColour(tableViewerFav.getTable());
}
public void setFocus() {
tableViewerFav.getControl().setFocus();
}
/**
* updates fav users that have changed..
*/
public void changed(final UserChangeEvent uce) {
IUser changed = uce.getChanged();
if (uce.isFavUserOrSlotGrantEvent() || changed.isFavUser() || changed.hasCurrentlyAutogrant()) {
new SUIJob(tableViewerFav.getTable()) {
@Override
public void run() {
IUser changed = uce.getChanged();
switch(uce.getDetail()) {
case UserChangeEvent.FAVUSER_ADDED:
tableViewerFav.add(changed);
if (changed.hasCurrentlyAutogrant()) {
tableViewerSlot.remove(uce.getChanged());
}
break;
case UserChangeEvent.SLOT_GRANTED:
if (changed.isFavUser()) {
tableViewerFav.refresh(changed);
} else {
tableViewerSlot.add(changed);
}
break;
case UserChangeEvent.FAVUSER_REMOVED:
tableViewerFav.remove(changed);
if (changed.hasCurrentlyAutogrant()) {
tableViewerSlot.add(changed);
}
break;
case UserChangeEvent.SLOTGRANT_REVOKED:
if (changed.isFavUser()) {
tableViewerFav.refresh(changed);
} else {
tableViewerSlot.remove(changed);
}
break;
default:
if (changed.isFavUser()) {
tableViewerFav.refresh(changed);
} else if (changed.hasCurrentlyAutogrant()) {
tableViewerSlot.refresh(changed);
}
}
}
}.schedule();
}
}
/*
public void update(Observable o, Object arg) {
StatusObject so = (StatusObject)arg;
switch(so.getType()) {
case ADDED:
tableViewer.add(so.getValue());
break;
case REMOVED:
tableViewer.remove(so.getValue());
break;
}
} */
public void dispose() {
// pop.deleteObserver(this);
pop.unregisterUserChangedListener(this);
// for (UserActions aua: actions) {
// aua.dispose();
// }
super.dispose();
}
public static class FavUserProvider implements IStructuredContentProvider {
private final boolean fav;
/**
* if true this will provide favusers..
* if false users with slotgrants..
* @param fav
*/
public FavUserProvider(boolean fav) {
this.fav = fav;
}
public void dispose() {}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {}
public Object[] getElements(Object inputElement) {
Population pop = (Population)inputElement;
if (fav) {
return pop.getFavUsers().toArray();
} else {
HashSet<IUser> u = new HashSet<IUser>(pop.getSlotGranted());
u.removeAll(pop.getFavUsers());
return u.toArray();
}
}
}
}