/******************************************************************************* * 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.hook.ui.wizard; import com.liferay.ide.core.util.FileListing; import com.liferay.ide.project.ui.wizard.StringArrayTableWizardSection; import com.liferay.ide.ui.wizard.ExternalFileSelectionDialog; import java.io.File; import java.io.FileNotFoundException; import java.util.ArrayList; import java.util.List; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.jface.window.Window; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.wst.common.frameworks.datamodel.IDataModel; /** * @author Greg Amerson */ public class CustomJSPsTableWizardSection extends StringArrayTableWizardSection { protected static class JSPFileViewerFilter extends ViewerFilter { protected File base; protected List<File> cachedDirs = new ArrayList<File>(); protected String[] roots = null; protected IPath[] validRoots; public JSPFileViewerFilter( File base, String[] roots ) { this.base = base; this.roots = roots; this.validRoots = new IPath[roots.length]; for( int i = 0; i < roots.length; i++ ) { File fileRoot = new File( base, roots[i] ); if( fileRoot.exists() ) { validRoots[i] = new Path( fileRoot.getPath() ); } } } @Override public boolean select( Viewer viewer, Object parent, Object element ) { if( element instanceof File ) { File file = (File) element; IPath filePath = new Path( file.getPath() ); boolean validRootFound = false; for( IPath validRoot : validRoots ) { if( validRoot.isPrefixOf( filePath ) ) { validRootFound = true; break; } } if( !validRootFound ) { return false; } if( cachedDirs.contains( file ) ) { return true; } else if( file.isDirectory() ) { // we only want to show the directory if it had children // that have jsps if( directoryContainsFiles( file, "jsp", viewer ) ) //$NON-NLS-1$ { cachedDirs.add( file ); return true; } } else { if( filePath.getFileExtension().contains( "jsp" ) ) //$NON-NLS-1$ { return true; } } } return false; } protected boolean directoryContainsFiles( File dir, String ext, Viewer viewer ) { try { List<File> files = FileListing.getFileListing( dir ); for( File file : files ) { IPath filePath = new Path( file.getPath() ); if( filePath.getFileExtension() != null && filePath.getFileExtension().contains( ext ) ) { return true; } } } catch( FileNotFoundException e ) { // do nothing } return false; } } protected Button addFromPortalButton; protected File portalDir; public CustomJSPsTableWizardSection( Composite parent, String componentLabel, String dialogTitle, String addButtonLabel, String editButtonLabel, String removeButtonLabel, String[] columnTitles, String[] fieldLabels, Image labelProviderImage, IDataModel model, String propertyName ) { super( parent, componentLabel, dialogTitle, addButtonLabel, editButtonLabel, removeButtonLabel, columnTitles, fieldLabels, labelProviderImage, model, propertyName ); } public void setPortalDir( File dir ) { this.portalDir = dir; } @Override protected void addButtonsToButtonComposite( Composite buttonCompo, String addButtonLabel, String editButtonLabel, String removeButtonLabel ) { addFromPortalButton = new Button( buttonCompo, SWT.PUSH ); addFromPortalButton.setText( Msgs.addFromLiferay ); addFromPortalButton.setLayoutData( new GridData( GridData.VERTICAL_ALIGN_BEGINNING | GridData.HORIZONTAL_ALIGN_FILL ) ); addFromPortalButton.addSelectionListener( new SelectionListener() { public void widgetDefaultSelected( SelectionEvent event ) { // Do nothing } public void widgetSelected( SelectionEvent event ) { handleAddFromPortalButtonSelected(); } } ); super.addButtonsToButtonComposite( buttonCompo, addButtonLabel, editButtonLabel, removeButtonLabel ); } protected void handleAddFromPortalButtonSelected() { if( portalDir == null || !portalDir.exists() ) { MessageDialog.openWarning( getShell(), Msgs.addJSP, Msgs.couldNotFindPortalRoot ); return; } IPath rootPath = new Path( portalDir.getPath() ); ExternalFileSelectionDialog dialog = new ExternalFileSelectionDialog( getShell(), new JSPFileViewerFilter( portalDir, new String[] { "html" } ), true, false ); //$NON-NLS-1$ dialog.setTitle( Msgs.liferayCustomJSP ); dialog.setMessage( Msgs.selectJSPToCustomize ); dialog.setInput( portalDir ); if( dialog.open() == Window.OK ) { Object[] selected = dialog.getResult(); for( int i = 0; i < selected.length; i++ ) { IPath filePath = Path.fromOSString( ( (File) selected[i] ).getPath() ); addStringArray( new String[] { "/" + filePath.makeRelativeTo( rootPath ).toPortableString() } ); //$NON-NLS-1$ } } } private static class Msgs extends NLS { public static String addFromLiferay; public static String addJSP; public static String couldNotFindPortalRoot; public static String liferayCustomJSP; public static String selectJSPToCustomize; static { initializeMessages( CustomJSPsTableWizardSection.class.getName(), Msgs.class ); } } }