/******************************************************************************* * Copyright (c) 2000-present Liferay, Inc. All rights reserved. * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library 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 Lesser General Public License for more * details. * *******************************************************************************/ package com.liferay.ide.project.ui.pref; import com.liferay.blade.api.Problem; import com.liferay.ide.core.util.CoreUtil; import com.liferay.ide.project.core.upgrade.IgnoredProblemsContainer; import com.liferay.ide.project.core.upgrade.UpgradeAssistantSettingsUtil; import com.liferay.ide.project.ui.ProjectUI; import com.liferay.ide.project.ui.migration.MigrationUtil; import com.liferay.ide.ui.util.UIUtil; import java.io.IOException; import org.eclipse.jface.preference.PreferencePage; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.ColumnLabelProvider; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TableViewerColumn; import org.eclipse.jface.viewers.ViewerCell; import org.eclipse.swt.SWT; import org.eclipse.swt.browser.Browser; 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.Label; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPreferencePage; /** * @author Lovett Li */ public class MigrationProblemPreferencePage extends PreferencePage implements IWorkbenchPreferencePage { public final static String ID = "com.liferay.ide.project.ui.migrationProblemPreferencePage"; private TableViewer _ignoredProblemTable; private Button _removeButton; private Label _detailInfoLabel; private Browser _browser; private IgnoredProblemsContainer mpContainer; @Override public Control createContents( Composite parent ) { Composite pageComponent = new Composite( parent, SWT.NULL ); GridLayout layout = new GridLayout(); layout.numColumns = 2; layout.marginWidth = 0; layout.marginHeight = 0; pageComponent.setLayout( layout ); GridData data = new GridData(); data.verticalAlignment = GridData.FILL; data.horizontalAlignment = GridData.FILL; pageComponent.setLayoutData( data ); data = new GridData( GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL ); Label label = new Label( pageComponent, SWT.LEFT ); label.setText( "These are ignored breaking change problems.\n " + "You can remove them if you want to show this type of problem next time." ); data = new GridData(); data.horizontalAlignment = GridData.FILL; data.horizontalSpan = 2; label.setLayoutData( data ); _ignoredProblemTable = new TableViewer( pageComponent, SWT.MULTI | SWT.BORDER | SWT.FULL_SELECTION ); data = new GridData( GridData.FILL_HORIZONTAL ); createColumns( _ignoredProblemTable ); final Table table = _ignoredProblemTable.getTable(); table.setHeaderVisible( true ); data.heightHint = 200; _ignoredProblemTable.getTable().setLayoutData( data ); _ignoredProblemTable.setContentProvider( ArrayContentProvider.getInstance() ); Composite groupComponent = new Composite( pageComponent, SWT.NULL ); GridLayout groupLayout = new GridLayout(); groupLayout.marginWidth = 0; groupLayout.marginHeight = 0; groupComponent.setLayout( groupLayout ); data = new GridData(); data.verticalAlignment = GridData.FILL; data.horizontalAlignment = GridData.FILL; groupComponent.setLayoutData( data ); _removeButton = new Button( groupComponent, SWT.PUSH ); _removeButton.setText( "Remove" ); _removeButton.addSelectionListener( new SelectionListener() { @Override public void widgetSelected( SelectionEvent arg0 ) { StructuredSelection selection = (StructuredSelection) _ignoredProblemTable.getSelection(); if( selection != null && selection.getFirstElement() instanceof Problem ) { try { Problem problem = (Problem) selection.getFirstElement(); mpContainer.remove( problem ); _ignoredProblemTable.setInput( mpContainer.getProblemMap().values().toArray( new Problem[0] ) ); } catch( Exception e ) { ProjectUI.logError( e ); } } } @Override public void widgetDefaultSelected( SelectionEvent arg0 ) { } } ); setButtonLayoutData( _removeButton ); label = new Label( pageComponent, SWT.LEFT ); data = new GridData(); data.horizontalAlignment = GridData.FILL; data.horizontalSpan = 2; label.setLayoutData( data ); _detailInfoLabel = new Label( pageComponent, SWT.LEFT ); _detailInfoLabel.setText( "Detail Information" ); data = new GridData(); data.horizontalAlignment = GridData.FILL; data.horizontalSpan = 2; _detailInfoLabel.setLayoutData( data ); _browser = new Browser( pageComponent, SWT.BORDER ); data = new GridData( GridData.FILL_BOTH ); _browser.setLayoutData( data ); groupComponent = new Composite( pageComponent, SWT.NULL ); groupLayout = new GridLayout(); groupLayout.marginWidth = 0; groupLayout.marginHeight = 0; groupComponent.setLayout( groupLayout ); data = new GridData(); data.verticalAlignment = GridData.FILL; data.horizontalAlignment = GridData.FILL; groupComponent.setLayoutData( data ); fillIgnoredProblemTable(); _ignoredProblemTable.addSelectionChangedListener( new ISelectionChangedListener() { public void selectionChanged( final SelectionChangedEvent event ) { UIUtil.async( new Runnable() { public void run() { updateForm( event ); } }, 50 ); } } ); return pageComponent; } @Override public void init( IWorkbench arg0 ) { mpContainer = MigrationUtil.getIgnoredProblemsContainer(); } @Override public boolean performOk() { try { UpgradeAssistantSettingsUtil.setObjectToStore( IgnoredProblemsContainer.class, mpContainer ); } catch( IOException e ) { ProjectUI.logError( e ); } return super.performOk(); } private void fillIgnoredProblemTable() { try { IgnoredProblemsContainer mpContainer = UpgradeAssistantSettingsUtil.getObjectFromStore( IgnoredProblemsContainer.class ); if( mpContainer != null ) { Problem[] problems = mpContainer.getProblemMap().values().toArray( new Problem[0] ); _ignoredProblemTable.setInput( problems ); } } catch( IOException e ) { e.printStackTrace(); } } private void createColumns( final TableViewer _problemsViewer ) { final String[] titles = { "Tickets", "Problem" }; final int[] bounds = { 65, 55 }; TableViewerColumn col = createTableViewerColumn( titles[0], bounds[0], _problemsViewer ); col.setLabelProvider( new ColumnLabelProvider() { @Override public String getText( Object element ) { Problem p = (Problem) element; return p.getTicket(); } } ); col = createTableViewerColumn( titles[1], bounds[1], _problemsViewer ); col.setLabelProvider( new ColumnLabelProvider() { @Override public String getText( Object element ) { Problem p = (Problem) element; return p.getTitle(); } @Override public void update( ViewerCell cell ) { super.update( cell ); Table table = _problemsViewer.getTable(); table.getColumn( 1 ).pack(); } } ); } private TableViewerColumn createTableViewerColumn( String title, int bound, TableViewer viewer ) { final TableViewerColumn viewerColumn = new TableViewerColumn( viewer, SWT.NONE ); final TableColumn column = viewerColumn.getColumn(); column.setText( title ); column.setWidth( bound ); column.setResizable( true ); column.setMoveable( true ); return viewerColumn; } private void updateForm( SelectionChangedEvent event ) { final ISelection selection = event.getSelection(); final Problem problem = MigrationUtil.getProblemFromSelection( selection ); if( problem != null ) { if( CoreUtil.isNullOrEmpty( problem.html ) ) { _browser.setText( generateFormText( problem ) ); } else { _browser.setText( problem.html ); } } else { _browser.setUrl( "about:blank" ); } }; private String generateFormText( Problem problem ) { StringBuilder sb = new StringBuilder(); sb.append( "<form><p>" ); sb.append( "<b>Problem:</b> " + problem.title + "<br/><br/>" ); sb.append( "<b>Description:</b><br/>" ); sb.append( "\t" + problem.summary + "<br/><br/>" ); if( problem.getAutoCorrectContext() != null && problem.autoCorrectContext.length() > 0 ) { sb.append( "<a href='autoCorrect'>Correct this problem automatically</a><br/><br/>" ); } if( problem.html != null && problem.html.length() > 0 ) { sb.append( "<a href='html'>See documentation for how to correct this problem.</a><br/><br/>" ); } if( problem.ticket != null && problem.ticket.length() > 0 ) { sb.append( "<b>Tickets:</b> " + getLinkTags( problem.ticket ) + "<br/><br/>" ); } sb.append( "</p></form>" ); return sb.toString(); } private String getLinkTags( String ticketNumbers ) { String[] ticketNumberArray = ticketNumbers.split( "," ); StringBuilder sb = new StringBuilder(); for( int i = 0; i < ticketNumberArray.length; i++ ) { String ticketNumber = ticketNumberArray[i]; sb.append( "<a href='https://issues.liferay.com/browse/" ); sb.append( ticketNumber ); sb.append( "'>" ); sb.append( ticketNumber ); sb.append( "</a>" ); if( ticketNumberArray.length > 1 && i != ticketNumberArray.length - 1 ) { sb.append( "," ); } } return sb.toString(); } }