package copyto.paste.chat.ui;
import java.text.Collator;
import java.util.Comparator;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.dialogs.DialogSettings;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.StyledString;
import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider;
import org.eclipse.jface.viewers.StyledString.Styler;
import org.eclipse.swt.graphics.TextStyle;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.dialogs.FilteredItemsSelectionDialog;
import copyto.paste.chat.core.ChannelUser;
import copyto.paste.chat.core.ChatUser;
public abstract class FilteredParticipantsSelectionDialog extends
FilteredItemsSelectionDialog {
private static final String SETTINGS = FilteredParticipantsSelectionDialog.class
.getCanonicalName();
public FilteredParticipantsSelectionDialog(Shell shell) {
super(shell);
setDetailsLabelProvider(getDetailsLabelProvider());
setListLabelProvider(getListLabelProvider());
setInitialPattern("?");
}
@Override
protected Control createExtendedContentArea(Composite parent) {
/*Composite client = new Composite(parent, SWT.NULL);
GridLayoutFactory.fillDefaults().applyTo(client);
Label label = new Label(client, SWT.LEFT);
label.setText("Paste to channel" + ":");*/
return null;
}
@Override
protected IDialogSettings getDialogSettings() {
DialogSettings workbenchSettings = new DialogSettings("Workbench");
IDialogSettings settings = workbenchSettings.getSection(SETTINGS);
if (settings == null) {
settings = workbenchSettings.addNewSection(SETTINGS);
}
return settings;
}
@Override
protected IStatus validateItem(Object item) {
return Status.OK_STATUS;
}
class ParticipantsFilter extends ItemsFilter {
@Override
public boolean matchItem(Object item) {
return matches(((ChatUser) item).getName());
}
@Override
public boolean isConsistentItem(Object item) {
return true;
}
}
@Override
protected ItemsFilter createFilter() {
return new ParticipantsFilter();
}
@SuppressWarnings("rawtypes")
@Override
protected Comparator getItemsComparator() {
return new Comparator<ChatUser>() {
public int compare(ChatUser person1, ChatUser person2) {
if (person1 instanceof ChannelUser) {
return -1;
} else if (person2 instanceof ChannelUser) {
return 1;
}
Collator collator = Collator.getInstance();
return collator.compare(person1.getName(), person2.getName());
}
};
}
@Override
public String getElementName(Object item) {
return ((ChatUser) item).getName();
}
private class ParticpantLabelProvider extends LabelProvider implements
IStyledLabelProvider {
public StyledString getStyledText(Object element) {
StyledString result = new StyledString();
if (element instanceof ChatUser) {
ChatUser participant = (ChatUser) element;
if (participant instanceof ChannelUser) {
result.append("All users", new Styler() {
@Override
public void applyStyles(final TextStyle textStyle) {
textStyle.font = JFaceResources.getFontRegistry().getBold(
JFaceResources.DIALOG_FONT);
}
});
} else {
result.append(participant.getName());
}
result.append(" in " + participant.getRoom().getName(),
StyledString.QUALIFIER_STYLER);
}
return result;
}
@Override
public String getText(Object element) {
if (element instanceof ChatUser) {
ChatUser participant = (ChatUser) element;
return String.format("%s #%s", participant.getName(),
participant.getRoom().getName());
}
return super.getText(element);
}
}
private ILabelProvider getListLabelProvider() {
return new ParticpantLabelProvider();
}
private ILabelProvider getDetailsLabelProvider() {
return new LabelProvider() {
@Override
public String getText(Object element) {
if (element instanceof ChatUser) {
ChatUser participant = (ChatUser) element;
return String.format("Message URL to %s in channel %s",
participant.getName(), participant.getRoom()
.getName());
}
return super.getText(element);
}
};
}
}