package edu.isistan.sadanalyzer.pages; import org.eclipse.jface.action.Action; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ListViewer; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.StyleRange; import org.eclipse.swt.custom.StyledText; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.List; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorReference; import org.eclipse.ui.IEditorSite; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.forms.IManagedForm; import org.eclipse.ui.forms.editor.FormEditor; import org.eclipse.ui.forms.editor.FormPage; import org.eclipse.ui.forms.events.ExpansionAdapter; import org.eclipse.ui.forms.events.ExpansionEvent; import org.eclipse.ui.forms.widgets.ColumnLayout; import org.eclipse.ui.forms.widgets.FormText; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.ScrolledForm; import org.eclipse.ui.forms.widgets.Section; import org.eclipse.ui.part.EditorPart; import org.eclipse.wb.swt.ResourceManager; import edu.isistan.sadanalyzer.editor.Messages; import edu.isistan.sadanalyzer.editor.SadAnalyzerEditor; import edu.isistan.sadanalyzer.model.CrosscuttingConcern; import edu.isistan.sadanalyzer.model.Impact; import edu.isistan.sadanalyzer.model.impl.CrosscuttingConcernImpl; import edu.isistan.sadanalyzer.providers.CrosscuttingConcernLabelProvider; import edu.isistan.sadanalyzer.providers.SadSectionLabelProvider; import edu.isistan.sadanalyzer.query.UIMASADQueryAdapter; import edu.isistan.uima.unified.typesystems.nlp.Sentence; import edu.isistan.uima.unified.typesystems.sad.SadSection; import edu.isistan.uima.unified.typesystems.sad.impl.SadSectionImpl; public class SadAnalyzerViewerPage extends FormPage { public static final String ID = "edu.isistan.sadanalyzer.pages.SadAnalyzerViewerPage"; public static final String TITLE = Messages.SadAnalyzerEditor_Viewer; private ListViewer listViewerSectionsSelected; private java.util.List listQualityAttributesSelected; private List attributes; private List sections; private ListViewer listSections; private ListViewer listAttributes; private SadSection sadSection; private CrosscuttingConcern crossCutting; private StyledText styledText; private int occurrences; private Label labelOccurrences; private Label labelImage; private Composite compositeLabel; private FormText formText; private UIMASADQueryAdapter uimaRoot; public SadAnalyzerViewerPage(){ super(ID, TITLE); } public SadAnalyzerViewerPage(FormEditor editor) { super(editor, ID, TITLE); } public SadAnalyzerViewerPage(FormEditor editor, ListViewer listViewerSectionsSelected, java.util.List listQualityAttributesSelected) { super(editor, ID, TITLE); this.listViewerSectionsSelected = listViewerSectionsSelected; this.listQualityAttributesSelected=listQualityAttributesSelected; uimaRoot = ((SadAnalyzerEditor)getEditor()).getUimaRoot(); occurrences = 0; } /** * @see org.eclipse.ui.forms.editor.FormPage#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput) */ @Override public void init(IEditorSite site, IEditorInput input) { super.init(site, input); } /** * Create contents of the form. * @param managedForm */ @Override protected void createFormContent(IManagedForm managedForm) { ScrolledForm form = managedForm.getForm(); Composite body = form.getBody(); FormToolkit toolkit = managedForm.getToolkit(); form.setText(Messages.SadAnalyzerEditor_ViewerTitle); Action deleteView = new Action("run", Action.AS_CHECK_BOX){ public void run() { deleteView(); } }; deleteView.setToolTipText("Close View"); deleteView.setEnabled(Boolean.TRUE); deleteView.setImageDescriptor(ResourceManager.getPluginImageDescriptor("edu.isistan.sadanalyzer", "icons/delete.gif")); form.getToolBarManager().add(deleteView); form.getToolBarManager().update(true); toolkit.decorateFormHeading(form.getForm()); toolkit.paintBordersFor(body); ColumnLayout layout = new ColumnLayout(); layout.topMargin = 10; layout.bottomMargin = 5; layout.leftMargin = 10; layout.rightMargin = 10; layout.horizontalSpacing = 20; layout.verticalSpacing = 20; layout.maxNumColumns = 1; layout.minNumColumns = 1; toolkit.paintBordersFor(body); managedForm.getForm().getBody().setLayout(layout); viewTextDetail(managedForm, Messages.SadAnalyzerEditor_ViewerDetail, Messages.SadAnalyzerEditor_ViewerDetailDescription); viewMatches(managedForm); } private void deleteView(){ IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); IWorkbenchPage page = window.getActivePage(); for(IEditorReference reference : page.getEditorReferences()){ if(reference .getId().equals(SadAnalyzerEditor.ID)){ EditorPart part = (EditorPart) reference.getEditor(true); SadAnalyzerEditor editor = (SadAnalyzerEditor)part; editor.removePage(editor.getActivePage()); } } this.dispose(); } private void viewMatches(IManagedForm managedForm){ FormToolkit toolkit = managedForm.getToolkit(); compositeLabel = new Composite(managedForm.getForm().getBody(), SWT.NONE); compositeLabel.setLayout(new FillLayout(SWT.HORIZONTAL)); toolkit.adapt(compositeLabel); toolkit.paintBordersFor(compositeLabel); GridLayout layout = new GridLayout(); layout.numColumns = 2; compositeLabel.setLayout(layout); GridData gd = new GridData(); gd.widthHint = 15; gd.heightHint = 20; labelImage = toolkit.createLabel(compositeLabel, ""); labelImage.setImage(ResourceManager.getPluginImage("edu.isistan.sadanalyzer", "icons/warning.gif")); labelImage.setVisible(false); labelImage.setLayoutData(gd); GridData gd1 = new GridData(); gd1.widthHint = 150; gd1.heightHint = 20; labelOccurrences = toolkit.createLabel(compositeLabel, ""); labelOccurrences.setVisible(false); labelOccurrences.setLayoutData(gd1); } private void viewTextDetail(IManagedForm managedForm, String title, String desc) { Composite client = createSection(managedForm, title, desc, 3); listSections = new ListViewer(client, SWT.BORDER | SWT.V_SCROLL); listSections.setLabelProvider(new SadSectionLabelProvider(uimaRoot)); setListViewer(listViewerSectionsSelected, listSections); GridData gd = new GridData(); gd.widthHint = 300; gd.heightHint = 500; sections = listSections.getList(); sections.setLayoutData(gd); listAttributes = new ListViewer(client, SWT.BORDER | SWT.V_SCROLL); listAttributes.setLabelProvider(new CrosscuttingConcernLabelProvider()); setListViewerAttribute(listQualityAttributesSelected, listAttributes); attributes = listAttributes.getList(); attributes.setLayoutData(gd); gd = new GridData(GridData.VERTICAL_ALIGN_BEGINNING); gd = new GridData(); gd.widthHint = 900; gd.heightHint= 500; styledText = new StyledText(client, SWT.BORDER | SWT.READ_ONLY | SWT.WRAP | SWT.V_SCROLL | SWT.MULTI); styledText.setBlockSelection(true); styledText.setLayoutData(gd); managedForm.getToolkit().adapt(styledText); managedForm.getToolkit().paintBordersFor(styledText); listSections.addSelectionChangedListener(new ISelectionChangedListener(){ public void selectionChanged(SelectionChangedEvent event) { IStructuredSelection selection = (IStructuredSelection)event.getSelection(); if(!selection.isEmpty()) { sadSection = (SadSectionImpl)selection.getFirstElement(); viewQueryText(); } } }); listAttributes.addSelectionChangedListener(new ISelectionChangedListener(){ public void selectionChanged(SelectionChangedEvent event) { IStructuredSelection selection = (IStructuredSelection)event.getSelection(); if(!selection.isEmpty()) { crossCutting = (CrosscuttingConcernImpl)selection.getFirstElement(); viewQueryText(); } } }); } private Composite createSection(IManagedForm mform, String title, String desc, int numColumns) { final ScrolledForm form = mform.getForm(); FormToolkit toolkit = mform.getToolkit(); Composite compositeDetails = new Composite(mform.getForm().getBody(), SWT.NONE); compositeDetails.setLayout(new FillLayout(SWT.HORIZONTAL)); toolkit.adapt(compositeDetails); toolkit.paintBordersFor(compositeDetails); Section section = toolkit.createSection(compositeDetails, Section.TWISTIE | Section.TITLE_BAR | Section.DESCRIPTION | Section.EXPANDED); section.setText(title); section.setDescription(desc); Composite client = toolkit.createComposite(section); GridLayout layout = new GridLayout(); layout.marginWidth = layout.marginHeight = 0; layout.numColumns = numColumns; client.setLayout(layout); section.setClient(client); section.addExpansionListener(new ExpansionAdapter() { public void expansionStateChanged(ExpansionEvent e) { form.reflow(false); } }); return client; } @Override public void setActive(boolean active) { super.setActive(active); } private void setListViewer(ListViewer source, ListViewer list){ for(int i=0; list.getList().getItems().length > 0;){ Object o = list.getElementAt(i); list.remove(o); } for(int i = 0; i < source.getList().getItems().length; i++){ list.add(source.getElementAt(i)); } } private void setListViewerAttribute(java.util.List source, ListViewer list){ for(int i=0; list.getList().getItems().length > 0;){ Object o = list.getElementAt(i); list.remove(o); } for(int i = 0; i < source.size(); i++){ list.add(source.get(i)); } } public void refresh(ListViewer listViewerSectionsSelected, java.util.List listQualityAttributesSelected){ setListViewer(listViewerSectionsSelected, listSections); setListViewerAttribute(listQualityAttributesSelected, listAttributes); styledText.setText(""); styledText.update(); attributes.update(); sections.update(); labelImage.setVisible(false); labelOccurrences.setVisible(false); labelOccurrences.update(); labelImage.update(); compositeLabel.update(); } private void viewQueryText(){ if(null != sadSection && null != crossCutting){ occurrences = 0; styledText.setText(uimaRoot.getCoveredText(sadSection)); for(Impact impact : crossCutting.getImpacts()) { Sentence sentence = impact.getSentence(); Color color = new Color(Display.getDefault(),255, 255, 51); StyleRange newStyleRange = createStyleRange(sentence, color); setStyledRange(newStyleRange); } setOccurrences(); } } private void setOccurrences(){ labelImage.setVisible(true); labelOccurrences.setText(Messages.SadAnalyzerEditor_ViewerOccurences+ ": "+occurrences); labelOccurrences.setVisible(true); labelOccurrences.update(); labelImage.update(); compositeLabel.update(); } private StyleRange createStyleRange(Sentence sentence, Color color) { StyleRange styleRange = new StyleRange(); styleRange.start = sentence.getBegin() - sadSection.getBegin(); styleRange.length = sentence.getEnd() - sentence.getBegin(); styleRange.fontStyle = SWT.BOLD; styleRange.background = color; return styleRange; } private void setStyledRange(StyleRange newStyleRange) { try{ StyleRange[] existingStyleRanges = styledText.getStyleRanges(newStyleRange.start, newStyleRange.length, true); if(existingStyleRanges != null && existingStyleRanges.length > 0) { int existingStyleRangesSize = existingStyleRanges.length; int increment = newStyleRange.length / (existingStyleRangesSize + 1); int incrementRest = newStyleRange.length % (existingStyleRangesSize + 1); int lastStart = newStyleRange.start; for(int i = 0; i < existingStyleRangesSize; i++) { StyleRange styleRange = existingStyleRanges[i]; styleRange.start = lastStart; styleRange.length = increment; lastStart = lastStart + increment; } styledText.replaceStyleRanges(newStyleRange.start, newStyleRange.length, existingStyleRanges); newStyleRange.start = lastStart; newStyleRange.length = increment + incrementRest; } styledText.setStyleRange(newStyleRange); occurrences = occurrences + 1; }catch(Exception e){} } }