package com.aelitis.azureus.ui.swt.subscriptions; import java.util.Map; import org.eclipse.swt.SWT; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.events.KeyListener; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.FontData; import org.eclipse.swt.layout.FormAttachment; import org.eclipse.swt.layout.FormData; import org.eclipse.swt.layout.FormLayout; import org.eclipse.swt.widgets.*; import org.gudy.azureus2.core3.config.COConfigurationManager; import org.gudy.azureus2.core3.internat.MessageText; import org.gudy.azureus2.core3.util.ByteFormatter; import org.gudy.azureus2.core3.util.Constants; import org.gudy.azureus2.plugins.ui.UIPluginViewToolBarListener; import org.gudy.azureus2.plugins.ui.toolbar.UIToolBarItem; import org.gudy.azureus2.ui.swt.Messages; import org.gudy.azureus2.ui.swt.Utils; import org.gudy.azureus2.ui.swt.plugins.UISWTView; import org.gudy.azureus2.ui.swt.plugins.UISWTViewEvent; import org.gudy.azureus2.ui.swt.pluginsimpl.UISWTViewCoreEventListener; import org.gudy.azureus2.ui.swt.shells.MessageBoxShell; import org.gudy.azureus2.ui.swt.views.table.TableViewSWT; import org.gudy.azureus2.ui.swt.views.table.impl.TableViewFactory; import com.aelitis.azureus.core.subs.Subscription; import com.aelitis.azureus.core.subs.SubscriptionManagerFactory; import com.aelitis.azureus.core.subs.SubscriptionManagerListener; import com.aelitis.azureus.ui.UIFunctionsManager; import com.aelitis.azureus.ui.UserPrompterResultListener; import com.aelitis.azureus.ui.common.ToolBarItem; import com.aelitis.azureus.ui.common.table.*; import com.aelitis.azureus.ui.common.table.impl.TableColumnManager; import com.aelitis.azureus.ui.mdi.MultipleDocumentInterface; import com.aelitis.azureus.ui.selectedcontent.ISelectedContent; import com.aelitis.azureus.ui.selectedcontent.SelectedContentManager; import com.aelitis.azureus.ui.swt.columns.subscriptions.*; import com.aelitis.azureus.ui.swt.imageloader.ImageLoader; import com.aelitis.azureus.ui.swt.utils.ColorCache; public class SubscriptionsView implements SubscriptionManagerListener, UIPluginViewToolBarListener, UISWTViewCoreEventListener { private static final String TABLE_ID = "subscriptions"; private TableViewSWT view; private Composite viewComposite; private Font textFont1; private Font textFont2; private UISWTView swtView; public SubscriptionsView() { } /* (non-Javadoc) * @see com.aelitis.azureus.core.subs.SubscriptionManagerListener#associationsChanged(byte[]) */ public void associationsChanged(byte[] association_hash) { // TODO Auto-generated method stub } /* (non-Javadoc) * @see com.aelitis.azureus.core.subs.SubscriptionManagerListener#subscriptionSelected(com.aelitis.azureus.core.subs.Subscription) */ public void subscriptionSelected( Subscription subscription ) { } /* (non-Javadoc) * @see com.aelitis.azureus.core.subs.SubscriptionManagerListener#subscriptionAdded(com.aelitis.azureus.core.subs.Subscription) */ public void subscriptionAdded(Subscription subscription) { if ( subscription.isSubscribed()){ view.addDataSource(subscription); } } /* (non-Javadoc) * @see com.aelitis.azureus.core.subs.SubscriptionManagerListener#subscriptionRemoved(com.aelitis.azureus.core.subs.Subscription) */ public void subscriptionRemoved(Subscription subscription) { view.removeDataSource(subscription); } /* (non-Javadoc) * @see com.aelitis.azureus.core.subs.SubscriptionManagerListener#subscriptionChanged(com.aelitis.azureus.core.subs.Subscription) */ public void subscriptionChanged(Subscription subscription) { if ( !subscription.isSubscribed()){ subscriptionRemoved(subscription); }else if ( view.getRow(subscription) == null ){ subscriptionAdded( subscription ); }else{ view.refreshTable(true); } } /* (non-Javadoc) * @see org.gudy.azureus2.plugins.ui.UIPluginViewToolBarListener#refreshToolBarItems(java.util.Map) */ public void refreshToolBarItems(Map<String, Long> list) { if ( view == null ){ return; // can happen on first selection it seems } int numRows = view.getSelectedRowsSize(); list.put("remove", numRows > 0 ? UIToolBarItem.STATE_ENABLED : 0); list.put("share", numRows == 1 ? UIToolBarItem.STATE_ENABLED : 0); } /* (non-Javadoc) * @see org.gudy.azureus2.plugins.ui.toolbar.UIToolBarActivationListener#toolBarItemActivated(com.aelitis.azureus.ui.common.ToolBarItem, long, java.lang.Object) */ public boolean toolBarItemActivated(ToolBarItem item, long activationType, Object datasource) { if("remove".equals(item.getID()) ) { removeSelected(); return true; } return false; } private void removeSelected() { TableRowCore[] rows = view.getSelectedRows(); Subscription[] subs = new Subscription[rows.length]; int i = 0; for (Subscription subscription : subs) { subs[i] = (Subscription) rows[i++].getDataSource(); } removeSubs(subs, 0); } private void removeSubs(final Subscription[] toRemove, final int startIndex) { if (toRemove == null || startIndex >= toRemove.length) { return; } if (toRemove[startIndex] == null) { int nextIndex = startIndex + 1; if (nextIndex < toRemove.length) { removeSubs(toRemove, nextIndex); } return; } MessageBoxShell mb = new MessageBoxShell( MessageText.getString("message.confirm.delete.title"), MessageText.getString("message.confirm.delete.text", new String[] { toRemove[startIndex].getName() })); if (startIndex == toRemove.length - 1) { mb.setButtons(0, new String[] { MessageText.getString("Button.yes"), MessageText.getString("Button.no"), }, new Integer[] { 0, 1 }); } else { mb.setButtons(1, new String[] { MessageText.getString("Button.removeAll"), MessageText.getString("Button.yes"), MessageText.getString("Button.no"), }, new Integer[] { 2, 0, 1 }); } mb.open(new UserPrompterResultListener() { public void prompterClosed(int result) { if (result == 0) { toRemove[startIndex].setSubscribed( false ); } else if (result == 2) { for (int i = startIndex; i < toRemove.length; i++) { if (toRemove[i] != null) { toRemove[i].setSubscribed( false ); } } return; } int nextIndex = startIndex + 1; if (nextIndex < toRemove.length) { removeSubs(toRemove, nextIndex); } } }); } private void delete() { if (viewComposite != null && !viewComposite.isDisposed()) { viewComposite.dispose(); } if(textFont1 != null && ! textFont1.isDisposed()) { textFont1.dispose(); } if(textFont2 != null && ! textFont2.isDisposed()) { textFont2.dispose(); } } private Composite getComposite() { return viewComposite; } private String getFullTitle() { return MessageText.getString("subscriptions.overview"); } private void initialize(Composite parent) { viewComposite = new Composite(parent,SWT.NONE); viewComposite.setLayout(new FormLayout()); TableColumnCore[] columns = new TableColumnCore[] { new ColumnSubscriptionNew(TABLE_ID), new ColumnSubscriptionName(TABLE_ID), new ColumnSubscriptionNbNewResults(TABLE_ID), new ColumnSubscriptionNbResults(TABLE_ID), new ColumnSubscriptionLastChecked(TABLE_ID), new ColumnSubscriptionSubscribers(TABLE_ID), new ColumnSubscriptionAutoDownload(TABLE_ID), new ColumnSubscriptionCategory(TABLE_ID), new ColumnSubscriptionTag(TABLE_ID), }; TableColumnManager tcm = TableColumnManager.getInstance(); tcm.setDefaultColumnNames(TABLE_ID, new String[] { ColumnSubscriptionNew.COLUMN_ID, ColumnSubscriptionName.COLUMN_ID, ColumnSubscriptionNbNewResults.COLUMN_ID, ColumnSubscriptionNbResults.COLUMN_ID, ColumnSubscriptionAutoDownload.COLUMN_ID, }); view = TableViewFactory.createTableViewSWT(Subscription.class, TABLE_ID, TABLE_ID, columns, "name", SWT.SINGLE | SWT.FULL_SELECTION | SWT.VIRTUAL); view.addLifeCycleListener(new TableLifeCycleListener() { public void tableViewInitialized() { SubscriptionManagerFactory.getSingleton().addListener( SubscriptionsView.this ); view.addDataSources(SubscriptionManagerFactory.getSingleton().getSubscriptions( true )); } public void tableViewDestroyed() { SubscriptionManagerFactory.getSingleton().removeListener( SubscriptionsView.this ); } }); view.addSelectionListener(new TableSelectionAdapter() { public void defaultSelected(TableRowCore[] rows, int stateMask) { if(rows.length == 1) { TableRowCore row = rows[0]; Subscription sub = (Subscription) row.getDataSource(); if(sub != null) { String key = "Subscription_" + ByteFormatter.encodeString(sub.getPublicKey()); MultipleDocumentInterface mdi = UIFunctionsManager.getUIFunctions().getMDI(); if (mdi != null) { mdi.showEntryByID(key); } } } } public void selected(TableRowCore[] rows) { ISelectedContent[] sels = new ISelectedContent[rows.length]; for (int i=0;i<rows.length;i++){ sels[i] = new SubscriptionSelectedContent((Subscription)rows[i].getDataSource()); } SelectedContentManager.changeCurrentlySelectedContent(view.getTableID(), sels, view); } }, false) ; view.addKeyListener(new KeyListener() { public void keyPressed(KeyEvent event) { } public void keyReleased(KeyEvent event) { if(event.keyCode == SWT.DEL) { removeSelected(); } } }); view.setRowDefaultHeight(20); view.initialize(viewComposite); final Composite composite = new Composite(viewComposite,SWT.BORDER); composite.setBackgroundMode(SWT.INHERIT_DEFAULT); composite.setBackground(ColorCache.getColor(composite.getDisplay(), "#F1F9F8")); Font font = composite.getFont(); FontData fDatas[] = font.getFontData(); for(int i = 0 ; i < fDatas.length ; i++) { fDatas[i].setHeight(150 * fDatas[i].getHeight() / 100); if(Constants.isWindows) { fDatas[i].setStyle(SWT.BOLD); } } textFont1 = new Font(composite.getDisplay(),fDatas); fDatas = font.getFontData(); for(int i = 0 ; i < fDatas.length ; i++) { fDatas[i].setHeight(120 * fDatas[i].getHeight() / 100); } textFont2 = new Font(composite.getDisplay(),fDatas); Label preText = new Label(composite,SWT.NONE); preText.setForeground(ColorCache.getColor(composite.getDisplay(), "#6D6F6E")); preText.setFont(textFont1); preText.setText(MessageText.getString("subscriptions.view.help.1")); Label image = new Label(composite,SWT.NONE); ImageLoader.getInstance().setLabelImage(image, "btn_rss_add"); Link postText = new Link(composite,SWT.NONE); postText.setForeground(ColorCache.getColor(composite.getDisplay(), "#6D6F6E")); postText.setFont(textFont2); postText.setText(MessageText.getString("subscriptions.view.help.2")); postText.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { if(event.text != null && ( event.text.startsWith("http://") || event.text.startsWith("https://") ) ) { Utils.launch(event.text); } } }); Label close = new Label(composite,SWT.NONE); ImageLoader.getInstance().setLabelImage(close, "image.dismissX"); close.setCursor(composite.getDisplay().getSystemCursor(SWT.CURSOR_HAND)); close.addListener(SWT.MouseUp, new Listener() { public void handleEvent(Event arg0) { COConfigurationManager.setParameter("subscriptions.view.showhelp", false); composite.setVisible(false); FormData data = (FormData) view.getComposite().getLayoutData(); data.bottom = new FormAttachment(100,0); viewComposite.layout(true); } }); FormLayout layout = new FormLayout(); composite.setLayout(layout); FormData data; data = new FormData(); data.left = new FormAttachment(0,15); data.top = new FormAttachment(0,20); data.bottom = new FormAttachment(postText,-5); preText.setLayoutData(data); data = new FormData(); data.left = new FormAttachment(preText,5); data.top = new FormAttachment(preText,0,SWT.CENTER); image.setLayoutData(data); data = new FormData(); data.left = new FormAttachment(preText,0,SWT.LEFT); //data.top = new FormAttachment(preText,5); data.bottom = new FormAttachment(100,-20); postText.setLayoutData(data); data = new FormData(); data.right = new FormAttachment(100,-10); data.top = new FormAttachment(0,10); close.setLayoutData(data); data = new FormData(); data.left = new FormAttachment(0,0); data.right = new FormAttachment(100,0); data.top = new FormAttachment(0,0); data.bottom = new FormAttachment(composite,0); viewComposite.setLayoutData(data); data = new FormData(); data.left = new FormAttachment(0,0); data.right = new FormAttachment(100,0); data.bottom = new FormAttachment(100,0); composite.setLayoutData(data); COConfigurationManager.setBooleanDefault("subscriptions.view.showhelp", true); if(!COConfigurationManager.getBooleanParameter("subscriptions.view.showhelp")) { composite.setVisible(false); data = (FormData) viewComposite.getLayoutData(); data.bottom = new FormAttachment(100,0); viewComposite.layout(true); } } private void refresh() { if ( view != null ){ view.refreshTable(false); } } public boolean eventOccurred(UISWTViewEvent event) { switch (event.getType()) { case UISWTViewEvent.TYPE_CREATE: swtView = (UISWTView)event.getData(); swtView.setTitle(getFullTitle()); break; case UISWTViewEvent.TYPE_DESTROY: delete(); break; case UISWTViewEvent.TYPE_INITIALIZE: initialize((Composite)event.getData()); break; case UISWTViewEvent.TYPE_LANGUAGEUPDATE: Messages.updateLanguageForControl(getComposite()); swtView.setTitle(getFullTitle()); break; case UISWTViewEvent.TYPE_DATASOURCE_CHANGED: //dataSourceChanged(event.getData()); break; case UISWTViewEvent.TYPE_FOCUSGAINED: break; case UISWTViewEvent.TYPE_REFRESH: refresh(); break; } return true; } }