1
0
forked from GitHub/gf-core

preliminary UI for storage/retrieval/search of documents in the GF editor

This commit is contained in:
krasimir
2010-11-01 09:25:22 +00:00
parent 1f8a0f0876
commit ad28e99f35
6 changed files with 157 additions and 29 deletions

View File

@@ -7,46 +7,67 @@ import com.google.gwt.http.client.*;
import com.google.gwt.xml.client.*;
import com.google.gwt.event.logical.shared.*;
import com.google.gwt.event.dom.client.*;
import com.google.gwt.event.shared.*;
public class DocumentsPanel extends Composite {
public class DocumentsPanel extends Composite implements HasSelectionHandlers<Object> {
private PGFWrapper pgf;
private ContentService contentService;
private StatusPopup statusPopup;
private FlexTable table;
private ArrayList documentIds = new ArrayList();
public DocumentsPanel(PGFWrapper pgf) {
public DocumentsPanel(PGFWrapper pgf, ContentService contentService, StatusPopup statusPopup) {
this.pgf = pgf;
this.contentService = contentService;
this.statusPopup = statusPopup;
VerticalPanel documentsPanel = new VerticalPanel();
documentsPanel.setStylePrimaryName("my-DocumentsFrame");
HorizontalPanel searchPanel = new HorizontalPanel();
searchPanel.setStylePrimaryName("my-DocumentsSearchFrame");
TextBox searchBox = new TextBox();
final TextBox searchBox = new TextBox();
searchBox.setWidth("20em");
Button searchBtn = new Button("Search");
final Button searchBtn = new Button("Search");
searchPanel.add(searchBox);
searchPanel.add(searchBtn);
documentsPanel.add(searchPanel);
Label header = new Label("Documents");
Image deleteButton = new Image("org.grammaticalframework.ui.gwt.EditorApp/trash-button.png");
deleteButton.setTitle("Deletes the selected documents.");
deleteButton.setStylePrimaryName("toolbar-button");
deleteButton.addClickListener(new ClickListener () {
public void onClick(Widget sender) {
deleteSelected();
}
});
FlexTable header = new FlexTable();
header.setStylePrimaryName("my-DocumentsHeader");
header.setText(0,0,"Documents");
header.setWidget(0,1,deleteButton);
header.getColumnFormatter().setWidth(1,"20px");
documentsPanel.add(header);
table = new FlexTable();
table.setCellPadding(2);
table.setStylePrimaryName("my-DocumentsTable");
table.getColumnFormatter().setWidth(1,"80em");
table.getColumnFormatter().setWidth(2,"80em");
documentsPanel.add(table);
addRow(0, "Test0");
addRow(1, "Test1");
addRow(2, "Test2");
addRow(3, "Test3");
searchBtn.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
searchDocuments(searchBox.getText());
}
});
table.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
HTMLTable.Cell cell = table.getCellForEvent(event);
if (cell != null) {
int row = cell.getRowIndex();
selectRow(row);
selectDocument(row);
}
}
});
@@ -54,12 +75,68 @@ public class DocumentsPanel extends Composite {
initWidget(documentsPanel);
setStylePrimaryName("my-DocumentsPanel");
}
private void addRow(int row, String text) {
table.setText(row, 0, text);
table.getRowFormatter().addStyleName(row, "row");
public HandlerRegistration addSelectionHandler(SelectionHandler<Object> handler) {
return addHandler(handler, SelectionEvent.getType());
}
protected void selectDocument(int row) {
SelectionEvent.fire(this, documentIds.get(row));
}
private void selectRow(int row) {
}
protected void searchDocuments(String fullTextQuery) {
statusPopup.setStatus("Searching...");
documentIds.clear();
while (table.getRowCount() > 0)
table.removeRow(0);
contentService.search(fullTextQuery, new ContentService.SearchCallback() {
public void onResult(IterableJsArray<ContentService.DocumentSignature> documents) {
for (ContentService.DocumentSignature sign : documents.iterable()) {
int row = table.getRowCount();
table.setWidget(row, 0, new CheckBox(sign.getTitle()));
table.setText(row, 1, sign.getCreated());
table.setText(row, 2, sign.getModified());
table.getRowFormatter().addStyleName(row, "row");
documentIds.add(sign.getId());
}
statusPopup.clearStatus();
}
public void onError(Throwable e) {
statusPopup.showError("Search failed", e);
}
});
}
protected void deleteSelected() {
statusPopup.setStatus("Deleting...");
final ArrayList ids = new ArrayList();
final ArrayList<Integer> rows = new ArrayList<Integer>();
for (int row = 0; row < table.getRowCount(); row++) {
CheckBox checkBox = (CheckBox) table.getWidget(row,0);
if (checkBox.isChecked()) {
ids.add(documentIds.get(row));
rows.add(new Integer(row));
}
}
contentService.delete(ids, new ContentService.DeleteCallback() {
public void onResult(ContentService.DeleteResult result) {
for (Integer row : rows) {
table.removeRow(row.intValue());
}
statusPopup.clearStatus();
}
public void onError(Throwable e) {
statusPopup.showError("Delete failed", e);
}
});
}
}

