/* * Created on 27-Apr-2004 * Created by Olivier Chalouhi * Copyright (C) 2004, 2005, 2006 Aelitis, All Rights Reserved. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * AELITIS, SAS au capital de 46,603.30 euros * 8 Allee Lenotre, La Grille Royale, 78600 Le Mesnil le Roi, France. * */ package org.gudy.azureus2.ui.swt.pluginsimpl; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.StyledText; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; 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.*; import org.gudy.azureus2.core3.util.AERunnable; import org.gudy.azureus2.plugins.ui.components.UIPropertyChangeEvent; import org.gudy.azureus2.plugins.ui.components.UIPropertyChangeListener; import org.gudy.azureus2.plugins.ui.model.BasicPluginViewModel; import org.gudy.azureus2.ui.swt.Messages; import org.gudy.azureus2.ui.swt.components.BufferedLabel; import org.gudy.azureus2.ui.swt.mainwindow.Colors; import org.gudy.azureus2.ui.swt.plugins.UISWTView; import org.gudy.azureus2.ui.swt.plugins.UISWTViewEvent; import org.gudy.azureus2.ui.swt.plugins.UISWTViewEventListener; import com.aelitis.azureus.ui.UIFunctions; import com.aelitis.azureus.ui.UIFunctionsManager; /** * */ public class BasicPluginViewImpl implements UISWTViewEventListener, UIPropertyChangeListener { BasicPluginViewModel model; //GUI elements Display display; Composite panel; ProgressBar progress; BufferedLabel status; BufferedLabel task; StyledText log; Pattern inclusionFilter; Pattern exclusionFilter; boolean paused; boolean isCreated; public BasicPluginViewImpl( BasicPluginViewModel model) { this.model = model; isCreated = false; } public BasicPluginViewModel getModel() { return( model ); } public boolean eventOccurred(UISWTViewEvent event) { switch (event.getType()) { case UISWTViewEvent.TYPE_CREATE: { if (isCreated) return false; isCreated = true; UISWTView swtView = event.getView(); if (swtView != null) { swtView.setTitle(model.getName()); } break; } case UISWTViewEvent.TYPE_INITIALIZE: { initialize((Composite)event.getData()); UISWTView swtView = event.getView(); if (swtView != null) { swtView.setTitle(model.getName()); } break; } case UISWTViewEvent.TYPE_REFRESH: refresh(); break; case UISWTViewEvent.TYPE_DESTROY: delete(); isCreated = false; break; case UISWTViewEvent.TYPE_FOCUSGAINED: String text = model.getLogArea().getText().trim(); if (log != null && !log.isDisposed()) { log.setText( text); log.setTopIndex(log.getLineCount()); } break; case UISWTViewEvent.TYPE_FOCUSLOST: if (log != null && !log.isDisposed()) { log.setText(""); } break; } return true; } private void initialize(Composite composite) { GridData gridData; GridLayout gridLayout; String sConfigSectionID = model.getConfigSectionID(); this.display = composite.getDisplay(); panel = new Composite(composite,SWT.NULL); gridLayout = new GridLayout(); gridLayout.numColumns = 2; panel.setLayout(gridLayout); gridData = new GridData(GridData.FILL_BOTH); panel.setLayoutData(gridData); /* * Status : [Status Text] * Current Task : [Task Text] * Progress : [||||||||||----------] * Log : * [ * * * ] */ Composite topSection = new Composite(panel, SWT.NONE); gridLayout = new GridLayout(); gridLayout.numColumns = 2; gridLayout.marginHeight = 0; gridLayout.marginWidth = 0; topSection.setLayout(gridLayout); gridData = new GridData(GridData.FILL_HORIZONTAL); if (sConfigSectionID == null){ gridData.horizontalSpan = 2; } topSection.setLayoutData(gridData); if(model.getStatus().getVisible()) { Label statusTitle = new Label(topSection,SWT.NULL); Messages.setLanguageText(statusTitle,"plugins.basicview.status"); status = new BufferedLabel(topSection,SWT.NULL); gridData = new GridData(GridData.FILL_HORIZONTAL); status.setLayoutData(gridData); } if(model.getActivity().getVisible()) { Label activityTitle = new Label(topSection,SWT.NULL); Messages.setLanguageText(activityTitle,"plugins.basicview.activity"); task = new BufferedLabel(topSection,SWT.NULL); gridData = new GridData(GridData.FILL_HORIZONTAL); task.setLayoutData(gridData); } if(model.getProgress().getVisible()) { Label progressTitle = new Label(topSection,SWT.NULL); Messages.setLanguageText(progressTitle,"plugins.basicview.progress"); progress = new ProgressBar(topSection,SWT.NULL); progress.setMaximum(100); progress.setMinimum(0); gridData = new GridData(GridData.FILL_HORIZONTAL); progress.setLayoutData(gridData); } if (sConfigSectionID != null) { Composite configSection = new Composite(panel, SWT.NONE); gridLayout = new GridLayout(); gridLayout.numColumns = 1; gridLayout.marginHeight = 0; gridLayout.marginWidth = 2; configSection.setLayout(gridLayout); gridData = new GridData(GridData.END | GridData.VERTICAL_ALIGN_END ); configSection.setLayoutData(gridData); //Label padding = new Label(configSection,SWT.NULL); //gridData = new GridData(GridData.FILL_HORIZONTAL); //padding.setLayoutData(gridData); Button btnConfig = new Button(configSection, SWT.PUSH); Messages.setLanguageText(btnConfig, "plugins.basicview.config"); btnConfig.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { UIFunctions uiFunctions = UIFunctionsManager.getUIFunctions(); if (uiFunctions != null) { uiFunctions.openView(UIFunctions.VIEW_CONFIG, model.getConfigSectionID()); } } }); btnConfig.setLayoutData(new GridData()); } if(model.getLogArea().getVisible()) { Label logTitle = new Label(topSection,SWT.NULL); Messages.setLanguageText(logTitle,"plugins.basicview.log"); // gridData = new GridData(GridData.FILL_HORIZONTAL); // gridData.horizontalSpan = 1; // logTitle.setLayoutData(gridData); Button button = new Button( topSection, SWT.PUSH ); Messages.setLanguageText(button,"plugins.basicview.clear"); button.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { model.getLogArea().setText(""); }}); log = new StyledText(panel,SWT.READ_ONLY | SWT.V_SCROLL | SWT.H_SCROLL | SWT.BORDER); gridData = new GridData(GridData.FILL_BOTH); gridData.horizontalSpan = 2; log.setLayoutData(gridData); //String text = model.getLogArea().getText().trim(); //log.setText( text); //log.setTopIndex(log.getLineCount()); model.getLogArea().addPropertyChangeListener(this); Composite bottomSection = new Composite(panel, SWT.NONE); gridLayout = new GridLayout(); gridLayout.numColumns = 3; gridLayout.marginHeight = 0; gridLayout.marginWidth = 0; bottomSection.setLayout(gridLayout); gridData = new GridData(GridData.FILL_HORIZONTAL); gridData.horizontalSpan = 2; bottomSection.setLayoutData(gridData); // include Label label = new Label(bottomSection, SWT.NONE); label.setLayoutData(new GridData()); Messages.setLanguageText(label, "LoggerView.includeOnly"); final Text inclText = new Text(bottomSection, SWT.BORDER); gridData = new GridData(); gridData.widthHint = 200; inclText.setLayoutData(gridData); inclText.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { String newExpression = inclText.getText(); if (newExpression.length() == 0) inclusionFilter = null; else { try { inclusionFilter = Pattern.compile(newExpression, Pattern.CASE_INSENSITIVE); inclText.setBackground(null); } catch (PatternSyntaxException e1) { inclText.setBackground(Colors.colorErrorBG); } } } }); label = new Label(bottomSection, SWT.NONE); // exclude label = new Label(bottomSection, SWT.NONE); label.setLayoutData(new GridData()); Messages.setLanguageText(label, "LoggerView.excludeAll"); final Text exclText = new Text(bottomSection, SWT.BORDER); gridData = new GridData(); gridData.widthHint = 200; exclText.setLayoutData(gridData); exclText.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { String newExpression = exclText.getText(); if (newExpression.length() == 0) exclusionFilter = null; else { try { exclusionFilter = Pattern.compile(newExpression, Pattern.CASE_INSENSITIVE); exclText.setBackground(null); } catch (PatternSyntaxException e1) { exclText.setBackground(Colors.colorErrorBG); } } } }); label = new Label(bottomSection, SWT.NONE); // pause Button buttonPause = new Button(bottomSection, SWT.CHECK); Messages.setLanguageText(buttonPause, "LoggerView.pause"); gridData = new GridData(); buttonPause.setLayoutData(gridData); buttonPause.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { if (e.widget == null || !(e.widget instanceof Button)) return; Button btn = (Button) e.widget; paused = btn.getSelection(); } }); } } private void refresh() { if(status != null) { status.setText(model.getStatus().getText()); } if(task != null) { task.setText(model.getActivity().getText()); } if(progress != null) { progress.setSelection(model.getProgress().getPercentageComplete()); } } public void propertyChanged(final UIPropertyChangeEvent ev) { if(ev.getSource() != model.getLogArea()) return; if(display == null || display.isDisposed() || log == null || paused) return; display.asyncExec(new AERunnable(){ public void runSupport() { if(log.isDisposed()) return; if ( !log.isVisible()){ return; } String old_value = (String)ev.getOldPropertyValue(); String new_value = (String) ev.getNewPropertyValue(); ScrollBar bar = log.getVerticalBar(); boolean max = bar.getSelection() == bar.getMaximum() - bar.getThumb(); int lineOffset = log.getLineCount() - log.getTopIndex(); if ( new_value.startsWith( old_value )){ String toAppend = new_value.substring(old_value.length()); if(toAppend.length() == 0) return; StringBuffer builder = new StringBuffer(toAppend.length()); String[] lines = toAppend.split("\n"); for( int i=0;i<lines.length;i++){ String line = lines[i]; if((inclusionFilter != null && !inclusionFilter.matcher(line).find()) || (exclusionFilter != null && exclusionFilter.matcher(line).find())) continue; builder.append("\n"); builder.append(line); } log.append(builder.toString()); }else{ StringBuffer builder = new StringBuffer(new_value.length()); String[] lines = new_value.split("\n"); for( int i=0;i<lines.length;i++){ String line = lines[i]; if((inclusionFilter != null && !inclusionFilter.matcher(line).find()) || (exclusionFilter != null && exclusionFilter.matcher(line).find())) continue; if(line != lines[0]){ builder.append("\n"); } builder.append(line); } log.setText(builder.toString()); } if(max) { bar.setSelection(bar.getMaximum()-bar.getThumb()); log.setTopIndex(log.getLineCount()-lineOffset); log.redraw(); } } }); } private void delete() { model.getLogArea().removePropertyChangeListener( this ); } }