/*! * This program is free software; you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software * Foundation. * * You should have received a copy of the GNU Lesser General Public License along with this * program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html * or from the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This program 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. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package org.pentaho.mantle.client.solutionbrowser; import java.util.ArrayList; import java.util.List; import org.pentaho.gwt.widgets.client.dialogs.MessageDialogBox; import org.pentaho.gwt.widgets.client.filechooser.RepositoryFile; import org.pentaho.gwt.widgets.client.utils.NameUtils; import org.pentaho.mantle.client.EmptyRequestCallback; import org.pentaho.mantle.client.commands.AbstractCommand; import org.pentaho.mantle.client.commands.ExecuteUrlInNewTabCommand; import org.pentaho.mantle.client.commands.ShareFileCommand; import org.pentaho.mantle.client.dialogs.scheduling.ScheduleHelper; import org.pentaho.mantle.client.events.EventBusUtil; import org.pentaho.mantle.client.events.ShowDescriptionsEvent; import org.pentaho.mantle.client.events.ShowHiddenFilesEvent; import org.pentaho.mantle.client.events.SolutionBrowserSelectEvent; import org.pentaho.mantle.client.events.SolutionBrowserSelectEventHandler; import org.pentaho.mantle.client.events.SolutionFileHandler; import org.pentaho.mantle.client.messages.Messages; import org.pentaho.mantle.client.objects.SolutionFileInfo; import org.pentaho.mantle.client.solutionbrowser.PluginOptionsHelper.ContentTypePlugin; import org.pentaho.mantle.client.solutionbrowser.filelist.FileCommand; import org.pentaho.mantle.client.solutionbrowser.filelist.FileCommand.COMMAND; import org.pentaho.mantle.client.solutionbrowser.filelist.FileItem; import org.pentaho.mantle.client.solutionbrowser.filelist.FilesListPanel; import org.pentaho.mantle.client.solutionbrowser.filepicklist.FavoritePickItem; import org.pentaho.mantle.client.solutionbrowser.filepicklist.FavoritePickList; import org.pentaho.mantle.client.solutionbrowser.filepicklist.RecentPickItem; import org.pentaho.mantle.client.solutionbrowser.filepicklist.RecentPickList; import org.pentaho.mantle.client.solutionbrowser.tabs.IFrameTabPanel; import org.pentaho.mantle.client.solutionbrowser.toolbars.BrowserToolbar; import org.pentaho.mantle.client.solutionbrowser.tree.SolutionTree; import org.pentaho.mantle.client.solutionbrowser.tree.SolutionTreeWrapper; import org.pentaho.mantle.client.ui.PerspectiveManager; import org.pentaho.mantle.client.ui.tabs.MantleTabPanel; import com.allen_sauer.gwt.dnd.client.PickupDragController; import com.google.gwt.core.client.GWT; import com.google.gwt.core.client.JsArrayString; import com.google.gwt.dom.client.Element; import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.event.logical.shared.ResizeEvent; import com.google.gwt.event.logical.shared.ResizeHandler; import com.google.gwt.http.client.Request; import com.google.gwt.http.client.RequestBuilder; import com.google.gwt.http.client.RequestCallback; import com.google.gwt.http.client.RequestException; import com.google.gwt.http.client.Response; import com.google.gwt.json.client.JSONArray; import com.google.gwt.json.client.JSONObject; import com.google.gwt.json.client.JSONParser; import com.google.gwt.user.client.Command; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.Event; import com.google.gwt.user.client.Timer; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.RootPanel; import com.google.gwt.user.client.ui.SimplePanel; import com.google.gwt.user.client.ui.SplitLayoutPanel; import com.google.gwt.user.client.ui.TreeItem; import com.google.gwt.user.client.ui.TreeListener; import com.google.gwt.user.client.ui.Widget; @SuppressWarnings( "deprecation" ) public class SolutionBrowserPanel extends HorizontalPanel { private static final String FILE_EXTENSION_DELIMETER = "."; private final int defaultSplitPosition = 220; //$NON-NLS-1$ private SplitLayoutPanel navigatorAndContentSplit = new SplitLayoutPanel() { @Override public void onResize() { super.onResize(); adjustContentPanelSize(); } }; private SplitLayoutPanel solutionNavigatorPanel = new SplitLayoutPanel(); private SolutionTree solutionTree = new SolutionTree( true ); private FilesListPanel filesListPanel = new FilesListPanel(); private Timer resizeTimer; private MantleTabPanel contentTabPanel = new MantleTabPanel( true ); private boolean showSolutionBrowser = false; private boolean isAdministrator = false; private boolean isScheduler = false; private PickupDragController dragController; private List<String> executableFileExtensions = new ArrayList<String>(); private JsArrayString filters; private Command ToggleLocalizedNamesCommand = new Command() { public void execute() { solutionTree.setShowLocalizedFileNames( !solutionTree.isShowLocalizedFileNames() ); // update setting final String url = GWT.getHostPageBaseURL() + "api/user-settings/MANTLE_SHOW_LOCALIZED_FILENAMES"; //$NON-NLS-1$ RequestBuilder builder = new RequestBuilder( RequestBuilder.POST, url ); builder.setHeader( "If-Modified-Since", "01 Jan 1970 00:00:00 GMT" ); try { builder.sendRequest( "" + solutionTree.isShowLocalizedFileNames(), EmptyRequestCallback.getInstance() ); } catch ( RequestException e ) { // showError(e); } } }; public Command toggleShowHideFilesCommand = new Command() { public void execute() { filesListPanel.setShowHiddenFiles( !solutionTree.isShowHiddenFiles() ); solutionTree.setShowHiddenFiles( !solutionTree.isShowHiddenFiles() ); solutionTree.setSelectedItem( solutionTree.getSelectedItem(), true ); // send event final ShowHiddenFilesEvent event = new ShowHiddenFilesEvent(); event.setValue( solutionTree.isShowHiddenFiles() ); EventBusUtil.EVENT_BUS.fireEvent( event ); // update setting final String url = GWT.getHostPageBaseURL() + "api/user-settings/MANTLE_SHOW_HIDDEN_FILES"; //$NON-NLS-1$ RequestBuilder builder = new RequestBuilder( RequestBuilder.POST, url ); try { builder.setHeader( "If-Modified-Since", "01 Jan 1970 00:00:00 GMT" ); builder.sendRequest( "" + solutionTree.isShowHiddenFiles(), EmptyRequestCallback.getInstance() ); RepositoryFileTreeManager.getInstance().fetchRepositoryFileTree( true, null, null, solutionTree.isShowHiddenFiles() ); } catch ( RequestException e ) { // showError(e); } } }; public Command toggleUseDescriptionCommand = new Command() { public void execute() { solutionTree.setUseDescriptionsForTooltip( !solutionTree.isUseDescriptionsForTooltip() ); solutionTree.setSelectedItem( solutionTree.getSelectedItem(), true ); // send event final ShowDescriptionsEvent event = new ShowDescriptionsEvent(); event.setValue( solutionTree.isUseDescriptionsForTooltip() ); EventBusUtil.EVENT_BUS.fireEvent( event ); // update setting final String url = GWT.getHostPageBaseURL() + "api/user-settings/MANTLE_SHOW_DESCRIPTIONS_FOR_TOOLTIPS"; //$NON-NLS-1$ RequestBuilder builder = new RequestBuilder( RequestBuilder.POST, url ); try { builder.setHeader( "If-Modified-Since", "01 Jan 1970 00:00:00 GMT" ); builder.sendRequest( "" + solutionTree.isUseDescriptionsForTooltip(), EmptyRequestCallback.getInstance() ); } catch ( RequestException e ) { // showError(e); } } }; private TreeListener treeListener = new TreeListener() { public void onTreeItemSelected( TreeItem item ) { filesListPanel.setShowHiddenFiles( solutionTree.isShowHiddenFiles() ); filesListPanel.populateFilesList( SolutionBrowserPanel.this, solutionTree, item, filters ); filesListPanel.getToolbar().setEnabled( false ); } public void onTreeItemStateChanged( TreeItem item ) { solutionTree.setSelectedItem( item, false ); } }; private static SolutionBrowserPanel instance; private SolutionBrowserPanel() { RootPanel.get().getElement().getStyle().setProperty( "position", "relative" ); dragController = new SolutionBrowserDragController( contentTabPanel ); instance = this; ExecuteUrlInNewTabCommand.setupNativeHooks(); SolutionBrowserPanel.setupNativeHooks( this ); solutionTree.addTreeListener( treeListener ); initializeExecutableFileTypes(); buildUI(); EventBusUtil.EVENT_BUS.addHandler( SolutionBrowserSelectEvent.TYPE, new SolutionBrowserSelectEventHandler() { public void onTabSelected( SolutionBrowserSelectEvent event ) { adjustContentPanelSize(); } } ); } public static SolutionBrowserPanel getInstance() { if ( instance == null ) { instance = new SolutionBrowserPanel(); } return instance; } private void buildUI() { FlowPanel topPanel = new FlowPanel(); SimplePanel toolbarWrapper = new SimplePanel(); toolbarWrapper.setWidget( new BrowserToolbar() ); toolbarWrapper.setStyleName( "files-toolbar" ); //$NON-NLS-1$ topPanel.add( toolbarWrapper ); topPanel.add( new SolutionTreeWrapper( solutionTree ) ); solutionNavigatorPanel.setStyleName( "puc-vertical-split-panel" ); solutionNavigatorPanel.setWidth( "100%" ); solutionNavigatorPanel.addNorth( topPanel, 500 ); solutionNavigatorPanel.add( filesListPanel ); navigatorAndContentSplit.setStyleName( "puc-horizontal-split-panel" ); navigatorAndContentSplit.addWest( solutionNavigatorPanel, 300 ); navigatorAndContentSplit.add( contentTabPanel ); navigatorAndContentSplit.getElement().setAttribute( "id", "solutionNavigatorAndContentPanel" ); Window.addResizeHandler( new ResizeHandler() { @Override public void onResize( ResizeEvent event ) { adjustContentPanelSize(); } } ); solutionNavigatorPanel.getElement().getParentElement().addClassName( "puc-navigator-panel" ); solutionNavigatorPanel.getElement().getParentElement().removeAttribute( "style" ); setStyleName( "panelWithTitledToolbar" ); //$NON-NLS-1$ setHeight( "100%" ); //$NON-NLS-1$ setWidth( "100%" ); //$NON-NLS-1$ add( navigatorAndContentSplit ); sinkEvents( Event.MOUSEEVENTS ); navigatorAndContentSplit.getWidget( 1 ).setWidth( "100%" ); navigatorAndContentSplit.getElement().getStyle().setHeight( 1, Unit.PX ); contentTabPanel.getElement().getStyle().setHeight( 1, Unit.PX ); } private static native String setElementHeightOffset( Element ele, int offset ) /*-{ var h = 0; if ($wnd.innerHeight) { h = $wnd.innerHeight; } else if ($wnd.document.documentElement && $wnd.document.documentElement.clientHeight != 0) { h = $wnd.document.documentElement.clientHeight; } else if ($wnd.document.body) { h = $wnd.document.body.clientHeight; } var height = h + offset - 5; var offSetHeight = height + 'px'; ele.style.height = offSetHeight; }-*/; private void adjustHeight() { Element pucHeader = DOM.getElementById( "pucHeader" ); if ( pucHeader != null ) { final boolean isIE = RootPanel.getBodyElement().getClassName().contains( "IE8" ) || RootPanel.getBodyElement().getClassName().contains( "IE9" ) || RootPanel.getBodyElement().getClassName().contains( "IE10" ); final int offset = pucHeader.getOffsetHeight(); setElementHeightOffset( navigatorAndContentSplit.getElement(), -1 * offset ); setElementHeightOffset( contentTabPanel.getElement(), isIE ? -1 * ( offset + 36 ) : -1 * offset ); Timer t = new Timer() { public void run() { setElementHeightOffset( navigatorAndContentSplit.getElement(), -1 * offset ); setElementHeightOffset( contentTabPanel.getElement(), isIE ? -1 * ( offset + 36 ) : -1 * offset ); } }; t.schedule( 100 ); } } private void adjustWidth() { int splitterWidth = navigatorAndContentSplit.getSplitterSize(); int adjustedWidth = solutionNavigatorPanel.getOffsetWidth() + splitterWidth; int width = this.getOffsetWidth() - adjustedWidth; if ( width > 0 ) { contentTabPanel.setWidth( width + "px" ); } } public void adjustContentPanelSize() { if ( resizeTimer == null ) { resizeTimer = new Timer() { public void run() { resizeTimer = null; adjustWidth(); adjustHeight(); } }; resizeTimer.schedule( 100 ); } } private static native void setupNativeHooks( SolutionBrowserPanel solutionNavigator ) /*-{ $wnd.sendMouseEvent = function (event) { //CHECKSTYLE IGNORE LineLength FOR NEXT 1 LINES return solutionNavigator.@org.pentaho.mantle.client.solutionbrowser.SolutionBrowserPanel::mouseUp(Lcom/google/gwt/user/client/Event;)(event); } $wnd.mantle_setNavigatorShowing = function (show) { //CHECKSTYLE IGNORE LineLength FOR NEXT 1 LINES return solutionNavigator.@org.pentaho.mantle.client.solutionbrowser.SolutionBrowserPanel::setNavigatorShowing(Z)(show); } $wnd.mantle_confirmBackgroundExecutionDialog = function (url) { //CHECKSTYLE IGNORE LineLength FOR NEXT 1 LINES @org.pentaho.mantle.client.dialogs.scheduling.ScheduleHelper::confirmBackgroundExecutionDialog(Ljava/lang/String;)(url); } $wnd.mantle_openRepositoryFile = function (pathToFile, mode) { //CHECKSTYLE IGNORE LineLength FOR NEXT 1 LINES solutionNavigator.@org.pentaho.mantle.client.solutionbrowser.SolutionBrowserPanel::openFile(Ljava/lang/String;Ljava/lang/String;)(pathToFile, mode); } $wnd.mantle_addFavorite = function (pathToFile, title) { //CHECKSTYLE IGNORE LineLength FOR NEXT 1 LINES solutionNavigator.@org.pentaho.mantle.client.solutionbrowser.SolutionBrowserPanel::addFavorite(Ljava/lang/String;Ljava/lang/String;)(pathToFile, title); } $wnd.mantle_removeFavorite = function (pathToFile) { //CHECKSTYLE IGNORE LineLength FOR NEXT 1 LINES solutionNavigator.@org.pentaho.mantle.client.solutionbrowser.SolutionBrowserPanel::removeFavorite(Ljava/lang/String;)(pathToFile); } $wnd.mantle_isNavigatorShowing = function () { //CHECKSTYLE IGNORE LineLength FOR NEXT 1 LINES return solutionNavigator.@org.pentaho.mantle.client.solutionbrowser.SolutionBrowserPanel::isNavigatorShowing()(); } $wnd.mantle_setDashboardsFilter = function (filters) { //CHECKSTYLE IGNORE LineLength FOR NEXT 1 LINES solutionNavigator.@org.pentaho.mantle.client.solutionbrowser.SolutionBrowserPanel::setDashboardsFilter(Lcom/google/gwt/core/client/JsArrayString;)(filters); } }-*/; public void setDashboardsFilter( JsArrayString filters ) { this.filters = filters; } /** * This method is called via JSNI */ private void mouseUp( Event e ) { navigatorAndContentSplit.onBrowserEvent( e ); } @SuppressWarnings( "nls" ) public static String pathToId( String path ) { String id = NameUtils.encodeRepositoryPath( path ); return NameUtils.URLEncode( id ); } public List<String> getExecutableFileExtensions() { return executableFileExtensions; } public void openFile( final String fileNameWithPath, final String mode ) { FileCommand.COMMAND realMode = COMMAND.RUN; try { realMode = FileCommand.COMMAND.valueOf( mode.toUpperCase() ); } catch ( IllegalArgumentException e ) { // bad mode passed in, using default } openFile( fileNameWithPath, realMode ); } public void getFile( final String solutionPath, final SolutionFileHandler handler ) { final String moduleBaseURL = GWT.getModuleBaseURL(); final String moduleName = GWT.getModuleName(); final String contextURL = moduleBaseURL.substring( 0, moduleBaseURL.lastIndexOf( moduleName ) ); final String path = solutionPath; // Expecting some encoding here final String url = contextURL + "api/repo/files/" + pathToId( path ) + "/properties"; //$NON-NLS-1$ RequestBuilder executableTypesRequestBuilder = new RequestBuilder( RequestBuilder.GET, url ); executableTypesRequestBuilder.setHeader( "accept", "application/json" ); executableTypesRequestBuilder.setHeader( "If-Modified-Since", "01 Jan 1970 00:00:00 GMT" ); try { executableTypesRequestBuilder.sendRequest( null, new RequestCallback() { public void onError( Request request, Throwable exception ) { // showError(exception); } public void onResponseReceived( Request request, Response response ) { if ( response.getStatusCode() == Response.SC_OK ) { JSONObject jsonObject = new JSONObject(); jsonObject.put( "repositoryFileDto", (JSONObject) JSONParser.parseLenient( response.getText() ) ); RepositoryFile repositoryFile = new RepositoryFile( jsonObject ); handler.handle( repositoryFile ); } } } ); } catch ( RequestException e ) { // showError(e); } } public void openFile( final String fileNameWithPath, final FileCommand.COMMAND mode ) { final String moduleBaseURL = GWT.getModuleBaseURL(); final String moduleName = GWT.getModuleName(); final String contextURL = moduleBaseURL.substring( 0, moduleBaseURL.lastIndexOf( moduleName ) ); final String path = fileNameWithPath; // Expecting some encoding here final String url = contextURL + "api/repo/files/" + pathToId( path ) + "/properties"; //$NON-NLS-1$ RequestBuilder executableTypesRequestBuilder = new RequestBuilder( RequestBuilder.GET, url ); executableTypesRequestBuilder.setHeader( "accept", "application/json" ); executableTypesRequestBuilder.setHeader( "If-Modified-Since", "01 Jan 1970 00:00:00 GMT" ); try { executableTypesRequestBuilder.sendRequest( null, new RequestCallback() { public void onError( Request request, Throwable exception ) { // showError(exception); } public void onResponseReceived( Request request, Response response ) { if ( response.getStatusCode() == Response.SC_OK ) { JSONObject jsonObject = new JSONObject(); jsonObject.put( "repositoryFileDto", (JSONObject) JSONParser.parseLenient( response.getText() ) ); RepositoryFile repositoryFile = new RepositoryFile( jsonObject ); openFile( repositoryFile, mode ); } } } ); } catch ( RequestException e ) { // showError(e); } } public void openFile( final RepositoryFile repositoryFile, final FileCommand.COMMAND mode ) { String fileNameWithPath = repositoryFile.getPath(); if ( mode == FileCommand.COMMAND.EDIT ) { PerspectiveManager.getInstance().setPerspective( PerspectiveManager.OPENED_PERSPECTIVE ); editFile( repositoryFile ); } else if ( mode == FileCommand.COMMAND.SCHEDULE_NEW ) { ScheduleHelper.createSchedule( repositoryFile, new ScheduleCallback( repositoryFile ) ); return; } else if ( mode == FileCommand.COMMAND.SHARE ) { ShareFileCommand sfc = new ShareFileCommand(); sfc.setSolutionPath( fileNameWithPath ); sfc.execute(); } else { String url = null; String extension = ""; //$NON-NLS-1$ if ( fileNameWithPath.lastIndexOf( FILE_EXTENSION_DELIMETER ) > 0 ) { //$NON-NLS-1$ extension = fileNameWithPath.substring( fileNameWithPath.lastIndexOf( FILE_EXTENSION_DELIMETER ) + 1 ); //$NON-NLS-1$ } if ( !executableFileExtensions.contains( extension ) ) { url = getPath() + "api/repos/" + pathToId( fileNameWithPath ) + "/content"; //$NON-NLS-1$ //$NON-NLS-2$ } else { ContentTypePlugin plugin = PluginOptionsHelper.getContentTypePlugin( fileNameWithPath ); url = getPath() + "api/repos/" + pathToId( fileNameWithPath ) + "/" + ( plugin != null && ( plugin.getCommandPerspective( mode ) != null ) ? plugin.getCommandPerspective( mode ) : "generatedContent" ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ } // force to open pdf files in another window due to issues with pdf readers in IE browsers // via class added on themeResources for IE browsers boolean pdfReaderEmbeded = RootPanel.getBodyElement().getClassName().contains( "pdfReaderEmbeded" ); if ( mode == FileCommand.COMMAND.NEWWINDOW || ( extension.equals( "pdf" ) && pdfReaderEmbeded ) ) { Window.open( url, "_blank", "menubar=yes,location=no,resizable=yes,scrollbars=yes,status=no" ); //$NON-NLS-1$ //$NON-NLS-2$ } else { PerspectiveManager.getInstance().setPerspective( PerspectiveManager.OPENED_PERSPECTIVE ); contentTabPanel.showNewURLTab( repositoryFile.getTitle(), repositoryFile.getTitle(), url, true ); addRecent( fileNameWithPath, repositoryFile.getTitle() ); } } // Store representation of file in the frame for reference later when // save is called String fileName = repositoryFile.getName(); if ( fileName.contains( FILE_EXTENSION_DELIMETER ) ) { fileName = fileName.substring( 0, fileName.lastIndexOf( FILE_EXTENSION_DELIMETER ) ); } String filePath = repositoryFile.getPath(); if ( filePath.endsWith( repositoryFile.getName() ) ) { filePath = filePath.substring( 0, filePath.lastIndexOf( repositoryFile.getName() ) - 1 ); } SolutionFileInfo fileInfo = new SolutionFileInfo(); fileInfo.setName( fileName ); fileInfo.setPath( filePath ); fileInfo.setType( SolutionFileInfo.Type.XACTION ); if ( contentTabPanel != null && contentTabPanel.getCurrentFrame() != null ) { contentTabPanel.getCurrentFrame().setFileInfo( fileInfo ); } } public void addRecent( String fileNameWithPath, String title ) { RecentPickItem recentPickItem = new RecentPickItem( fileNameWithPath ); recentPickItem.setTitle( title ); recentPickItem.setLastUse( System.currentTimeMillis() ); RecentPickList.getInstance().add( recentPickItem ); } public void removeRecent( String fileNameWithPath ) { RecentPickItem recentItem = new RecentPickItem( fileNameWithPath ); RecentPickList.getInstance().remove( recentItem ); } public void addFavorite( String fileNameWithPath, String title ) { FavoritePickItem favoritePickItem = new FavoritePickItem( fileNameWithPath ); favoritePickItem.setTitle( title ); FavoritePickList.getInstance().add( favoritePickItem ); } public void removeFavorite( String fileNameWithPath ) { FavoritePickItem favoritePickItem = new FavoritePickItem( fileNameWithPath ); FavoritePickList.getInstance().remove( favoritePickItem ); } public void setDeepLinkUrl( String fileNameWithPath ) { ContentTypePlugin plugin = PluginOptionsHelper.getContentTypePlugin( fileNameWithPath ); if ( plugin != null && plugin.hasCommand( COMMAND.RUN ) ) { String url = getPath() + "api/repos/" + pathToId( fileNameWithPath ) + "/" + plugin.getCommandPerspective( COMMAND.RUN ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ contentTabPanel.getCurrentFrame().setDeepLinkUrl( url ); } } protected void initializeExecutableFileTypes() { final String moduleBaseURL = GWT.getModuleBaseURL(); final String moduleName = GWT.getModuleName(); final String contextURL = moduleBaseURL.substring( 0, moduleBaseURL.lastIndexOf( moduleName ) ); final String url = contextURL + "api/repos/executableTypes"; //$NON-NLS-1$ RequestBuilder executableTypesRequestBuilder = new RequestBuilder( RequestBuilder.GET, url ); executableTypesRequestBuilder.setHeader( "accept", "application/json" ); executableTypesRequestBuilder.setHeader( "If-Modified-Since", "01 Jan 1970 00:00:00 GMT" ); try { executableTypesRequestBuilder.sendRequest( null, new RequestCallback() { public void onError( Request request, Throwable exception ) { // showError(exception); } public void onResponseReceived( Request request, Response response ) { if ( response.getStatusCode() == Response.SC_OK ) { JSONObject jsonObject = (JSONObject) JSONParser.parse( response.getText() ); JSONArray jsonList = (JSONArray) jsonObject.get( "executableFileTypeDto" ); for ( int i = 0; i < jsonList.size(); i++ ) { JSONObject executableType = (JSONObject) jsonList.get( i ); executableFileExtensions.add( executableType.get( "extension" ).isString().stringValue() ); } } } } ); } catch ( RequestException e ) { // showError(e); } } public void editFile( final RepositoryFile file ) { if ( file.getName().endsWith( ".analysisview.xaction" ) ) { //$NON-NLS-1$ openFile( file, COMMAND.RUN ); } else { // check to see if a plugin supports editing ContentTypePlugin plugin = PluginOptionsHelper.getContentTypePlugin( file.getName() ); if ( plugin != null && plugin.hasCommand( COMMAND.EDIT ) ) { // load the editor for this plugin String editUrl = getPath() + "api/repos/" + pathToId( file.getPath() ) + "/" + ( plugin != null && ( plugin.getCommandPerspective( COMMAND.EDIT ) != null ) ? plugin.getCommandPerspective( COMMAND.EDIT ) : "editor" ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ // See if it's already loaded for ( int i = 0; i < contentTabPanel.getTabCount(); i++ ) { Widget w = contentTabPanel.getTab( i ).getContent(); if ( w instanceof IFrameTabPanel && ( (IFrameTabPanel) w ).getUrl().endsWith( editUrl ) ) { // Already up, select and exit contentTabPanel.selectTab( i ); return; } } contentTabPanel.showNewURLTab( Messages.getString( "editingColon" ) + file.getTitle(), Messages .getString( "editingColon" ) + file.getTitle(), editUrl, true ); //$NON-NLS-1$ //$NON-NLS-2$ } else { MessageDialogBox dialogBox = new MessageDialogBox( Messages.getString( "error" ), //$NON-NLS-1$ Messages.getString( "cannotEditFileType" ), //$NON-NLS-1$ true, false, true ); dialogBox.center(); } } } public void editFile() { if ( filesListPanel.getSelectedFileItems() == null || filesListPanel.getSelectedFileItems().size() != 1 ) { return; } RepositoryFile file = filesListPanel.getSelectedFileItems().get( 0 ).getRepositoryFile(); if ( file.getName().endsWith( ".analysisview.xaction" ) ) { //$NON-NLS-1$ openFile( file, COMMAND.RUN ); } else { // check to see if a plugin supports editing ContentTypePlugin plugin = PluginOptionsHelper.getContentTypePlugin( file.getName() ); if ( plugin != null && plugin.hasCommand( COMMAND.EDIT ) ) { // load the editor for this plugin String editUrl = getPath() + "api/repos/" + pathToId( file.getPath() ) + "/" + ( plugin != null && ( plugin.getCommandPerspective( COMMAND.EDIT ) != null ) ? plugin.getCommandPerspective( COMMAND.EDIT ) : "editor" ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ // See if it's already loaded for ( int i = 0; i < contentTabPanel.getTabCount(); i++ ) { Widget w = contentTabPanel.getTab( i ).getContent(); if ( w instanceof IFrameTabPanel && ( (IFrameTabPanel) w ).getUrl().endsWith( editUrl ) ) { // Already up, select and exit contentTabPanel.selectTab( i ); return; } } contentTabPanel .showNewURLTab( Messages.getString( "editingColon" ) + file.getTitle(), Messages.getString( "editingColon" ) + file.getTitle(), editUrl, true ); //$NON-NLS-1$ //$NON-NLS-2$ } else { MessageDialogBox dialogBox = new MessageDialogBox( Messages.getString( "error" ), //$NON-NLS-1$ Messages.getString( "cannotEditFileType" ), //$NON-NLS-1$ true, false, true ); dialogBox.center(); } } } public void executeActionSequence( final FileCommand.COMMAND mode ) { if ( filesListPanel.getSelectedFileItems() == null || filesListPanel.getSelectedFileItems().size() != 1 ) { return; } // open in content panel AbstractCommand authCmd = new AbstractCommand() { protected void performOperation() { performOperation( false ); } protected void performOperation( boolean feedback ) { final FileItem selectedFileItem = filesListPanel.getSelectedFileItems().get( 0 ); String url = null; url = "api/repo/files/" + SolutionBrowserPanel.pathToId( filesListPanel.getSelectedFileItems().get( 0 ).getRepositoryFile().getPath() ) + "/generatedContent"; //$NON-NLS-1$ //$NON-NLS-2$ url = getPath() + url; if ( mode == FileCommand.COMMAND.BACKGROUND ) { MessageDialogBox dialogBox = new MessageDialogBox( Messages.getString( "info" ), //$NON-NLS-1$ Messages.getString( "backgroundExecutionWarning" ), //$NON-NLS-1$ true, false, true ); dialogBox.center(); url += "&background=true"; //$NON-NLS-1$ RequestBuilder builder = new RequestBuilder( RequestBuilder.GET, url ); try { builder.setHeader( "If-Modified-Since", "01 Jan 1970 00:00:00 GMT" ); builder.sendRequest( null, new RequestCallback() { public void onError( Request request, Throwable exception ) { MessageDialogBox dialogBox = new MessageDialogBox( Messages.getString( "error" ), Messages.getString( "couldNotBackgroundExecute" ), false, false, true ); //$NON-NLS-1$ //$NON-NLS-2$ dialogBox.center(); } public void onResponseReceived( Request request, Response response ) { } } ); } catch ( RequestException e ) { // ignored } } else if ( mode == FileCommand.COMMAND.NEWWINDOW ) { // popup blockers might attack this Window.open( url, "_blank", "menubar=yes,location=no,resizable=yes,scrollbars=yes,status=no" ); //$NON-NLS-1$ //$NON-NLS-2$ } else if ( mode == FileCommand.COMMAND.SUBSCRIBE ) { final String myurl = url + "&subscribepage=yes"; //$NON-NLS-1$ contentTabPanel.showNewURLTab( selectedFileItem.getLocalizedName(), selectedFileItem.getLocalizedName(), myurl, true ); } else { contentTabPanel.showNewURLTab( selectedFileItem.getLocalizedName(), selectedFileItem.getLocalizedName(), url, true ); } } }; authCmd.execute(); } public MantleTabPanel getContentTabPanel() { return contentTabPanel; } public boolean isAdministrator() { return isAdministrator; } public void setAdministrator( boolean isAdministrator ) { this.isAdministrator = isAdministrator; solutionTree.setAdministrator( isAdministrator ); } public boolean isScheduler() { return isScheduler; } public void setScheduler( boolean isScheduler ) { this.isScheduler = isScheduler; } public boolean isNavigatorShowing() { return showSolutionBrowser; } public void setNavigatorShowing( final boolean showSolutionBrowser ) { this.showSolutionBrowser = showSolutionBrowser; if ( showSolutionBrowser ) { solutionNavigatorPanel.setVisible( true ); //$NON-NLS-1$ navigatorAndContentSplit.setWidgetSize( solutionNavigatorPanel, defaultSplitPosition ); // Show splitter pane if ( this.navigatorAndContentSplit != null ) { for ( int i = 0; i < this.navigatorAndContentSplit.getWidgetCount(); i++ ) { if ( this.navigatorAndContentSplit.getWidget( i ).getStyleName().equals( "gwt-SplitLayoutPanel-HDragger" ) ) { this.navigatorAndContentSplit.getWidget( i ).getElement().getParentElement().removeClassName( "hidden" ); this.contentTabPanel.getElement().getParentElement().removeClassName( "alignleft" ); } } } } else { // Hide splitter pane if ( this.navigatorAndContentSplit != null ) { for ( int i = 0; i < this.navigatorAndContentSplit.getWidgetCount(); i++ ) { if ( this.navigatorAndContentSplit.getWidget( i ).getStyleName().equals( "gwt-SplitLayoutPanel-HDragger" ) ) { this.navigatorAndContentSplit.getWidget( i ).getElement().getParentElement().setClassName( "hidden" ); this.contentTabPanel.getElement().getParentElement().setClassName( "alignleft" ); } } } navigatorAndContentSplit.setWidgetSize( solutionNavigatorPanel, 0 ); solutionNavigatorPanel.setVisible( false ); } adjustContentPanelSize(); } public SolutionTree getSolutionTree() { return solutionTree; } public FilesListPanel getFilesListPanel() { return filesListPanel; } public PickupDragController getDragController() { return dragController; } public void setDragController( PickupDragController dragController ) { this.dragController = dragController; } public String getPath() { String mypath = Window.Location.getPath(); if ( !mypath.endsWith( "/" ) ) { //$NON-NLS-1$ mypath = mypath.substring( 0, mypath.lastIndexOf( "/" ) + 1 ); //$NON-NLS-1$ } mypath = mypath.replaceAll( "/mantle/", "/" ); //$NON-NLS-1$ //$NON-NLS-2$ if ( !mypath.endsWith( "/" ) ) { //$NON-NLS-1$ mypath = "/" + mypath; //$NON-NLS-1$ } return mypath; } private static final native String encodeUri( String URI ) /*-{ return encodeURIComponent(URI); }-*/; }