Java tutorial
/* ***************************************************************************** *Copyright (c) 2008-2009 The Bioclipse Team and others. *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: * Ola Spjuth - core API and implementation *******************************************************************************/ package net.bioclipse.ui.prefs; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import net.bioclipse.ui.Activator; import org.apache.log4j.Logger; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.preference.PreferencePage; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; import org.eclipse.swt.events.MouseAdapter; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPreferencePage; import org.eclipse.ui.PlatformUI; import org.eclipse.swt.layout.FormLayout; import org.eclipse.swt.layout.FormData; import org.eclipse.swt.layout.FormAttachment; public class UpdateSitesPreferencePage extends PreferencePage implements IWorkbenchPreferencePage { //Init logger private static final Logger logger = Logger.getLogger(UpdateSitesPreferencePage.class.toString()); private static IPreferenceStore prefsStore = Activator.getDefault().getPreferenceStore(); private List<String[]> appList; // private CheckboxTableViewer checkboxTableViewer; private TableViewer checkboxTableViewer; private Button rememberButton; private Button openDialogButton; public UpdateSitesPreferencePage() { super(); } /** * The label provider for the table that displays 2 columns: name and URL * @author ola * */ class ApplicationsLabelProvider extends LabelProvider implements ITableLabelProvider { public Image getColumnImage(Object element, int columnIndex) { return null; } public String getColumnText(Object element, int index) { if (!(element instanceof String[])) return "Wrong type in column text"; String[] retList = (String[]) element; if (index == 0) { if (retList.length > 0) return retList[0]; else return "NA"; } else if (index == 1) { if (retList.length > 1) return retList[1]; else return "NA"; } else return "???"; } } class ApplicationsContentProvider implements IStructuredContentProvider { @SuppressWarnings("unchecked") public Object[] getElements(Object inputElement) { if (inputElement instanceof ArrayList) { ArrayList retList = (ArrayList) inputElement; return retList.toArray(); } return new Object[0]; } public void dispose() { } public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { } } public Control createContents(Composite parent) { Composite container = new Composite(parent, SWT.NULL); setSize(new Point(600, 420)); container.setSize(600, 420); container.setLayout(new FormLayout()); // checkboxTableViewer = CheckboxTableViewer.newCheckList(container, SWT.BORDER); checkboxTableViewer = new TableViewer(container, SWT.BORDER | SWT.SINGLE); checkboxTableViewer.setContentProvider(new ApplicationsContentProvider()); checkboxTableViewer.setLabelProvider(new ApplicationsLabelProvider()); final Table table = checkboxTableViewer.getTable(); FormData formData = new FormData(); formData.left = new FormAttachment(0, 11); formData.top = new FormAttachment(0, 10); table.setLayoutData(formData); table.setHeaderVisible(true); table.setLinesVisible(true); TableColumn tableColumn = new TableColumn(table, SWT.LEFT); tableColumn.setText("Name"); tableColumn.setWidth(180); TableColumn tableColumn2 = new TableColumn(table, SWT.LEFT); tableColumn2.setText("URL"); tableColumn2.setWidth(270); appList = getPreferencesFromStore(); checkboxTableViewer.setInput(appList); final Button addButton = new Button(container, SWT.NONE); formData.right = new FormAttachment(100, -89); FormData formData_1 = new FormData(); formData_1.right = new FormAttachment(100, -9); formData_1.left = new FormAttachment(table, 6); addButton.setLayoutData(formData_1); addButton.setText("Add"); addButton.addMouseListener(new MouseAdapter() { public void mouseUp(MouseEvent e) { UpdateSitesEditDialog dlg = new UpdateSitesEditDialog(getShell()); dlg.open(); String[] ret = dlg.getUpdateSites(); if (ret.length == 2) { appList.add(ret); checkboxTableViewer.refresh(); } } }); final Button editButton = new Button(container, SWT.NONE); FormData formData_2 = new FormData(); formData_2.top = new FormAttachment(table, 0, SWT.TOP); formData_2.left = new FormAttachment(table, 6); formData_2.right = new FormAttachment(100, -9); editButton.setLayoutData(formData_2); editButton.setText("Edit"); editButton.addMouseListener(new MouseAdapter() { public void mouseUp(MouseEvent e) { //Get selection from viewer ISelection sel = checkboxTableViewer.getSelection(); if (!(sel instanceof IStructuredSelection)) { logger.debug("Item of wrong type selected."); showMessage("Please select an entry to edit first."); return; } IStructuredSelection ssel = (IStructuredSelection) sel; Object obj = ssel.getFirstElement(); if (!(obj instanceof String[])) { logger.debug("Object of wrong type selected."); showMessage("Please select an entry to edit first."); return; } String[] chosen = (String[]) obj; // logger.debug("(:) " + chosen[0]); UpdateSitesEditDialog dlg = new UpdateSitesEditDialog(getShell(), chosen[0], chosen[1]); dlg.open(); String[] ret = dlg.getUpdateSites(); //If OK pressed if (dlg.getReturnCode() == 0) { if (ret.length == 2) { chosen[0] = ret[0]; //ext chosen[1] = ret[1]; //url checkboxTableViewer.refresh(); } else { logger.debug("Error getting result from dialog!"); showMessage("Error getting result from dialog."); } } } }); final Button removeButton = new Button(container, SWT.NONE); formData_1.top = new FormAttachment(removeButton, 6); FormData formData_3 = new FormData(); formData_3.right = new FormAttachment(100, -9); formData_3.left = new FormAttachment(table, 6); formData_3.top = new FormAttachment(0, 46); removeButton.setLayoutData(formData_3); removeButton.setText("Remove"); removeButton.addMouseListener(new MouseAdapter() { public void mouseUp(MouseEvent e) { //Get selection from viewer if (checkboxTableViewer.getSelection() instanceof IStructuredSelection) { IStructuredSelection selection = (IStructuredSelection) checkboxTableViewer.getSelection(); Object[] objSelection = selection.toArray(); for (int i = 0; i < objSelection.length; i++) { if (objSelection[i] instanceof String[]) { String[] row = (String[]) objSelection[i]; if (appList.contains(row)) { appList.remove(row); } } } checkboxTableViewer.refresh(); } } }); //Add remember button rememberButton = new Button(container, SWT.CHECK); formData.bottom = new FormAttachment(rememberButton, -6); FormData formData_4 = new FormData(); formData_4.left = new FormAttachment(0, 10); rememberButton.setLayoutData(formData_4); rememberButton.setText("Run automatic updates on startup"); //Add remember button openDialogButton = new Button(container, SWT.CHECK); formData_4.bottom = new FormAttachment(openDialogButton, -6); FormData formData_5 = new FormData(); formData_5.bottom = new FormAttachment(100, -10); formData_5.left = new FormAttachment(0, 10); openDialogButton.setLayoutData(formData_5); openDialogButton.setText("Install automatic updates in background"); //Sync with preference boolean skipUpdate = prefsStore.getBoolean(IPreferenceConstants.SKIP_UPDATE_ON_STARTUP); // boolean skipUpdate=Activator.getDefault().getDialogSettings().getBoolean( // net.bioclipse.ui.dialogs.IDialogConstants.SKIP_UPDATE_ON_STARTUP ); boolean skipDialog = prefsStore.getBoolean(IPreferenceConstants.SKIP_UPDATE_DIALOG_ON_STARTUP); // boolean skipDialog=Activator.getDefault().getDialogSettings().getBoolean( // net.bioclipse.ui.dialogs.IDialogConstants.SKIP_UPDATE_DIALOG_ON_STARTUP ); logger.debug("Preference said SKIP_UPDATE_ON_STARTUP: " + skipUpdate); logger.debug("Preference said SKIP_UPDATE_DIALOG_ON_STARTUP: " + skipDialog); //Meaning is inverted rememberButton.setSelection(!skipUpdate); //Meaning is not inverted here :) openDialogButton.setSelection(skipDialog); if (table.getItemCount() > 0) table.setSelection(0); container.pack(); parent.pack(); return container; } public void init(IWorkbench workbench) { setPreferenceStore(Activator.getDefault().getPreferenceStore()); } /** * Override to store results */ public boolean performOk() { String value = convertToPreferenceString(appList); logger.debug("Update sites prefs to store: " + value); prefsStore.setValue(IPreferenceConstants.UPDATE_SITES, value); //Save remember auto updates from checkbox boolean skipUpdate = rememberButton.getSelection(); prefsStore.setValue(IPreferenceConstants.SKIP_UPDATE_ON_STARTUP, !skipUpdate); logger.debug("Stored checkbox SKIP_UPDATE_ON_STARTUP=" + !skipUpdate); //Save remember OPEN DIALOG from checkbox boolean skipDialog = openDialogButton.getSelection(); prefsStore.setValue(IPreferenceConstants.SKIP_UPDATE_DIALOG_ON_STARTUP, skipDialog); logger.debug("Stored checkbox SKIP_UPDATE_DIALOG_ON_STARTUP=" + skipDialog); //Save prefs as this must be done explicitly Activator.getDefault().savePluginPreferences(); // Activator.getDefault().getDialogSettings().put( // net.bioclipse.ui.dialogs.IDialogConstants.SKIP_UPDATE_ON_STARTUP, // !skipUpdate ); // Activator.getDefault().getDialogSettings().put( // net.bioclipse.ui.dialogs.IDialogConstants.SKIP_UPDATE_DIALOG_ON_STARTUP, // skipDialog ); return true; } /** * @return List<String[]> containing the preferences * */ public static List<String[]> getPreferencesFromStore() { String entireString = prefsStore.getString(IPreferenceConstants.UPDATE_SITES); return convertPreferenceStringToArraylist(entireString); } /** * @return List<String[]> containing the default preferences * */ public static List<String[]> getDefaultPreferencesFromStore() { String entireString = prefsStore.getDefaultString(IPreferenceConstants.UPDATE_SITES); return convertPreferenceStringToArraylist(entireString); } /** * Converts input to arraylist using delimiters from BioclipseConstants * @param entireString * @return */ public static List<String[]> convertPreferenceStringToArraylist(String entireString) { List<String[]> myList = new ArrayList<String[]>(); // logger.debug("prefs read from store: " + entireString); String[] ret = entireString.split(IPreferenceConstants.PREFERENCES_OBJECT_DELIMITER); String[] partString = new String[0]; for (int i = 0; i < ret.length; i++) { partString = ret[i].split(IPreferenceConstants.PREFERENCES_DELIMITER); myList.add(partString); } if (ret.length == 1) { if (partString.length < 2) { //We should only have "" in string[] logger.debug("UpdateSite prefs is not in correct format, hence cleared"); myList.clear(); // myList.add(new String[]{"",""}); } } return myList; } /** * * * @param appList2 * @return */ private String convertToPreferenceString(List<String[]> appList2) { Iterator<String[]> it = appList2.iterator(); String ret = ""; // TODO: update to handle short and empty strings while (it.hasNext()) { String[] str = (String[]) it.next(); String singleRet = ""; for (int i = 0; i < str.length; i++) { singleRet = singleRet + str[i]; if ((i + 1) < str.length) { // there is another column singleRet += IPreferenceConstants.PREFERENCES_DELIMITER; } } ret = ret + singleRet; if (it.hasNext()) { // there is another row ret += IPreferenceConstants.PREFERENCES_OBJECT_DELIMITER; } } return ret; } protected void performDefaults() { super.performDefaults(); appList = getDefaultPreferencesFromStore(); checkboxTableViewer.setInput(appList); } private void showMessage(String message) { MessageDialog.openInformation(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "Update Sites Message", message); } }