/*
* Copyright 2016 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.guvnor.structure.client.editors.fileexplorer;
import java.util.HashMap;
import java.util.Map;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Style;
import com.google.gwt.event.logical.shared.OpenEvent;
import com.google.gwt.event.logical.shared.OpenHandler;
import com.google.gwt.event.logical.shared.SelectionEvent;
import com.google.gwt.event.logical.shared.SelectionHandler;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlowPanel;
import org.guvnor.structure.client.resources.i18n.CommonConstants;
import org.guvnor.structure.repositories.Repository;
import org.uberfire.backend.vfs.Path;
import org.uberfire.ext.widgets.core.client.tree.Tree;
import org.uberfire.ext.widgets.core.client.tree.TreeItem;
public class FileExplorerViewImpl
extends Composite
implements FileExplorerView {
private CommonConstants constants = CommonConstants.INSTANCE;
TreeItem rootTreeItem = null;
private final Tree tree = GWT.create( Tree.class );
private final FlowPanel panel = GWT.create( FlowPanel.class );
private final Map<Repository, TreeItem> repositoryToTreeItemMap = new HashMap<Repository, TreeItem>();
private static final String REPOSITORY_ID = "repositories";
private FileExplorerPresenter presenter = null;
public void init( final FileExplorerPresenter presenter ) {
this.presenter = presenter;
rootTreeItem = tree.addItem( TreeItem.Type.FOLDER, constants.Repositories() );
rootTreeItem.setState( TreeItem.State.OPEN );
panel.getElement().getStyle().setFloat( Style.Float.LEFT );
panel.getElement().getStyle().setWidth( 100, Style.Unit.PCT );
panel.add( tree );
initWidget( panel );
tree.addOpenHandler( new OpenHandler<TreeItem>() {
@Override
public void onOpen( final OpenEvent<TreeItem> event ) {
if ( needsLoading( event.getTarget() ) ) {
presenter.loadDirectoryContent( new FileExplorerItem( event.getTarget() ), (Path) event.getTarget().getUserObject() );
}
}
} );
tree.addSelectionHandler( new SelectionHandler<TreeItem>() {
@Override
public void onSelection( SelectionEvent<TreeItem> event ) {
final Object userObject = event.getSelectedItem().getUserObject();
if ( userObject != null && userObject instanceof Path ) {
final Path path = (Path) userObject;
presenter.redirect( path );
} else if ( userObject != null && userObject instanceof Repository ) {
final Repository root = (Repository) userObject;
presenter.redirect( root );
} else if ( event.getSelectedItem().getUserObject() instanceof String &&
( event.getSelectedItem().getUserObject() ).equals( REPOSITORY_ID ) ) {
presenter.redirectRepositoryList();
}
}
} );
}
@Override
public void reset() {
rootTreeItem.setUserObject( REPOSITORY_ID );
rootTreeItem.addItem( TreeItem.Type.LOADING, constants.Loading() );
rootTreeItem.removeItems();
repositoryToTreeItemMap.clear();
}
@Override
public void removeRepository( final Repository repo ) {
if ( !repositoryToTreeItemMap.containsKey( repo ) ) {
return;
}
final TreeItem repositoryRootItem = repositoryToTreeItemMap.remove( repo );
repositoryRootItem.remove();
}
@Override
public void addNewRepository( final Repository repository,
final String branch ) {
final TreeItem repositoryRootItem = rootTreeItem.addItem( TreeItem.Type.FOLDER,
repository.getAlias() );
repositoryRootItem.setUserObject( repository );
repositoryRootItem.setState( TreeItem.State.OPEN,
false,
false );
repositoryToTreeItemMap.put( repository,
repositoryRootItem );
presenter.loadDirectoryContent( new FileExplorerItem( repositoryRootItem ),
repository.getBranchRoot( branch ) );
}
boolean needsLoading( final TreeItem item ) {
return item.getUserObject() instanceof Path
&& item.getType() == TreeItem.Type.FOLDER
&& item.getChildCount() == 1
&& constants.Loading().equals( item.getChild( 0 ).getText() );
}
}