RSS news reader; initially copied from "all the news"
[phpeclipse.git] / archive / net.sourceforge.phpeclipse.news / src / net / sourceforge / phpeclipse / news / pref / SiteListEditor.java
diff --git a/archive/net.sourceforge.phpeclipse.news/src/net/sourceforge/phpeclipse/news/pref/SiteListEditor.java b/archive/net.sourceforge.phpeclipse.news/src/net/sourceforge/phpeclipse/news/pref/SiteListEditor.java
new file mode 100644 (file)
index 0000000..afcd485
--- /dev/null
@@ -0,0 +1,442 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2003 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials 
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Jérôme Nègre    - adaptation of ListEditor to add the search button
+ *******************************************************************************/
+package net.sourceforge.phpeclipse.news.pref;
+
+import java.util.ArrayList;
+
+import net.sourceforge.phpeclipse.news.Channel;
+import net.sourceforge.phpeclipse.news.Plugin;
+import net.sourceforge.phpeclipse.news.search.SearchDialog;
+
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.InputDialog;
+import org.eclipse.jface.preference.FieldEditor;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.util.Assert;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+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.List;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Widget;
+
+public class SiteListEditor extends FieldEditor {
+       /**
+        * The list widget; <code>null</code> if none
+        * (before creation or after disposal).
+        */
+       private List list;
+       private ArrayList channels;
+       /**
+        * The button box containing the Add, Remove, Up, and Down buttons;
+        * <code>null</code> if none (before creation or after disposal).
+        */
+       private Composite buttonBox;
+       /**
+        * The Add button.
+        */
+       private Button addButton;
+       /**
+        * The Search button.
+        */
+       private Button searchButton;
+       /**
+        * The Remove button.
+        */
+       private Button removeButton;
+       /**
+        * The Up button.
+        */
+       private Button upButton;
+       /**
+        * The Down button.
+        */
+       private Button downButton;
+       /**
+        * The selection listener.
+        */
+       private SelectionListener selectionListener;
+       /**
+        * Notifies that the Add button has been pressed.
+        */
+       private void addPressed() {
+               setPresentsDefaultValue(false);
+               Channel input = getNewInputChannel();
+               if (input != null) {
+                       int index = list.getSelectionIndex();
+                       if (index >= 0) {
+                               list.add(input.getTitle(), index + 1);
+                               channels.add(index + 1, input);
+                       } else {
+                               list.add(input.getTitle(), 0);
+                               channels.add(0, input);
+                       }
+                       selectionChanged();
+               }
+       }
+
+       /**
+        * Notifies that the Search button has been pressed.
+        */
+       private void searchPressed() {
+               setPresentsDefaultValue(false);
+               SearchDialog sd = new SearchDialog(SiteListEditor.this
+                               .getShell());
+               sd.open();
+               Channel[] inputs = sd.getChannels();
+               for(int i=0; i<inputs.length; i++) {
+                       int index = list.getSelectionIndex();
+                       if (index >= 0) {
+                               list.add(inputs[i].getTitle(), index + 1);
+                               channels.add(index + 1, inputs[i]);
+                       } else {
+                               list.add(inputs[i].getTitle(), 0);
+                               channels.add(0, inputs[i]);
+                       }
+               }
+               selectionChanged();
+       }
+
+       
+       /* (non-Javadoc)
+        * Method declared on FieldEditor.
+        */
+       protected void adjustForNumColumns(int numColumns) {
+               Control control = getLabelControl();
+               ((GridData) control.getLayoutData()).horizontalSpan = numColumns;
+               ((GridData) list.getLayoutData()).horizontalSpan = numColumns - 1;
+       }
+       /**
+        * Creates the Add, Remove, Up, and Down button in the given button box.
+        *
+        * @param buttonBox the box for the buttons
+        */
+       private void createButtons(Composite buttonBox) {
+               addButton = createPushButton(buttonBox, "ListEditor.add");//$NON-NLS-1$
+               //TODO use my bundle ?
+               searchButton = createPushButton(buttonBox, "Search (experimental)");
+               removeButton = createPushButton(buttonBox, "ListEditor.remove");//$NON-NLS-1$
+               upButton = createPushButton(buttonBox, "ListEditor.up");//$NON-NLS-1$
+               downButton = createPushButton(buttonBox, "ListEditor.down");//$NON-NLS-1$
+       }
+       /**
+        * Helper method to create a push button.
+        * 
+        * @param parent the parent control
+        * @param key the resource name used to supply the button's label text
+        */
+       private Button createPushButton(Composite parent, String key) {
+               Button button = new Button(parent, SWT.PUSH);
+               button.setText(JFaceResources.getString(key));
+               button.setFont(parent.getFont());
+               GridData data = new GridData(GridData.FILL_HORIZONTAL);
+               data.heightHint = convertVerticalDLUsToPixels(button,
+                               IDialogConstants.BUTTON_HEIGHT);
+               int widthHint = convertHorizontalDLUsToPixels(button,
+                               IDialogConstants.BUTTON_WIDTH);
+               data.widthHint = Math.max(widthHint, button.computeSize(SWT.DEFAULT,
+                               SWT.DEFAULT, true).x);
+               button.setLayoutData(data);
+               button.addSelectionListener(getSelectionListener());
+               return button;
+       }
+       /**
+        * Creates a selection listener.
+        */
+       public void createSelectionListener() {
+               selectionListener = new SelectionAdapter() {
+                       public void widgetSelected(SelectionEvent event) {
+                               Widget widget = event.widget;
+                               if (widget == addButton) {
+                                       addPressed();
+                               } else if (widget == searchButton) {
+                                       searchPressed();
+                               } else if (widget == removeButton) {
+                                       removePressed();
+                               } else if (widget == upButton) {
+                                       upPressed();
+                               } else if (widget == downButton) {
+                                       downPressed();
+                               } else if (widget == list) {
+                                       selectionChanged();
+                               }
+                       }
+               };
+       }
+       /* (non-Javadoc)
+        * Method declared on FieldEditor.
+        */
+       protected void doFillIntoGrid(Composite parent, int numColumns) {
+               Control control = getLabelControl(parent);
+               GridData gd = new GridData();
+               gd.horizontalSpan = numColumns;
+               control.setLayoutData(gd);
+               list = getListControl(parent);
+               gd = new GridData(GridData.FILL_HORIZONTAL);
+               gd.verticalAlignment = GridData.FILL;
+               gd.horizontalSpan = numColumns - 1;
+               gd.grabExcessHorizontalSpace = true;
+               list.setLayoutData(gd);
+               buttonBox = getButtonBoxControl(parent);
+               gd = new GridData();
+               gd.verticalAlignment = GridData.BEGINNING;
+               buttonBox.setLayoutData(gd);
+       }
+       /* (non-Javadoc)
+        * Method declared on FieldEditor.
+        */
+       protected void doLoad() {
+               if (list != null) {
+                       channels = ChannelStore.getChannels();
+                       for (int i = 0; i < channels.size(); i++) {
+                               list.add(((Channel)channels.get(i)).getTitle());
+                       }
+               }
+       }
+       /* (non-Javadoc)
+        * Method declared on FieldEditor.
+        */
+       protected void doLoadDefault() {
+               if (list != null) {
+                       list.removeAll();
+                       channels = ChannelStore.getDefaultChannels();
+                       for (int i = 0; i < channels.size(); i++) {
+                               list.add(((Channel)channels.get(i)).getTitle());
+                       }
+                       setPresentsDefaultValue(false);
+               }
+       }
+       /* (non-Javadoc)
+        * Method declared on FieldEditor.
+        */
+       protected void doStore() {
+               ChannelStore.saveReadStatus(Plugin.getDefault().getChannelList());
+               ChannelStore.setChannels(channels);
+               Plugin.getDefault().updateChannelList();
+       }
+       /**
+        * Notifies that the Down button has been pressed.
+        */
+       private void downPressed() {
+               swap(false);
+       }
+       /**
+        * Returns this field editor's button box containing the Add, Remove,
+        * Up, and Down button.
+        *
+        * @param parent the parent control
+        * @return the button box
+        */
+       public Composite getButtonBoxControl(Composite parent) {
+               if (buttonBox == null) {
+                       buttonBox = new Composite(parent, SWT.NULL);
+                       GridLayout layout = new GridLayout();
+                       layout.marginWidth = 0;
+                       buttonBox.setLayout(layout);
+                       createButtons(buttonBox);
+                       buttonBox.addDisposeListener(new DisposeListener() {
+                               public void widgetDisposed(DisposeEvent event) {
+                                       addButton = null;
+                                       searchButton = null;
+                                       removeButton = null;
+                                       upButton = null;
+                                       downButton = null;
+                                       buttonBox = null;
+                               }
+                       });
+               } else {
+                       checkParent(buttonBox, parent);
+               }
+               selectionChanged();
+               return buttonBox;
+       }
+       /**
+        * Returns this field editor's list control.
+        *
+        * @param parent the parent control
+        * @return the list control
+        */
+       public List getListControl(Composite parent) {
+               if (list == null) {
+                       list = new List(parent, SWT.BORDER | SWT.SINGLE | SWT.V_SCROLL
+                                       | SWT.H_SCROLL);
+                       list.setFont(parent.getFont());
+                       list.addSelectionListener(getSelectionListener());
+                       list.addDisposeListener(new DisposeListener() {
+                               public void widgetDisposed(DisposeEvent event) {
+                                       list = null;
+                               }
+                       });
+               } else {
+                       checkParent(list, parent);
+               }
+               return list;
+       }
+       /* (non-Javadoc)
+        * Method declared on FieldEditor.
+        */
+       public int getNumberOfControls() {
+               return 2;
+       }
+       /**
+        * Returns this field editor's selection listener.
+        * The listener is created if nessessary.
+        *
+        * @return the selection listener
+        */
+       private SelectionListener getSelectionListener() {
+               if (selectionListener == null)
+                       createSelectionListener();
+               return selectionListener;
+       }
+       /**
+        * Returns this field editor's shell.
+        * <p>
+        * This method is internal to the framework; subclassers should not call
+        * this method.
+        * </p>
+        *
+        * @return the shell
+        */
+       protected Shell getShell() {
+               if (addButton == null)
+                       return null;
+               return addButton.getShell();
+       }
+       /**
+        * Notifies that the Remove button has been pressed.
+        */
+       private void removePressed() {
+               setPresentsDefaultValue(false);
+               int index = list.getSelectionIndex();
+               if (index >= 0) {
+                       list.remove(index);
+                       channels.remove(index);
+                       selectionChanged();
+               }
+       }
+       /**
+        * Notifies that the list selection has changed.
+        */
+       private void selectionChanged() {
+               int index = list.getSelectionIndex();
+               int size = list.getItemCount();
+               removeButton.setEnabled(index >= 0);
+               upButton.setEnabled(size > 1 && index > 0);
+               downButton.setEnabled(size > 1 && index >= 0 && index < size - 1);
+       }
+       /* (non-Javadoc)
+        * Method declared on FieldEditor.
+        */
+       public void setFocus() {
+               if (list != null) {
+                       list.setFocus();
+               }
+       }
+       /**
+        * Moves the currently selected item up or down.
+        *
+        * @param up <code>true</code> if the item should move up,
+        *  and <code>false</code> if it should move down
+        */
+       private void swap(boolean up) {
+               setPresentsDefaultValue(false);
+               int index = list.getSelectionIndex();
+               int target = up ? index - 1 : index + 1;
+               if (index >= 0) {
+                       //list widget
+                       String[] selection = list.getSelection();
+                       Assert.isTrue(selection.length == 1);
+                       list.remove(index);
+                       list.add(selection[0], target);
+                       list.setSelection(target);
+                       //channels arrayList
+                       Object obj = channels.remove(index);
+                       channels.add(target, obj);
+               }
+               selectionChanged();
+       }
+       /**
+        * Notifies that the Up button has been pressed.
+        */
+       private void upPressed() {
+               swap(true);
+       }
+       /*
+        * @see FieldEditor.setEnabled(boolean,Composite).
+        */
+       public void setEnabled(boolean enabled, Composite parent) {
+               super.setEnabled(enabled, parent);
+               getListControl(parent).setEnabled(enabled);
+               addButton.setEnabled(enabled);
+               removeButton.setEnabled(enabled);
+               upButton.setEnabled(enabled);
+               downButton.setEnabled(enabled);
+       }
+
+       /*
+        * 
+        * 
+        * 
+        * 
+        * 
+        * 
+        * 
+        * 
+        * 
+        * 
+        * 
+        * 
+        * 
+        */
+       
+       /**
+        * Creates a site list field editor.
+        * 
+        * @param name the name of the preference this field editor works on
+        * @param labelText the label text of the field editor
+        * @param parent the parent of the field editor's control
+        */
+       protected SiteListEditor(String name, String labelText, Composite parent) {
+               init(name, labelText);
+               createControl(parent);
+       }
+       /**
+        * Creates and returns a new item for the list.
+        *
+        * @return a new item
+        */
+       protected Channel getNewInputChannel() {
+               InputDialog dialog;
+               dialog = new InputDialog(this.getShell(), "All The News",
+                               "Enter new site name", "", null);
+               dialog.open();
+               if ("".equals(dialog.getValue()) || dialog.getValue() == null)
+                       return null;
+               String title = dialog.getValue();
+               dialog = new InputDialog(this.getShell(), "All The News",
+                               "Enter new site URL", "", null);
+               dialog.open();
+               if ("".equals(dialog.getValue()) || dialog.getValue() == null)
+                       return null;
+               String url = dialog.getValue();
+               return new Channel(title, url);
+       }
+}
\ No newline at end of file