/*******************************************************************************
* 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.migration;
import com.liferay.blade.api.Problem;
import com.liferay.ide.core.util.CoreUtil;
import com.liferay.ide.project.core.upgrade.FileProblems;
import com.liferay.ide.project.ui.ProjectUI;
import com.liferay.ide.ui.util.UIUtil;
import java.util.List;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.CheckboxCellEditor;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.EditingSupport;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
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.custom.SashForm;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.actions.ActionContext;
import org.eclipse.ui.internal.navigator.actions.CommonActionDescriptorManager;
import org.eclipse.ui.internal.navigator.actions.CommonActionProviderDescriptor;
import org.eclipse.ui.navigator.CommonActionProvider;
import org.eclipse.ui.navigator.CommonNavigator;
import org.eclipse.ui.navigator.INavigatorContentService;
import org.eclipse.ui.navigator.NavigatorActionService;
/**
* @author Gregory Amerson
* @author Terry Jia
* @author Lovett li
* @author Simon Jiang
*/
@SuppressWarnings( "restriction" )
public class MigrationView extends CommonNavigator implements IDoubleClickListener
{
public static final String ID = "com.liferay.ide.project.ui.migrationView";
private static final Image IMAGE_CHECKED =
ProjectUI.getDefault().getImageRegistry().get( ProjectUI.CHECKED_IMAGE_ID );
private static final Image IMAGE_UNCHECKED =
ProjectUI.getDefault().getImageRegistry().get( ProjectUI.UNCHECKED_IMAGE_ID );
public static boolean showAll = false;
private Browser _browser;
// private FormText _form;
private TableViewer _problemsViewer;
private MigratorComparator _comparator;
private void createColumns( final TableViewer _problemsViewer )
{
final String[] titles = { "Resolved", "Line", "Problem" };
final int[] bounds = { 65, 55, 200 };
TableViewerColumn col = createTableViewerColumn( titles[0], bounds[0], _problemsViewer );
col.setEditingSupport( new EditingSupport( _problemsViewer )
{
@Override
protected void setValue( Object element, Object value )
{
if( value == Boolean.TRUE )
{
new MarkDoneAction().run( (Problem) element, _problemsViewer );
}
else
{
new MarkUndoneAction().run( (Problem) element, _problemsViewer );
}
}
@Override
protected Object getValue( Object element )
{
return ( (Problem) element ).getStatus() == Problem.STATUS_RESOLVED;
}
@Override
protected CellEditor getCellEditor( Object element )
{
return new CheckboxCellEditor( _problemsViewer.getTable() );
}
@Override
protected boolean canEdit( Object element )
{
return true;
}
});
col.setLabelProvider( new ColumnLabelProvider()
{
@Override
public Image getImage( Object element )
{
Problem p = (Problem) element;
if( p.getStatus() == Problem.STATUS_RESOLVED )
{
return IMAGE_CHECKED;
}
else
{
return IMAGE_UNCHECKED;
}
}
public String getText( Object element )
{
return null;
}
});
col = createTableViewerColumn( titles[1], bounds[1], _problemsViewer );
col.setLabelProvider( new ColumnLabelProvider()
{
@Override
public String getText( Object element )
{
Problem p = (Problem) element;
return p.lineNumber > -1 ? ( p.lineNumber + "" ) : "";
}
});
col = createTableViewerColumn( titles[2], bounds[2], _problemsViewer );
col.setLabelProvider( new ColumnLabelProvider()
{
@Override
public String getText( Object element )
{
Problem p = (Problem) element;
return p.title;
}
@Override
public void update(ViewerCell cell)
{
super.update(cell);
Table table = _problemsViewer.getTable();
table.getColumn(2).pack();
}
});
}
@Override
public void createPartControl( Composite parent )
{
SashForm viewParent = new SashForm( parent, SWT.HORIZONTAL );
viewParent.setLayout( new FillLayout( SWT.HORIZONTAL ) );
super.createPartControl( viewParent );
SashForm detailParent = new SashForm( viewParent, SWT.VERTICAL );
viewParent.setWeights( new int[] { 2, 3 } );
_problemsViewer =
new TableViewer( detailParent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER );
createColumns( _problemsViewer );
final Table table = _problemsViewer.getTable();
table.setHeaderVisible( true );
_problemsViewer.setContentProvider( ArrayContentProvider.getInstance() );
_problemsViewer.setComparer(null);
_comparator = new MigratorComparator();
_problemsViewer.setComparator(_comparator);
MenuManager menuMgr = new MenuManager();
menuMgr.setRemoveAllWhenShown( true );
menuMgr.addMenuListener( new IMenuListener()
{
public void menuAboutToShow( IMenuManager manager )
{
MigrationView.this.fillContextMenu( manager, _problemsViewer );
}
});
Menu menu = menuMgr.createContextMenu( _problemsViewer.getControl() );
_problemsViewer.getControl().setMenu( menu );
getSite().registerContextMenu( menuMgr, _problemsViewer );
contributeToActionBars();
_problemsViewer.addDoubleClickListener( this );
CommonActionProvider ap = getCommonActionProvider( new StructuredSelection( new Problem() ) );
if( ap instanceof MigrationActionProvider )
{
MigrationActionProvider mp = (MigrationActionProvider) ap;
mp.makeActions( _problemsViewer );
mp.registerSelectionProvider( _problemsViewer );
}
/*if( Platform.getOS().equals( Platform.OS_LINUX ) )
{
ScrolledFormText sft = new ScrolledFormText( detailParent, false );
sft.setExpandVertical( true );
_form = new FormText( sft, SWT.NONE );
sft.setFormText( _form );
_form.addHyperlinkListener( new IHyperlinkListener()
{
public void linkExited( org.eclipse.ui.forms.events.HyperlinkEvent e )
{
}
public void linkEntered( org.eclipse.ui.forms.events.HyperlinkEvent e )
{
}
public void linkActivated( org.eclipse.ui.forms.events.HyperlinkEvent e )
{
if( e.data instanceof String )
{
final String url = (String) e.data;
final Problem problem =
MigrationUtil.getProblemFromSelection( _problemsViewer.getSelection() );
if( "autoCorrect".equals( url ) )
{
AutoCorrectAction.run( problem, _problemsViewer );
}
else if( "html".equals( url ) )
{
displayPopupHtml( problem.title, problem.html );
}
else if( url.startsWith( "http" ) )
{
openBrowser( url );
}
}
}
});
}
else
{*/
_browser = new Browser( detailParent, SWT.BORDER );
//}
detailParent.setWeights( new int[] { 2, 3 } );
getCommonViewer().addSelectionChangedListener( new ISelectionChangedListener()
{
public void selectionChanged( SelectionChangedEvent event )
{
List<Problem> problems = null;
if( showAll )
{
problems = MigrationUtil.getProblemsFromTreeNode( event.getSelection() );
}
else
{
problems = MigrationUtil.getCurrentProblemsFromTreeNode( event.getSelection() );
}
if( problems != null && problems.size() > 0 )
{
_problemsViewer.setInput( problems.toArray() );
_problemsViewer.setSelection( new StructuredSelection( problems.get( 0 ) ) );
}
else
{
_problemsViewer.setInput( null );
}
}
});
_problemsViewer.addSelectionChangedListener( new ISelectionChangedListener()
{
public void selectionChanged( final SelectionChangedEvent event )
{
UIUtil.async( new Runnable()
{
public void run()
{
updateForm( event );
}
}, 50 );
}
});
getCommonViewer().addDoubleClickListener( this );
}
/*private void displayPopupHtml( final String title, final String html )
{
final Shell shell = new Shell( this.getViewSite().getShell(), SWT.DIALOG_TRIM | SWT.ON_TOP | SWT.RESIZE );
shell.setText( title );
shell.setLayout( new FillLayout() );
final Browser browser;
try
{
browser = new Browser( shell, SWT.NONE );
browser.setText( html );
}
catch( SWTError e )
{
return;
}
shell.setSize( 900, 900 );
Integer popupLastX = getMemento().getInteger( "popupLastX" );
Integer popupLastY = getMemento().getInteger( "popupLastY" );
Integer popupSizeX = getMemento().getInteger( "popupSizeX" );
Integer popupSizeY = getMemento().getInteger( "popupSizeY" );
if( popupLastX != null && popupLastY != null )
{
shell.setLocation( popupLastX, popupLastY );
}
if( popupSizeX != null && popupSizeY != null )
{
shell.setSize( popupSizeX, popupSizeY );
}
shell.addDisposeListener( new DisposeListener()
{
public void widgetDisposed( DisposeEvent e )
{
savePopupState( shell );
browser.dispose();
}
});
shell.addListener( SWT.Traverse, new Listener()
{
public void handleEvent( Event event )
{
switch( event.detail )
{
case SWT.TRAVERSE_ESCAPE:
savePopupState( shell );
shell.close();
event.detail = SWT.TRAVERSE_NONE;
event.doit = false;
break;
}
}
});
shell.open();
}*/
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 );
column.addSelectionListener( getSelectionAdapter( column, viewer.getTable().indexOf( column ) ) );
return viewerColumn;
}
private void contributeToActionBars()
{
final IActionBars bars = getViewSite().getActionBars();
final IToolBarManager manager = bars.getToolBarManager();
final IAction migrateAction = new RunMigrationToolAction( "Run Migration Tool" , getViewSite().getShell() );
final IAction expandAllAction = new ExpandAllAction( "Expand All", this );
final IAction showAllAction = new ShowAllAction( "Show All", this );
manager.add( migrateAction );
manager.add( expandAllAction );
manager.add( showAllAction );
}
@Override
public void doubleClick( DoubleClickEvent event )
{
if( event.getSelection() instanceof IStructuredSelection )
{
final IStructuredSelection ss = (IStructuredSelection) event.getSelection();
Object element = ss.getFirstElement();
if( element instanceof Problem )
{
MigrationUtil.openEditor( (Problem) element );
}
else if( element instanceof FileProblems )
{
MigrationUtil.openEditor( (FileProblems) element );
}
}
}
private void fillContextMenu( IMenuManager manager, ISelectionProvider provider )
{
CommonActionProvider instance = getCommonActionProvider( provider.getSelection() );
instance.setContext( new ActionContext( provider.getSelection() ) );
instance.fillContextMenu( manager );
}
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();
}
CommonActionProvider getCommonActionProvider( ISelection selection )
{
final INavigatorContentService contentService =
getCommonViewer().getCommonNavigator().getNavigatorContentService();
final ActionContext context = new ActionContext( selection );
final CommonActionProviderDescriptor[] providerDescriptors =
CommonActionDescriptorManager.getInstance().findRelevantActionDescriptors( contentService, context );
final NavigatorActionService navigatorActionService =
getCommonViewer().getCommonNavigator().getNavigatorActionService();
return navigatorActionService.getActionProviderInstance( providerDescriptors[0] );
}
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();
}
private SelectionAdapter getSelectionAdapter( final TableColumn column, final int index )
{
return new SelectionAdapter()
{
public void widgetSelected( SelectionEvent e )
{
_comparator.setColumn( index );
int dir = _comparator.getDirection();
_problemsViewer.getTable().setSortDirection( dir );
_problemsViewer.getTable().setSortColumn( column );
_problemsViewer.refresh();
}
};
}
/*private void openBrowser( final String url )
{
Display.getDefault().asyncExec( new Runnable()
{
public void run()
{
try
{
IWorkbenchBrowserSupport browserSupport =
ServerUIPlugin.getInstance().getWorkbench().getBrowserSupport();
IWebBrowser browser = browserSupport.createBrowser(
IWorkbenchBrowserSupport.AS_EXTERNAL | IWorkbenchBrowserSupport.NAVIGATION_BAR, null, "",
null );
browser.openURL( new URL( url ) );
}
catch( Exception e )
{
ProjectUI.logError( "error opening browser", e );
}
}
});
}
private void savePopupState( Shell shell )
{
final Point location = shell.getLocation();
final Point size = shell.getSize();
MigrationView.this.getMemento().putInteger( "popupLastX", location.x );
MigrationView.this.getMemento().putInteger( "popupLastY", location.y );
MigrationView.this.getMemento().putInteger( "popupSizeX", size.x );
MigrationView.this.getMemento().putInteger( "popupSizeY", size.y );
}*/
private void updateForm( SelectionChangedEvent event )
{
final ISelection selection = event.getSelection();
final Problem problem = MigrationUtil.getProblemFromSelection( selection );
if( problem != null )
{
/*if( Platform.getOS().equals( Platform.OS_LINUX ) )
{
_form.setText( generateFormText( problem ), true, false );
}
else
{*/
if( CoreUtil.isNullOrEmpty( problem.html ) )
{
_browser.setText( generateFormText( problem ) );
}
else
{
_browser.setText( problem.html );
}
//}
}
else
{
/* if( Platform.getOS().equals( Platform.OS_LINUX ) )
{
_form.setText( "", false, false );
}
else
{*/
_browser.setUrl( "about:blank" );
//}
}
};
public TableViewer getProblemsViewer()
{
return _problemsViewer;
}
}