forked from GitHub/gf-core
preliminary UI for storage/retrieval/search of documents in the GF editor
This commit is contained in:
@@ -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);
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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 |
Reference in New Issue
Block a user