/*******************************************************************************
* Copyright (c) 2011 University Of Moratuwa
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Isuru Udana - UI Integration in the Workbench
*******************************************************************************/
package org.eclipse.ecf.salvo.ui.internal.wizards;
import java.util.ArrayList;
import org.eclipse.ecf.protocol.nntp.core.Debug;
import org.eclipse.ecf.protocol.nntp.core.ServerStoreFactory;
import org.eclipse.ecf.protocol.nntp.model.INewsgroup;
import org.eclipse.ecf.protocol.nntp.model.IServer;
import org.eclipse.ecf.protocol.nntp.model.NNTPException;
import org.eclipse.ecf.salvo.ui.external.provider.HookedNewsgroupProvider;
import org.eclipse.ecf.salvo.ui.external.provider.INewsGroupProvider;
import org.eclipse.ecf.salvo.ui.tools.ImageUtils;
import org.eclipse.ecf.salvo.ui.tools.PreferencesUtil;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.List;
import org.eclipse.swt.widgets.Text;
public class SelectNewsgroupWizardPage extends WizardPage {
private Composite container;
private List newsgroupList;
private Text searchBar;
private ArrayList<INewsgroup> subscribedNewsgroups;
private Button btnCheckPickSubscribed;
private Combo cboSuggestedNewgroups;
private INewsGroupProvider[] hookedNewsgroupProviders;
private Label lblSuggested;
public SelectNewsgroupWizardPage() {
super("Select Newsgroup");
setTitle("Select Newsgroup");
setDescription("Select the Newsgroup you want to ask the question");
initHookedNewsgroupsProviders();
fetchSubscribedNewsgroups();
setImageDescriptor(ImageUtils.getInstance().getImageDescriptor(
"selectnewsgroup.png"));
}
public void createControl(Composite parent) {
// Container
container = new Composite(parent, SWT.NULL);
container.setLayout(new GridLayout(1, false));
setControl(container);
if (isHookedNewsgroupsAvailable()) {
// Label Suggested
{
lblSuggested = new Label(container, SWT.NULL);
lblSuggested.setText("Suggested Newsgroups");
}
// Combobox of suggested newsgroups
{
cboSuggestedNewgroups = new Combo(container, SWT.READ_ONLY);
cboSuggestedNewgroups.setLayoutData(new GridData(SWT.FILL,
SWT.CENTER, true, false, 1, 1));
fillCboSuggestedNewsgroups();
cboSuggestedNewgroups.select(0);
}
}
if (isHookedNewsgroupsAvailable() && isSubscribedNewsgroupsAvailable()) {
// Checkbox
{
btnCheckPickSubscribed = new Button(container, SWT.CHECK);
btnCheckPickSubscribed
.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if (btnCheckPickSubscribed.getSelection()) {
cboSuggestedNewgroups.setEnabled(false);
lblSuggested.setEnabled(false);
newsgroupList.setEnabled(true);
searchBar.setEnabled(true);
} else {
cboSuggestedNewgroups.setEnabled(true);
lblSuggested.setEnabled(true);
newsgroupList.setEnabled(false);
searchBar.setEnabled(false);
searchBar.setText("");
setPageComplete(true);
}
}
});
btnCheckPickSubscribed
.setText("Pick from subscribed newsgroups");
}
}
if (isSubscribedNewsgroupsAvailable()) {
// Search bar
{
searchBar = new Text(container, SWT.BORDER);
searchBar.setLayoutData(new GridData(SWT.FILL, SWT.CENTER,
true, false, 1, 1));
searchBar.addKeyListener(new KeyAdapter() {
@Override
public void keyReleased(KeyEvent e) {
setFilteredListItems();
if (newsgroupList.getItemCount() == 0) {
setPageComplete(false);
} else {
setPageComplete(true);
}
}
});
}
// Newsgroup List
{
newsgroupList = new List(container, SWT.SINGLE | SWT.BORDER
| SWT.V_SCROLL);
newsgroupList.setLayoutData(new GridData(SWT.FILL, SWT.FILL,
true, true, 1, 1));
initNewsgroupList();
}
}
if (isHookedNewsgroupsAvailable() && isSubscribedNewsgroupsAvailable()) {
cboSuggestedNewgroups.setEnabled(true);
btnCheckPickSubscribed.setSelection(false);
newsgroupList.setEnabled(false);
searchBar.setEnabled(false);
}
// Page completeness
if (!isHookedNewsgroupsAvailable()
&& !isSubscribedNewsgroupsAvailable()) {
lblSuggested = new Label(container, SWT.NULL);
lblSuggested.setText("No Newsgroups available");
setPageComplete(false);
}
}
/**
* Fill CboSugesstedNewsgroups combo box
*/
private void fillCboSuggestedNewsgroups() {
for (INewsGroupProvider newsgroupProvider : hookedNewsgroupProviders) {
String newsgroupName = newsgroupProvider.getNewsgroupName();
String serverAddress = newsgroupProvider.getServerAddress();
String description = newsgroupProvider.getNewsgroupDescription();
cboSuggestedNewgroups.add(newsgroupName + " (Server: "
+ serverAddress + ") - " + description);
}
}
/**
* Initialize NewsgroupList for the first time with all the available
* newsgroups
*/
private void initNewsgroupList() {
// Load preferences
String recentlySelectedNewsgroup = PreferencesUtil.instance()
.loadPluginSettings("recentSelectedNewsgroup");
String recentlySelectedServer = PreferencesUtil.instance()
.loadPluginSettings("recentSelectedServer");
int selectionIndex = 0;
for (int i = 0, size = subscribedNewsgroups.size(); i < size; i++) {
String newsgroupName = subscribedNewsgroups.get(i)
.getNewsgroupName();
String serverAddress = subscribedNewsgroups.get(i).getServer()
.getAddress();
newsgroupList.add(newsgroupName + " (Server: " + serverAddress
+ ")");
// calculate the recently selected item from the list
if (newsgroupName.equals(recentlySelectedNewsgroup)
&& serverAddress.equals(recentlySelectedServer)) {
selectionIndex = i;
}
}
newsgroupList.select(selectionIndex);
}
/**
* Fill the newsgroupList according to the filter specified on the search
* bar
*/
private void setFilteredListItems() {
newsgroupList.removeAll();
for (INewsgroup newsgroup : subscribedNewsgroups) {
if (matchPattern(newsgroup.getNewsgroupName())) {
String newsgroupName = newsgroup.getNewsgroupName();
String serverAddress = newsgroup.getServer().getAddress();
newsgroupList.add(newsgroupName + " (Server: " + serverAddress
+ ")");
}
}
newsgroupList.select(0);
}
/**
* Match whether the given newsgroup is match with the filter.
*
* @param newsgroupName
* Name of the newsgroup
* @return whether the newsgroup is match with the filter
*/
private boolean matchPattern(String newsgroupName) {
String searchText = searchBar.getText();
if (newsgroupName.contains(searchText)) {
if (newsgroupName.startsWith(searchText)) {
return true;
} else if (newsgroupName.contains("." + searchText)) {
return true;
} else if (newsgroupName.contains("-" + searchText)) {
return true;
}
}
return false;
}
/**
* Get the selected Newsgroup from the list
*
* @return selected Newsgroup
*/
public INewsgroup getSelectedNewsgroup() {
INewsgroup resultNewsgroup = null;
if (isHookedNewsgroupsAvailable() && isSubscribedNewsgroupsAvailable()) {
if (btnCheckPickSubscribed.getSelection()) {
resultNewsgroup = getSelectedSubscribedNewsgroup();
} else {
resultNewsgroup = getSelectedHookedNewsgroup();
}
} else if (isHookedNewsgroupsAvailable()) {
resultNewsgroup = getSelectedHookedNewsgroup();
} else {
resultNewsgroup = getSelectedSubscribedNewsgroup();
}
return resultNewsgroup;
}
/**
* Get the selected hooked newsgroup
*/
private INewsgroup getSelectedHookedNewsgroup() {
INewsgroup resultNewsgroup = null;
INewsGroupProvider provider = hookedNewsgroupProviders[cboSuggestedNewgroups
.getSelectionIndex()];
if (!HookedNewsgroupProvider.instance().isServerSubscribed(provider)) {
if (provider.initCredentials()) {
resultNewsgroup = HookedNewsgroupProvider.instance()
.getNewsgroup(provider);
}
} else {
resultNewsgroup = HookedNewsgroupProvider.instance().getNewsgroup(
provider);
}
return resultNewsgroup;
}
/**
* Get the selected subscribed newsgroup
*/
private INewsgroup getSelectedSubscribedNewsgroup() {
INewsgroup resultNewsgroup = null;
try {
String selectedNewsgroupString = newsgroupList.getItem(
newsgroupList.getSelectionIndex()).replace(")", "");
String selectedNewsgroup = selectedNewsgroupString.split("\\(")[0]
.trim();
String selectedServer = selectedNewsgroupString.split("\\(")[1]
.replace("Server: ", "").trim();
for (INewsgroup newsgroup : subscribedNewsgroups) {
if (newsgroup.getNewsgroupName().equals(selectedNewsgroup)
&& newsgroup.getServer().getAddress()
.equals(selectedServer)) {
resultNewsgroup = newsgroup;
}
}
} catch (Exception e) {
// No newsgroups
}
return resultNewsgroup;
}
/**
* Fetch all subscribed newsgroups from the store
*/
private void fetchSubscribedNewsgroups() {
subscribedNewsgroups = new ArrayList<INewsgroup>();
try {
for (IServer server : ServerStoreFactory.instance()
.getServerStoreFacade().getFirstStore().getServers()) {
INewsgroup[] groups = ServerStoreFactory.instance()
.getServerStoreFacade().getSubscribedNewsgroups(server);
for (INewsgroup group : groups) {
if (!subscribedNewsgroups.contains(group)) {
subscribedNewsgroups.add(group);
}
}
}
} catch (NNTPException e) {
Debug.log(this.getClass(), e);
}
}
/**
* initialize hooked newsgroup providers
*/
private void initHookedNewsgroupsProviders() {
hookedNewsgroupProviders = HookedNewsgroupProvider.instance()
.getProviders();
}
/**
* check whether subscribed newsgroups available
*/
private boolean isSubscribedNewsgroupsAvailable() {
if (subscribedNewsgroups.size() == 0) {
return false;
}
return true;
}
/**
* check whether hooked newsgroups available
*/
private boolean isHookedNewsgroupsAvailable() {
if (hookedNewsgroupProviders.length == 0) {
return false;
}
return true;
}
}