Java tutorial
/******************************************************************************* * 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.ide.core.util.CoreUtil; 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.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); 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((TaskProblem) element, _problemsViewer); } else { new MarkUndoneAction().run((TaskProblem) element, _problemsViewer); } } @Override protected Object getValue(Object element) { return ((TaskProblem) element).isResolved(); } @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) { TaskProblem p = (TaskProblem) element; if (p.isResolved()) { 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) { TaskProblem p = (TaskProblem) element; return p.lineNumber > -1 ? (p.lineNumber + "") : ""; } }); col = createTableViewerColumn(titles[2], bounds[2], _problemsViewer); col.setLabelProvider(new ColumnLabelProvider() { @Override public String getText(Object element) { TaskProblem p = (TaskProblem) 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 TaskProblem())); 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 TaskProblem taskProblem = MigrationUtil.getTaskProblemFromSelection( _problemsViewer.getSelection() ); if( "autoCorrect".equals( url ) ) { AutoCorrectAction.run( taskProblem, _problemsViewer ); } else if( "html".equals( url ) ) { displayPopupHtml( taskProblem.title, taskProblem.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<TaskProblem> problems = MigrationUtil.getTaskProblemsFromTreeNode(event.getSelection(), getCommonViewer()); 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); manager.add(migrateAction); manager.add(expandAllAction); } @Override public void doubleClick(DoubleClickEvent event) { TaskProblem taskProblem = MigrationUtil.getTaskProblemFromSelection(event.getSelection()); if (taskProblem != null) { MigrationUtil.openEditor(taskProblem); } } private void fillContextMenu(IMenuManager manager, ISelectionProvider provider) { CommonActionProvider instance = getCommonActionProvider(provider.getSelection()); instance.setContext(new ActionContext(provider.getSelection())); instance.fillContextMenu(manager); } private String generateFormText(TaskProblem taskProblem) { StringBuilder sb = new StringBuilder(); sb.append("<form><p>"); sb.append("<b>Problem:</b> " + taskProblem.title + "<br/><br/>"); sb.append("<b>Description:</b><br/>"); sb.append("\t" + taskProblem.summary + "<br/><br/>"); if (taskProblem.getAutoCorrectContext() != null && taskProblem.autoCorrectContext.length() > 0) { sb.append("<a href='autoCorrect'>Correct this problem automatically</a><br/><br/>"); } if (taskProblem.html != null && taskProblem.html.length() > 0) { sb.append("<a href='html'>See documentation for how to correct this problem.</a><br/><br/>"); } if (taskProblem.ticket != null && taskProblem.ticket.length() > 0) { sb.append("<b>Tickets:</b> " + getLinkTags(taskProblem.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 TaskProblem taskProblem = MigrationUtil.getTaskProblemFromSelection(selection); if (taskProblem != null) { /*if( Platform.getOS().equals( Platform.OS_LINUX ) ) { _form.setText( generateFormText( taskProblem ), true, false ); } else {*/ if (CoreUtil.isNullOrEmpty(taskProblem.html)) { _browser.setText(generateFormText(taskProblem)); } else { _browser.setText(taskProblem.html); } //} } else { /* if( Platform.getOS().equals( Platform.OS_LINUX ) ) { _form.setText( "", false, false ); } else {*/ _browser.setUrl("about:blank"); //} } }; public TableViewer getProblemsViewer() { return _problemsViewer; } }