Skip to content
This repository has been archived by the owner on Nov 9, 2017. It is now read-only.

Commit

Permalink
Merge branch 'master' of github.com:zanata/zanata into integration/ma…
Browse files Browse the repository at this point in the history
…ster
  • Loading branch information
Patrick Huang committed May 29, 2012
2 parents 68338a1 + 61bec30 commit 4e37a0b
Show file tree
Hide file tree
Showing 12 changed files with 142 additions and 58 deletions.
Expand Up @@ -114,7 +114,7 @@ public void searchProjectAndVersion()
{
try
{
this.searchResults = versionGroupServiceImpl.searchBySlugAndProjectSlug(this.searchTerm);
this.searchResults = versionGroupServiceImpl.searchLikeSlugOrProjectSlug(this.searchTerm);
}
catch (ParseException e)
{
Expand Down
Expand Up @@ -20,6 +20,7 @@
*/
package org.zanata.action;

import java.util.ArrayList;
import java.util.List;

import javax.faces.event.ValueChangeEvent;
Expand All @@ -36,6 +37,7 @@
import org.zanata.common.EntityStatus;
import org.zanata.model.HAccount;
import org.zanata.model.HIterationGroup;
import org.zanata.model.HProjectIteration;

/**
* @author Alex Eng <a href="mailto:aeng@redhat.com">aeng@redhat.com</a>
Expand All @@ -58,6 +60,11 @@ protected HIterationGroup loadInstance()
return (HIterationGroup) session.createCriteria(getEntityClass()).add(Restrictions.naturalId().set("slug", getSlug())).setCacheable(true).uniqueResult();
}

public List<HProjectIteration> getInstanceProjectIterations()
{
return new ArrayList<HProjectIteration>(getInstance().getProjectIterations());
}

@Override
public NaturalIdentifier getNaturalId()
{
Expand Down
30 changes: 20 additions & 10 deletions zanata-war/src/main/java/org/zanata/dao/ProjectIterationDAO.java
Expand Up @@ -298,16 +298,26 @@ public int getTotalObsoleteProjectIterCount()
return totalCount.intValue();
}

public List<HProjectIteration> searchBySlugAndProjectSlug(String searchTerm) throws ParseException
public List<HProjectIteration> searchLikeSlugOrProjectSlug(String searchTerm) throws ParseException
{
final String FIELDS[] = { "slug", GroupSearchBridge.PROJECT_FIELD };

MultiFieldQueryParser parser = new MultiFieldQueryParser(Version.LUCENE_29, FIELDS, new StandardAnalyzer(Version.LUCENE_29));
org.apache.lucene.search.Query textQuery = parser.parse(searchTerm);

org.hibernate.search.jpa.FullTextQuery ftQuery = entityManager.createFullTextQuery(textQuery, HProjectIteration.class);
@SuppressWarnings("unchecked")
List<HProjectIteration> matches = (List<HProjectIteration>) ftQuery.getResultList();
return matches;
Query q = getSession().createQuery("from HProjectIteration t where t.slug LIKE :searchTerm OR t.project.slug LIKE :searchTerm");
q.setParameter("searchTerm", "%" + searchTerm + "%");
q.setCacheable(true).setComment("ProjectIterationDAO.searchLikeSlugOrProjectSlug");

return q.list();

// final String FIELDS[] = { "slug", GroupSearchBridge.PROJECT_FIELD };
//
// MultiFieldQueryParser parser = new
// MultiFieldQueryParser(Version.LUCENE_29, FIELDS, new
// StandardAnalyzer(Version.LUCENE_29));
// org.apache.lucene.search.Query textQuery = parser.parse(searchTerm);
//
// org.hibernate.search.jpa.FullTextQuery ftQuery =
// entityManager.createFullTextQuery(textQuery, HProjectIteration.class);
// @SuppressWarnings("unchecked")
// List<HProjectIteration> matches = (List<HProjectIteration>)
// ftQuery.getResultList();
// return matches;
}
}
Expand Up @@ -36,7 +36,7 @@ public interface VersionGroupService

HIterationGroup getBySlug(String slug);

List<HProjectIteration> searchBySlugAndProjectSlug(String searchTerm) throws ParseException;
List<HProjectIteration> searchLikeSlugOrProjectSlug(String searchTerm) throws ParseException;

List<HPerson> getMaintainerBySlug(String slug);

Expand Down
Expand Up @@ -85,9 +85,9 @@ public HIterationGroup getBySlug(String slug)
}

@Override
public List<HProjectIteration> searchBySlugAndProjectSlug(String searchTerm) throws ParseException
public List<HProjectIteration> searchLikeSlugOrProjectSlug(String searchTerm) throws ParseException
{
return projectIterationDAO.searchBySlugAndProjectSlug(searchTerm);
return projectIterationDAO.searchLikeSlugOrProjectSlug(searchTerm);
}

@Override
Expand Down
Expand Up @@ -88,6 +88,9 @@
public class SearchResultsPresenter extends WidgetPresenter<SearchResultsPresenter.Display>
{

private static final int MAX_VISIBLE_REPLACEMENT_MESSAGES = 5;
private static final int TRUNCATED_TARGET_LENGTH = 24;

public interface Display extends WidgetDisplay
{
HasText getSearchResponseLabel();
Expand Down Expand Up @@ -142,14 +145,14 @@ public interface Display extends WidgetDisplay
*
* @param message
* @param undoButtonHandler
* @see #clearReplacementMessage()
* @see #clearReplacementMessages()
*/
void setReplacementMessage(String message, ClickHandler undoButtonHandler);
void addReplacementMessage(String message, ClickHandler undoButtonHandler);

/**
* @see #setReplacementMessage(String, ClickHandler)
* @see #addReplacementMessage(String, ClickHandler)
*/
void clearReplacementMessage();
void clearReplacementMessages();

HasData<TransUnitReplaceInfo> addDocument(
String docName,
Expand Down Expand Up @@ -193,6 +196,9 @@ HasData<TransUnitReplaceInfo> addDocument(
*/
private HistoryToken currentHistoryState = null;

private List<ReplacementEventInfo> replacementEvents;

private Map<Long, String> docPaths;

@Inject
public SearchResultsPresenter(Display display, EventBus eventBus,
Expand Down Expand Up @@ -223,6 +229,7 @@ protected void onBind()
documentDataProviders = new HashMap<Long, ListDataProvider<TransUnitReplaceInfo>>();
documentSelectionModels = new HashMap<Long, MultiSelectionModel<TransUnitReplaceInfo>>();
allReplaceInfos = new HashMap<TransUnitId, TransUnitReplaceInfo>();
docPaths = new HashMap<Long, String>();
setUiForNothingSelected();
display.setReplaceAllButtonVisible(!workspaceContext.isReadOnly());

Expand Down Expand Up @@ -756,20 +763,37 @@ public void onFailure(Throwable e)
@Override
public void onSuccess(final UpdateTransUnitResult result)
{
final List<TransUnitUpdateInfo> updateInfoList = result.getUpdateInfoList();
int successes = processSuccessfulReplacements(updateInfoList);
final List<TransUnitUpdateInfo> updateInfoList = processSuccessfulReplacements(result.getUpdateInfoList());
eventBus.fireEvent(new NotificationEvent(Severity.Info, messages.replacedTextSuccess()));

String message = messages.replacedTextInMultipleTextFlows(searchText, replacement, successes);
display.setReplacementMessage(message, new ClickHandler()
String message;
if (updateInfoList.size() == 1)
{
TransUnitUpdateInfo info = updateInfoList.get(0);
String text = info.getTransUnit().getTargets().get(0);
String truncatedText = text.substring(0, (text.length() <= TRUNCATED_TARGET_LENGTH ? text.length() : TRUNCATED_TARGET_LENGTH));
int oneBasedRowIndex = info.getTransUnit().getRowIndex()+1;
String docName = docPaths.get(info.getDocumentId().getId());
message = messages.replacedTextInOneTextFlow(searchText, replacement, docName, oneBasedRowIndex, truncatedText);
}
else
{
message = messages.replacedTextInMultipleTextFlows(searchText, replacement, updateInfoList.size());
}
final ReplacementEventInfo replacementInfo = new ReplacementEventInfo(message);
ClickHandler handler = new ClickHandler()
{
@Override
public void onClick(ClickEvent event)
{
display.clearReplacementMessage();
fireUndoEvent(updateInfoList);
ensureReplacementEvents().remove(replacementInfo);
refreshReplacementEventInfoList();
}
});
};
replacementInfo.setHandler(handler);
ensureReplacementEvents().add(replacementInfo);
refreshReplacementEventInfoList();
}
});
}
Expand Down Expand Up @@ -845,14 +869,14 @@ public void onSuccess(UpdateTransUnitResult result)
* @return the number of updates that are
* {@link TransUnitUpdateInfo#isSuccess()}
*/
private int processSuccessfulReplacements(final List<TransUnitUpdateInfo> updateInfoList)
private List<TransUnitUpdateInfo> processSuccessfulReplacements(final List<TransUnitUpdateInfo> updateInfoList)
{
int successes = 0;
List<TransUnitUpdateInfo> successfulReplacements = new ArrayList<TransUnitUpdateInfo>();
for (TransUnitUpdateInfo updateInfo : updateInfoList)
{
if (updateInfo.isSuccess())
{
successes++;
successfulReplacements.add(updateInfo);
TransUnitReplaceInfo replaceInfo = allReplaceInfos.get(updateInfo.getTransUnit().getId());
if (replaceInfo != null)
{
Expand All @@ -867,7 +891,7 @@ private int processSuccessfulReplacements(final List<TransUnitUpdateInfo> update
}
// individual failure behaviour not yet defined
}
return successes;
return successfulReplacements;
}

/**
Expand Down Expand Up @@ -906,6 +930,7 @@ private int displaySearchResults(GetProjectTransUnitListsResult result)
int totalTransUnits = 0;
for (Long docId : result.getDocumentIds())
{
docPaths.put(docId, result.getDocPath(docId));
List<TransUnit> transUnits = result.getUnits(docId);
totalTransUnits += transUnits.size();
displayDocumentResults(docId, result.getDocPath(docId), transUnits);
Expand Down Expand Up @@ -1136,4 +1161,54 @@ private void selectAllTextFlows()
}
}
}

private List<ReplacementEventInfo> ensureReplacementEvents()
{
if (replacementEvents == null)
{
replacementEvents = new ArrayList<ReplacementEventInfo>();
}
return replacementEvents;
}

private void refreshReplacementEventInfoList()
{
display.clearReplacementMessages();
List<ReplacementEventInfo> events = ensureReplacementEvents();
while (events.size() > MAX_VISIBLE_REPLACEMENT_MESSAGES)
{
events.remove(0);
}
for (ReplacementEventInfo info : events)
{
display.addReplacementMessage(info.getMessage(), info.getHandler());
}
}

private class ReplacementEventInfo
{
private String message;
private ClickHandler handler;

public ReplacementEventInfo(String message)
{
this.message = message;
}

public String getMessage()
{
return message;
}

public ClickHandler getHandler()
{
return handler;
}

public void setHandler(ClickHandler handler)
{
this.handler = handler;
}

}
}
Expand Up @@ -192,6 +192,9 @@ public interface WebTransMessages extends Messages
@DefaultMessage("Replaced")
String replaced();

@DefaultMessage("Replaced \"{0}\" with \"{1}\" in {2} row {3} (\"{4}...\")")
String replacedTextInOneTextFlow(String searchText, String replacement, String docName, int oneBasedRowIndex, String truncatedText);

@DefaultMessage("Replaced \"{0}\" with \"{1}\" in {2} text flows")
@AlternateMessage({ "one", "Replaced \"{0}\" with \"{1}\" in 1 text flow" })
String replacedTextInMultipleTextFlows(String searchText, String replacement, @PluralCount int numFlows);
Expand Down
Expand Up @@ -126,8 +126,8 @@ public SearchResultsDocumentTable(Delegate<TransUnitReplaceInfo> previewDelegate
setColumnWidth(rowIndexColumn, 70.0, Unit.PX);
setColumnWidth(sourceColumn, 50.0, Unit.PCT);
setColumnWidth(targetColumn, 50.0, Unit.PCT);
setColumnWidth(previewButtonColumn, 75.0, Unit.PX);
setColumnWidth(replaceButtonColumn, 75.0, Unit.PX);
setColumnWidth(previewButtonColumn, 85.0, Unit.PX);
setColumnWidth(replaceButtonColumn, 85.0, Unit.PX);

sourceColumn.setVerticalAlignment(HasVerticalAlignment.ALIGN_TOP);
targetColumn.setVerticalAlignment(HasVerticalAlignment.ALIGN_TOP);
Expand Down
Expand Up @@ -33,7 +33,6 @@
import com.google.gwt.event.dom.client.HasChangeHandlers;
import com.google.gwt.event.dom.client.HasClickHandlers;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.ui.Button;
Expand Down Expand Up @@ -68,13 +67,13 @@ interface SearchResultsViewUiBinder extends UiBinder<LayoutPanel, SearchResultsV
}

@UiField
VerticalPanel searchResultsPanel;
VerticalPanel searchResultsPanel, replaceLogPanel;

@UiField
TextBox filterTextBox, replacementTextBox;

@UiField
InlineLabel searchResponseLabel, selectAllLink, replaceAllFeedbackLabel, replaceAllUndoLabel, selectionInfoLabel;
InlineLabel searchResponseLabel, selectAllLink, selectionInfoLabel;

@UiField
CheckBox caseSensitiveChk, requirePreviewChk;
Expand All @@ -93,8 +92,6 @@ interface SearchResultsViewUiBinder extends UiBinder<LayoutPanel, SearchResultsV

private Resources resources;

private HandlerRegistration currentUndoMultipleHandler;

@Inject
public SearchResultsView(Resources resources, final WebTransMessages webTransMessages)
{
Expand Down Expand Up @@ -255,24 +252,22 @@ public String getSelectedSearchField()
}

@Override
public void setReplacementMessage(String message, ClickHandler undoButtonHandler)
public void addReplacementMessage(String message, ClickHandler undoButtonHandler)
{
replaceAllFeedbackLabel.setText(message);
replaceAllFeedbackLabel.setVisible(true);

replaceAllUndoLabel.setVisible(true);
if (currentUndoMultipleHandler != null)
{
currentUndoMultipleHandler.removeHandler();
}
currentUndoMultipleHandler = replaceAllUndoLabel.addClickHandler(undoButtonHandler);
FlowPanel logMessage = new FlowPanel();
logMessage.add(new InlineLabel(message));
InlineLabel undoLabel = new InlineLabel(messages.undo());
undoLabel.addClickHandler(undoButtonHandler);
undoLabel.addStyleName("linkLabel");
undoLabel.addStyleName("linkLabelLightColor");
logMessage.add(undoLabel);
replaceLogPanel.add(logMessage);
}

@Override
public void clearReplacementMessage()
public void clearReplacementMessages()
{
replaceAllFeedbackLabel.setVisible(false);
replaceAllUndoLabel.setVisible(false);
replaceLogPanel.clear();
}

@Override
Expand Down
Expand Up @@ -33,14 +33,7 @@
<g:InlineLabel styleName='projectWideReplacementBoxLabel' ><ui:msg>Replace with:</ui:msg></g:InlineLabel>
<g:TextBox ui:field='replacementTextBox' styleName='projectWideReplacementBox' />
<g:cell width="100%">
<!-- TODO make this a scrollable list of messages with undo label each
to allow undo of past replaces. Hide undo label when it is clicked -->
<g:FlowPanel>
<g:InlineLabel ui:field='replaceAllFeedbackLabel' styleName='projectWideReplaceFeedbackLabel' />
<g:InlineLabel ui:field='replaceAllUndoLabel' addStyleNames='linkLabel linkLabelLightColor' visible="false">
<ui:msg>undo</ui:msg>
</g:InlineLabel>
</g:FlowPanel>
<g:VerticalPanel ui:field="replaceLogPanel" />
</g:cell>
<g:cell horizontalAlignment="ALIGN_RIGHT">
<g:VerticalPanel horizontalAlignment="ALIGN_RIGHT">
Expand Down
Expand Up @@ -551,7 +551,8 @@ tr.ApprovedStateDecoration td.TableEditorCell-Target .TableEditorContent-Edit
border-radius: 10px;
-moz-border-radius: 10px;
outline: none;
margin: 15px;
margin-left: 15px;
margin-right: 35px;
}

.projectWideSearchSelectionInfo
Expand Down

0 comments on commit 4e37a0b

Please sign in to comment.