package es.upm.fi.dia.oeg.map4rdf.client.widget; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import net.customware.gwt.presenter.client.EventBus; import com.google.gwt.dom.client.Style.Position; import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.dom.client.KeyCodes; import com.google.gwt.event.dom.client.KeyPressEvent; import com.google.gwt.event.dom.client.KeyPressHandler; import com.google.gwt.user.client.ui.AbsolutePanel; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.Image; import com.google.gwt.user.client.ui.InlineHTML; import com.google.gwt.user.client.ui.TextBox; import com.google.gwt.user.client.ui.Widget; import es.upm.fi.dia.oeg.map4rdf.client.presenter.DashboardPresenter; import es.upm.fi.dia.oeg.map4rdf.client.resource.BrowserMessages; import es.upm.fi.dia.oeg.map4rdf.client.resource.BrowserResources; import es.upm.fi.dia.oeg.map4rdf.client.util.LocaleUtil; import es.upm.fi.dia.oeg.map4rdf.client.util.GeoResourceGeometry; import es.upm.fi.dia.oeg.map4rdf.share.GeoResource; import es.upm.fi.dia.oeg.map4rdf.share.Geometry; import es.upm.fi.dia.oeg.map4rdf.share.GeoprocessingType; public class PopupGeoprocessingView extends Composite{ public static interface Stylesheet { String searchPanel(); } private AbsolutePanel mainPanel; private TextBox searchBox; private PopupGeoprocessingViewWidget searchResultsView; private InlineHTML error; private int width; private int height; private DashboardPresenter dashboardPresenter; private BrowserMessages browserMessages; private BrowserResources browserResources; private EventBus eventBus; private GeoprocessingType type; private Map<String,GeoResourceGeometry> searchResults; public PopupGeoprocessingView(int width,int height, DashboardPresenter dashboardPresenter, BrowserMessages browserMessages,BrowserResources browserResources, EventBus eventBus, GeoprocessingType type ){ this.dashboardPresenter = dashboardPresenter; this.browserMessages = browserMessages; this.browserResources = browserResources; this.eventBus=eventBus; this.type=type; this.width=width; this.height=height; if(width>=100){ this.width=width-100; } if(height>=65){ this.height=height-65; } searchResults= new HashMap<String, GeoResourceGeometry>(); initWidget(createUi()); } private Widget createUi() { this.mainPanel = new AbsolutePanel(); searchResultsView= new PopupGeoprocessingViewWidget((int)(width*0.94),(int)(height*0.7),eventBus,dashboardPresenter,type, browserResources); searchBox = new TextBox(); searchBox.setFocus(true); searchBox.addKeyPressHandler(new KeyPressHandler() { @Override public void onKeyPress(KeyPressEvent event) { if(event.getNativeEvent().getCharCode() == KeyCodes.KEY_ENTER ){ doSearch(); } } }); Button closeButton = new Button(); closeButton.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { dashboardPresenter.getDisplay().closeMainPopup(); }}); closeButton.setSize("32px","28px"); closeButton.getElement().appendChild(new Image(browserResources.closeButton()).getElement()); closeButton.setTitle(browserMessages.close()); this.error=new InlineHTML(); this.mainPanel.setWidth(String.valueOf(width)+"px"); this.mainPanel.setHeight(String.valueOf(height)+"px"); this.searchBox.setWidth(String.valueOf((int)(0.8*width))+"px"); InlineHTML inline=new InlineHTML("<a>"+browserMessages.searchAResource()+"</a>"); this.mainPanel.add(closeButton); closeButton.getElement().getStyle().setPosition(Position.ABSOLUTE); closeButton.getElement().getStyle().setTop(1, Unit.PX); closeButton.getElement().getStyle().setProperty("left", ""); closeButton.getElement().getStyle().clearLeft(); closeButton.getElement().getStyle().setRight(1, Unit.PX); closeButton.getElement().getStyle().setZIndex(2080); this.mainPanel.add(new InlineHTML("<br>")); this.mainPanel.add(new InlineHTML("<br>")); this.mainPanel.add(inline); this.mainPanel.add(searchBox); Button buttonSearch=new Button(browserMessages.search(), new ClickHandler() { @Override public void onClick(ClickEvent event) { doSearch(); } }); buttonSearch.setTitle(browserMessages.buttonSearchAResourceTooltip()); this.mainPanel.add(buttonSearch); this.mainPanel.add(new InlineHTML("<br>")); this.mainPanel.add(new InlineHTML("<br>")); this.mainPanel.add(searchResultsView); this.mainPanel.add(new InlineHTML("<br>")); this.mainPanel.add(error); this.mainPanel.add(new InlineHTML("<br>")); this.mainPanel.add(new InlineHTML("<br>")); return mainPanel; } public void search(String text){ if(text!=null && text!=""){ searchBox.setText(text); doSearch(); } } private void doSearch(){ searchResultsView.clear(); searchResults.clear(); if(dashboardPresenter.getListGeoResource()== null || dashboardPresenter.getListGeoResource().isEmpty()){ error.setText(browserMessages.errorNotGeoResource()); return; } if(searchBox.getText()==null || searchBox.getText() == "" || searchBox.getText().isEmpty()){ error.setText(browserMessages.errorNotSearchText()); return; } boolean find=false; for(GeoResource resource:dashboardPresenter.getListGeoResource()){ if(compare(resource,searchBox.getText())){ find=true; addSearchResultGeoResource(resource, resource.getFirstGeometry()); } } if(find == false){ error.setText(browserMessages.error0Search()); } else { putSearchResult(); error.setText(""); } } private void putSearchResult(){ List<String> labels= new ArrayList<String>(searchResults.keySet()); Collections.sort(labels); for(String label:labels){ searchResultsView.addSearchResultGeoResource(label,searchResults.get(label)); } } private void addSearchResultGeoResource(GeoResource resource, Geometry geometry){ String label=LocaleUtil.getBestLabel(resource); searchResults.put(label, new GeoResourceGeometry(resource,geometry)); } private boolean compare(GeoResource resource, String name){ String label=LocaleUtil.getBestLabel(resource); String removedLabel=removeSpecialChars(label); return removedLabel.toLowerCase().contains(name.toLowerCase())||label.toLowerCase().contains(name.toLowerCase()); } private String removeSpecialChars(String input) { String originalString = browserMessages.specialsChars(); String asciiString = browserMessages.specialsCharsSubstitution(); String output = input; for (int i=0; i<originalString.length(); i++) { // Reemplazamos los caracteres especiales. output = output.replace(originalString.charAt(i), asciiString.charAt(i)); } return output; } }