View File

@@ -12,7 +12,9 @@ import com.google.gwt.event.shared.*;
public class EditorApp implements EntryPoint {
protected static final String pgfBaseURL = "/grammars";
protected static final String contentBaseURL = "/content.fcgi";
protected ContentService contentService;
protected PGFWrapper pgf;
protected VerticalPanel outputPanel;
@@ -24,6 +26,7 @@ public class EditorApp implements EntryPoint {
protected TextInputPanel textPanel;
protected FridgeBagPanel bagPanel;
protected MagnetFactory magnetFactory;
protected TabBar tabBar;
private JSONRequest completeRequest = null;
private JSONRequest translateRequest = null;
@@ -233,7 +236,7 @@ public class EditorApp implements EntryPoint {
}
protected Widget createEditorPanel() {
textPanel = new TextInputPanel();
textPanel = new TextInputPanel(contentService, statusPopup);
textPanel.addValueChangeHandler(new ValueChangeHandler<String>() {
public void onValueChange(ValueChangeEvent<String> event) {
update();
@@ -304,11 +307,18 @@ public class EditorApp implements EntryPoint {
}
protected DocumentsPanel createDocumentsPanel() {
return new DocumentsPanel(pgf);
DocumentsPanel panel = new DocumentsPanel(pgf, contentService, statusPopup);
panel.addSelectionHandler(new SelectionHandler<Object>() {
public void onSelection(SelectionEvent<Object> event) {
tabBar.selectTab(1);
textPanel.load(event.getSelectedItem());
}
});
return panel;
}
protected TabBar createLinksPanel(final Panel parent) {
TabBar tabBar = new TabBar();
tabBar = new TabBar();
tabBar.setStylePrimaryName("my-LinksPanel");
tabBar.addTab("Documents");
tabBar.addTab("Editor");
@@ -426,6 +436,7 @@ public class EditorApp implements EntryPoint {
statusPopup = new StatusPopup();
pgf = new PGFWrapper(pgfBaseURL);
contentService = new ContentService(contentBaseURL);
RootPanel.get().add(createUI());
pgf.addSettingsListener(new MySettingsListener());
pgf.updateAvailableGrammars();

View File

@@ -56,13 +56,13 @@ public class JSONRequestBuilder {
public static <T extends JavaScriptObject> JSONRequest sendDataRequest (String base, List<Arg> vars, String content, final JSONCallback<T> callback) {
String url = getQueryURL(base,vars);
RequestBuilder builder = new RequestBuilder(RequestBuilder.POST, url);
builder.setRequestData(content);
builder.setTimeoutMillis(30000);
builder.setHeader("Content-Length", Integer.toString(content.length()));
builder.setHeader("Accept","text/plain, text/html;q=0.5, */*;q=0.1");
Request request = null;
try {
request = builder.sendRequest(null, new RequestCallback() {
request = builder.sendRequest(content, new RequestCallback() {
public void onError(Request request, Throwable e) {
callback.onError(e);
}

View File

@@ -11,6 +11,8 @@ import com.google.gwt.event.shared.*;
public class TextInputPanel extends Composite implements Focusable, HasValueChangeHandlers<String>, HasSelectionHandlers<String> {
protected ContentService contentService;
protected StatusPopup statusPopup;
protected FlowPanel textPanel = null;
protected FlowPanel mainPanel = null;
protected FocusPanel focusPanel = null;
@@ -28,8 +30,13 @@ public class TextInputPanel extends Composite implements Focusable, HasValueChan
private Map<Integer, Phrase> mapFId2Phrase = new HashMap<Integer, Phrase>();
private ChangeListenerCollection changeListeners = null;
private Integer docId = null;
public TextInputPanel(ContentService contentService, StatusPopup statusPopup) {
this.contentService = contentService;
this.statusPopup = statusPopup;
public TextInputPanel() {
mainPanel = new FlowPanel();
mainPanel.setStylePrimaryName("wordspanel");
@@ -72,7 +79,7 @@ public class TextInputPanel extends Composite implements Focusable, HasValueChan
Image clearButton = new Image("org.grammaticalframework.ui.gwt.EditorApp/textinput-buttons.png",0,0,20,20);
clearButton.setTitle("Clears the whole document.");
clearButton.setStylePrimaryName("button");
clearButton.setStylePrimaryName("toolbar-button");
clearButton.addClickListener(new ClickListener () {
public void onClick(Widget sender) {
clear();
@@ -82,7 +89,7 @@ public class TextInputPanel extends Composite implements Focusable, HasValueChan
Image saveButton = new Image("org.grammaticalframework.ui.gwt.EditorApp/textinput-buttons.png",20,0,20,20);
saveButton.setTitle("Save the document.");
saveButton.setStylePrimaryName("button");
saveButton.setStylePrimaryName("toolbar-button");
saveButton.addClickListener(new ClickListener () {
public void onClick(Widget sender) {
save();
@@ -92,7 +99,7 @@ public class TextInputPanel extends Composite implements Focusable, HasValueChan
Image deleteLastButton = new Image("org.grammaticalframework.ui.gwt.EditorApp/textinput-buttons.png",40,0,20,20);
deleteLastButton.setTitle("Removes the last word.");
deleteLastButton.setStylePrimaryName("button");
deleteLastButton.setStylePrimaryName("toolbar-button");
deleteLastButton.addClickListener(new ClickListener () {
public void onClick(Widget sender) {
deleteLast();
@@ -168,10 +175,43 @@ public class TextInputPanel extends Composite implements Focusable, HasValueChan
focusedPanel = null;
errorPanels = null;
tempPanel = null;
docId = null;
fireValueChange();
}
public void save() {
statusPopup.setStatus("Saving...");
contentService.save(docId, getText(), new ContentService.SaveCallback() {
public void onResult(ContentService.DocumentSignature sign) {
docId = new Integer(sign.getId());
statusPopup.clearStatus();
}
public void onError(Throwable e) {
statusPopup.showError("Saving failed", e);
}
});
}
public void load(Object id) {
statusPopup.setStatus("Loading...");
contentService.load(id, new ContentService.LoadCallback() {
public void onResult(ContentService.Document document) {
clear();
docId = new Integer(document.getId());
showSearchBox();
searchBox.setText(document.getContent());
statusPopup.clearStatus();
}
public void onError(Throwable e) {
statusPopup.showError("Saving failed", e);
}
});
}
public void addMagnet(Magnet magnet) {

View File

@@ -77,12 +77,12 @@
background-repeat: repeat-x;
}
.my-TextInputPanel .toolbar .button {
.toolbar-button {
float: left;
margin: 2px;
}
.my-TextInputPanel .toolbar .button:hover {
.toolbar-button:hover {
margin: 1px;
border: 1px solid rgb(147,194,241);
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 930 B