diff --git a/src/server/ContentService.hs b/src/server/ContentService.hs
index c0d0a713f..297b3c881 100644
--- a/src/server/ContentService.hs
+++ b/src/server/ContentService.hs
@@ -52,22 +52,30 @@ cgiMain' cache path =
case mb_command of
Just "update_grammar"
-> do mb_pgf <- getFile
- id <- getGrammarId
+ id <- getGrammarId
name <- getFileName
descr <- getDescription
- doUpdateGrammar c mb_pgf id name descr
+ userId <- getUserId
+ doUpdateGrammar c mb_pgf id name descr userId
Just "delete_grammar"
-> do id <- getGrammarId
- doDeleteGrammar c id
+ userId <- getUserId
+ doDeleteGrammar c id userId
Just "grammars"
- -> doGrammars c
+ -> do userId <- getUserId
+ doGrammars c userId
Just "save" -> doSave c =<< getId
Just "load" -> doLoad c =<< getId
Just "search" -> doSearch c =<< getQuery
Just "delete" -> doDelete c =<< getIds
Just cmd -> throwCGIError 400 "Unknown command" ["Unknown command: " ++ show cmd]
- Nothing -> throwCGIError 400 "No command given" ["No command given"]
+ Nothing -> do mb_uri <- getIdentity
+ mb_email <- getEMail
+ doLogin c mb_uri mb_email
where
+ getUserId :: CGI (Maybe String)
+ getUserId = getInput "userId"
+
getId :: CGI (Maybe Int)
getId = readInput "id"
@@ -80,7 +88,7 @@ cgiMain' cache path =
getGrammarId :: CGI String
getGrammarId = do
mb_url <- getInput "url"
- return (maybe "null" (reverse . drop 4 . reverse) mb_url)
+ return (maybe "null" (reverse . takeWhile (/='/') . drop 4 . reverse) mb_url)
getFile :: CGI (Maybe BS.ByteString)
getFile = do
@@ -97,27 +105,49 @@ cgiMain' cache path =
getDescription :: CGI String
getDescription = fmap (fromMaybe "") (getInput "description")
-doGrammars c = do
+ getIdentity :: CGI (Maybe String)
+ getIdentity = getInput "openid.identity"
+
+ getEMail :: CGI (Maybe String)
+ getEMail = getInput "openid.ext1.value.email"
+
+
+doLogin c mb_uri mb_email = do
+ path <- scriptName
r <- liftIO $ handleSql (return . Left) $ do
- s <- query c "call getGrammars()"
- rows <- collectRows getGrammar s
+ s <- query c ("call getUserId("++toSqlValue mb_uri++","++toSqlValue mb_email++")")
+ [id] <- collectRows getUserId s
+ return (Right id)
+ case r of
+ Right mb_id -> outputHTML (startupHTML mb_id mb_uri mb_email (Just path))
+ Left e -> throwCGIError 400 "Login failed" (lines (show e))
+ where
+ getUserId s = do
+ id <- getFieldValueMB s "userId"
+ return (id :: Maybe Int)
+
+doGrammars c mb_userId = do
+ path <- scriptName
+ r <- liftIO $ handleSql (return . Left) $ do
+ s <- query c ("call getGrammars("++toSqlValue mb_userId++")")
+ rows <- collectRows (getGrammar path) s
return (Right rows)
case r of
Right rows -> outputJSONP rows
Left e -> throwCGIError 400 "Loading failed" (lines (show e))
where
- getGrammar s = do
+ getGrammar path s = do
id <- getFieldValue s "id"
name <- getFieldValue s "name"
description <- getFieldValue s "description"
- return $ toJSObject [ ("url", showJSON (addExtension (show (id :: Int)) "pgf"))
+ return $ toJSObject [ ("url", showJSON (dropExtension path ++ '/':addExtension (show (id :: Int)) "pgf"))
, ("name", showJSON (name :: String))
, ("description", showJSON (description :: String))
]
-doUpdateGrammar c mb_pgf id name descr = do
+doUpdateGrammar c mb_pgf id name descr mb_userId = do
r <- liftIO $ handleSql (return . Left) $ do
- s <- query c ("call updateGrammar("++id++","++toSqlValue name++","++toSqlValue descr++")")
+ s <- query c ("call updateGrammar("++id++","++toSqlValue name++","++toSqlValue descr++","++toSqlValue mb_userId++")")
[id] <- collectRows (\s -> getFieldValue s "id") s
return (Right id)
nid <- case r of
@@ -133,9 +163,9 @@ doUpdateGrammar c mb_pgf id name descr = do
Nothing -> return ()
outputHTML ""
-doDeleteGrammar c id = do
+doDeleteGrammar c id mb_userId = do
r <- liftIO $ handleSql (return . Left) $ do
- execute c ("call deleteGrammar("++id++")")
+ execute c ("call deleteGrammar("++id++","++toSqlValue mb_userId++")")
return (Right "")
case r of
Right x -> outputJSONP ([] :: [(String,String)])
@@ -213,22 +243,56 @@ dbConnect fpath = do
[host,db,user,pwd] <- fmap words $ readFile fpath
connect host db user pwd
+startupHTML mb_id mb_uri mb_email mb_path = unlines [
+ "",
+ "",
+ "
",
+ " ",
+ " Editor",
+ " ",
+ " ",
+ " "window.__gfInit.userId = "++show id++"; ") mb_id++
+ maybe "" (\uri -> "window.__gfInit.userURI = '"++uri++"'; ") mb_uri++
+ maybe "" (\email -> "window.__gfInit.userEMail = '"++email++"'; ") mb_email++
+ maybe "" (\path -> "window.__gfInit.contentURL = '"++path++"'; ") mb_path++
+ "\">",
+ " ",
+ " ",
+ ""]
+
dbInit c =
handleSql (fail . show) $ do
inTransaction c $ \c -> do
- execute c "DROP TABLE IF EXISTS Documents"
- execute c ("CREATE TABLE Documents(id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY,"++
- " title VARCHAR(256) NOT NULL,\n"++
- " created TIMESTAMP NOT NULL DEFAULT 0,\n"++
- " modified TIMESTAMP NOT NULL DEFAULT 0,\n"++
- " content TEXT NOT NULL,\n"++
- " FULLTEXT INDEX (content)) TYPE=MyISAM")
+ execute c "DROP TABLE IF EXISTS GrammarUsers"
+ execute c "DROP TABLE IF EXISTS Users"
execute c "DROP TABLE IF EXISTS Grammars"
- execute c ("CREATE TABLE Grammars(id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY,"++
- " name VARCHAR(64) NOT NULL,\n"++
- " description VARCHAR(512) NOT NULL,\n"++
- " created TIMESTAMP NOT NULL DEFAULT 0,\n"++
- " modified TIMESTAMP NOT NULL DEFAULT 0)")
+ execute c "DROP TABLE IF EXISTS Documents"
+ execute c ("CREATE TABLE Users"++
+ " (id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY,\n"++
+ " identity VARCHAR(256) NOT NULL,\n"++
+ " email VARCHAR(128) NOT NULL,\n"++
+ " UNIQUE INDEX (identity))")
+ execute c ("CREATE TABLE Grammars"++
+ " (id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY,"++
+ " name VARCHAR(64) NOT NULL,\n"++
+ " description VARCHAR(512) NOT NULL,\n"++
+ " created TIMESTAMP NOT NULL DEFAULT 0,\n"++
+ " modified TIMESTAMP NOT NULL DEFAULT 0)")
+ execute c ("CREATE TABLE Documents"++
+ " (id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY,"++
+ " title VARCHAR(256) NOT NULL,\n"++
+ " created TIMESTAMP NOT NULL DEFAULT 0,\n"++
+ " modified TIMESTAMP NOT NULL DEFAULT 0,\n"++
+ " content TEXT NOT NULL,\n"++
+ " FULLTEXT INDEX (content)) TYPE=MyISAM")
+ execute c ("CREATE TABLE GrammarUsers"++
+ " (userId INTEGER NOT NULL,\n"++
+ " grammarId INTEGER NOT NULL,\n"++
+ " flags INTEGER NOT NULL,\n"++
+ " PRIMARY KEY (userId, grammarId),\n"++
+ " FOREIGN KEY (userId) REFERENCES Users(id) ON DELETE CASCADE,\n"++
+ " FOREIGN KEY (grammarId) REFERENCES Grammars(id) ON DELETE RESTRICT)")
execute c "DROP PROCEDURE IF EXISTS saveDocument"
execute c ("CREATE PROCEDURE saveDocument(IN id INTEGER, content TEXT)\n"++
"BEGIN\n"++
@@ -241,23 +305,51 @@ dbInit c =
" END IF;\n"++
"END")
execute c "DROP PROCEDURE IF EXISTS updateGrammar"
- execute c ("CREATE PROCEDURE updateGrammar(IN id INTEGER, name VARCHAR(64), description VARCHAR(512))\n"++
+ execute c ("CREATE PROCEDURE updateGrammar(IN id INTEGER, name VARCHAR(64), description VARCHAR(512), userId INTEGER)\n"++
"BEGIN\n"++
" IF id IS NULL THEN\n"++
" INSERT INTO Grammars(name,description,created,modified) VALUES (name,description,NOW(),NOW());\n"++
- " SELECT LAST_INSERT_ID() as id;\n"++
+ " SET id = LAST_INSERT_ID();\n"++
+ " INSERT INTO GrammarUsers(grammarId,userId,flags) VALUES (id,userId,0);\n"++
" ELSE\n"++
" UPDATE Grammars gr SET name = name, description=description, modified=NOW() WHERE gr.id = id;\n"++
- " select id;\n"++
" END IF;\n"++
+ " SELECT id;\n"++
"END")
execute c "DROP PROCEDURE IF EXISTS deleteGrammar"
- execute c ("CREATE PROCEDURE deleteGrammar(IN grammarId INTEGER)\n"++
+ execute c ("CREATE PROCEDURE deleteGrammar(IN aGrammarId INTEGER, aUserId INTEGER)\n"++
"BEGIN\n"++
- " DELETE FROM Grammars WHERE id = grammarId;\n"++
+ " DECLARE deleted INTEGER;\n"++
+ " DELETE FROM GrammarUsers\n"++
+ " WHERE grammarId = aGrammarId AND userId = aUserId;\n"++
+ " IF NOT EXISTS(SELECT * FROM GrammarUsers gu WHERE gu.grammarId = aGrammarId) THEN\n"++
+ " DELETE FROM Grammars WHERE id = aGrammarId;\n"++
+ " SET deleted = 1;\n"++
+ " ELSE\n"++
+ " SET deleted = 0;\n"++
+ " END IF;\n"++
+ " SELECT deleted;\n"++
"END")
execute c "DROP PROCEDURE IF EXISTS getGrammars"
- execute c ("CREATE PROCEDURE getGrammars()\n"++
+ execute c ("CREATE PROCEDURE getGrammars(IN userId INTEGER)\n"++
"BEGIN\n"++
- " SELECT id,name,description FROM Grammars ORDER BY name;\n"++
+ " SELECT g.id,g.name,g.description\n"++
+ " FROM Grammars g JOIN GrammarUsers gu ON g.id = gu.grammarId\n"++
+ " WHERE gu.userId = userId\n"++
+ " ORDER BY g.name;\n"++
+ "END")
+ execute c "DROP PROCEDURE IF EXISTS getUserId"
+ execute c ("CREATE PROCEDURE getUserId(identity VARCHAR(256), email VARCHAR(128))\n"++
+ "BEGIN\n"++
+ " DECLARE userId INTEGER;\n"++
+ " IF identity IS NULL OR email IS NULL THEN\n"++
+ " SET userId = NULL;\n"++
+ " ELSE\n"++
+ " SELECT id INTO userId FROM Users u WHERE u.identity = identity;\n"++
+ " IF userId IS NULL THEN\n"++
+ " INSERT INTO Users(identity, email) VALUES (identity, email);\n"++
+ " SET userId = LAST_INSERT_ID();\n"++
+ " END IF;\n"++
+ " END IF;\n"++
+ " SELECT userId;\n"++
"END")
diff --git a/src/server/PGFService.hs b/src/server/PGFService.hs
index 32e2e4e98..09714d7fa 100644
--- a/src/server/PGFService.hs
+++ b/src/server/PGFService.hs
@@ -46,7 +46,7 @@ cgiMain' cache path =
pgfMain pgf command
pgfMain :: PGF -> String -> CGI CGIResult
-pgfMain pgf command =
+pgfMain pgf command = do
case command of
"parse" -> outputJSONP =<< doParse pgf `fmap` getText `ap` getCat `ap` getFrom
"complete" -> outputJSONP =<< doComplete pgf `fmap` getText `ap` getCat `ap` getFrom `ap` getLimit
diff --git a/src/server/pgf-fcgi.hs b/src/server/pgf-fcgi.hs
index 547f263c3..3b5b0b3cf 100644
--- a/src/server/pgf-fcgi.hs
+++ b/src/server/pgf-fcgi.hs
@@ -3,7 +3,7 @@ import Control.Concurrent(forkIO)
import Network.FastCGI(runFastCGI,runFastCGIConcurrent')
import PGFService(cgiMain,newPGFCache,stderrToFile,logFile)
-
+import System.IO
main = do stderrToFile logFile
fcgiMain =<< newPGFCache
diff --git a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/ContentService.java b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/ContentService.java
index e6f0b5509..fd336bf34 100644
--- a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/ContentService.java
+++ b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/ContentService.java
@@ -6,29 +6,37 @@ import java.util.*;
import com.google.gwt.core.client.*;
public class ContentService {
- String contentBaseURL;
// Event listeners
private List listeners = new LinkedList();
private List grammars = null;
- public ContentService(String contentBaseURL) {
- this.contentBaseURL = contentBaseURL;
+ public ContentService() {
}
-
- public String getBaseURL() {
- return contentBaseURL;
+
+ public static class Init extends JavaScriptObject {
+ protected Init() { }
+
+ public final native String getUserId() /*-{ return this.userId; }-*/;
+ public final native String getUserURL() /*-{ return this.userURL; }-*/;
+ public final native String getUserEMail() /*-{ return this.userEMail; }-*/;
+ public final native String getContentURL() /*-{ return this.contentURL; }-*/;
}
-
+
+ public static final native Init getInit() /*-{
+ return $wnd.__gfInit;
+ }-*/;
+
public void addSettingsListener(SettingsListener listener) {
listeners.add(listener);
}
public void updateAvailableGrammars() {
List args = new ArrayList();
+ args.add(new Arg("userId", getInit().getUserId()));
args.add(new Arg("command", "grammars"));
- JSONRequestBuilder.sendRequest(contentBaseURL, args, new GrammarsCallback() {
+ JSONRequestBuilder.sendRequest(getInit().getContentURL(), args, new GrammarsCallback() {
public void onResult(IterableJsArray grammars_) {
grammars = new ArrayList();
for (ContentService.GrammarInfo grammar : grammars_.iterable()) {
@@ -62,8 +70,9 @@ public class ContentService {
public JSONRequest deleteGrammar(String grammarURL, DeleteCallback callback) {
List args = new ArrayList();
args.add(new Arg("url", grammarURL));
+ args.add(new Arg("userId", getInit().getUserId()));
args.add(new Arg("command", "delete_grammar"));
- return JSONRequestBuilder.sendRequest(contentBaseURL, args, callback);
+ return JSONRequestBuilder.sendRequest(getInit().getContentURL(), args, callback);
}
public JSONRequest save(Object id, String content, SaveCallback callback) {
@@ -71,7 +80,7 @@ public class ContentService {
if (id != null)
args.add(new Arg("id", id.toString()));
args.add(new Arg("command", "save"));
- return JSONRequestBuilder.sendDataRequest(contentBaseURL, args, content, callback);
+ return JSONRequestBuilder.sendDataRequest(getInit().getContentURL(), args, content, callback);
}
public interface SaveCallback extends JSONCallback {}
@@ -80,7 +89,7 @@ public class ContentService {
List args = new ArrayList();
args.add(new Arg("command", "load"));
args.add(new Arg("id", id.toString()));
- return JSONRequestBuilder.sendRequest(contentBaseURL, args, callback);
+ return JSONRequestBuilder.sendRequest(getInit().getContentURL(), args, callback);
}
public interface LoadCallback extends JSONCallback {}
@@ -89,7 +98,7 @@ public class ContentService {
List args = new ArrayList();
args.add(new Arg("command", "search"));
args.add(new Arg("query", fullTextQuery));
- return JSONRequestBuilder.sendRequest(contentBaseURL, args, callback);
+ return JSONRequestBuilder.sendRequest(getInit().getContentURL(), args, callback);
}
public interface SearchCallback extends JSONCallback> {}
@@ -115,7 +124,7 @@ public class ContentService {
for (Object id : ids) {
args.add(new Arg("id", id.toString()));
}
- return JSONRequestBuilder.sendRequest(contentBaseURL, args, callback);
+ return JSONRequestBuilder.sendRequest(getInit().getContentURL(), args, callback);
}
public interface DeleteCallback extends JSONCallback {}
diff --git a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/EditorApp.java b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/EditorApp.java
index dde097b8f..bca76e7bb 100644
--- a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/EditorApp.java
+++ b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/EditorApp.java
@@ -11,9 +11,6 @@ import com.google.gwt.event.shared.*;
public class EditorApp implements EntryPoint {
- protected static final String pgfBaseURL = "/grammars";
- protected static final String contentBaseURL = "/grammars.content";
-
protected ContentService contentService;
protected PGFWrapper pgf;
@@ -420,10 +417,10 @@ public class EditorApp implements EntryPoint {
protected class MySettingsListener implements SettingsListener {
// Will only happen on load
public void onAvailableGrammarsChanged() {
- if (pgf.getPGFName() == null) {
+ if (pgf.getGrammarURL() == null) {
List grammars = pgf.getGrammars();
if (!grammars.isEmpty()) {
- pgf.setPGFName(grammars.get(0));
+ pgf.setGrammarURL(grammars.get(0));
}
}
}
@@ -452,8 +449,8 @@ public class EditorApp implements EntryPoint {
public void onModuleLoad() {
statusPopup = new StatusPopup();
- pgf = new PGFWrapper(pgfBaseURL);
- contentService = new ContentService(contentBaseURL);
+ pgf = new PGFWrapper();
+ contentService = new ContentService();
RootPanel.get().add(createUI());
pgf.addSettingsListener(new MySettingsListener());
contentService.updateAvailableGrammars();
diff --git a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/FridgeApp.java b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/FridgeApp.java
index acc28977a..4e9963451 100644
--- a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/FridgeApp.java
+++ b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/FridgeApp.java
@@ -272,16 +272,16 @@ public class FridgeApp implements EntryPoint {
protected void updateSettingsFromHistoryToken(String[] tokenParts) {
if (tokenParts.length >= 1 && tokenParts[0].length() > 0) {
- setPGFName(tokenParts[0]);
+ setGrammarURL(tokenParts[0]);
}
if (tokenParts.length >= 2 && tokenParts[1].length() > 0) {
setInputLanguage(tokenParts[1]);
}
}
- protected void setPGFName (String pgfName) {
- if (pgfName != null && !pgfName.equals(pgf.getPGFName())) {
- pgf.setPGFName(pgfName);
+ protected void setGrammarURL(String url) {
+ if (url != null && !url.equals(pgf.getGrammarURL())) {
+ pgf.setGrammarURL(url);
}
}
@@ -298,12 +298,12 @@ public class FridgeApp implements EntryPoint {
protected class MySettingsListener implements SettingsListener {
// Will only happen on load
public void onAvailableGrammarsChanged() {
- if (pgf.getPGFName() == null) {
+ if (pgf.getGrammarURL() == null) {
List grammars = pgf.getGrammars();
if (!grammars.isEmpty()) {
- pgf.setPGFName(grammars.get(0));
+ pgf.setGrammarURL(grammars.get(0));
}
- }
+ }
}
public void onSelectedGrammarChanged() {
if (pgf.getInputLanguage() == null) {
@@ -327,7 +327,7 @@ public class FridgeApp implements EntryPoint {
public void onModuleLoad() {
statusPopup = new StatusPopup();
- pgf = new PGFWrapper(pgfBaseURL);
+ pgf = new PGFWrapper();
RootPanel.get().add(createUI());
pgf.addSettingsListener(new MySettingsListener());
History.addHistoryListener(new MyHistoryListener());
diff --git a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/GrammarsPanel.java b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/GrammarsPanel.java
index 70f761f8b..0857c3c4e 100644
--- a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/GrammarsPanel.java
+++ b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/GrammarsPanel.java
@@ -112,7 +112,7 @@ public class GrammarsPanel extends Composite {
form.setWidth("100%");
form.setEncoding(FormPanel.ENCODING_MULTIPART);
form.setMethod(FormPanel.METHOD_POST);
- form.setAction(contentService.getBaseURL());
+ form.setAction(ContentService.getInit().getContentURL());
form.addSubmitHandler(uploadFormHandler);
form.addSubmitCompleteHandler(uploadFormHandler);
@@ -120,7 +120,8 @@ public class GrammarsPanel extends Composite {
vPanel.setWidth("100%");
form.add(vPanel);
- vPanel.add(new HTML(""));
+ vPanel.add(new HTML("\n"+
+ ""));
HorizontalPanel hPanel = new HorizontalPanel();
hPanel.setSpacing(8);
diff --git a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/PGFWrapper.java b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/PGFWrapper.java
index 9c88da7f6..1e248fa40 100644
--- a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/PGFWrapper.java
+++ b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/PGFWrapper.java
@@ -11,11 +11,7 @@ import com.google.gwt.core.client.*;
public class PGFWrapper {
- private String baseURL;
-
- private String grammarURL;
-
- private String pgfName = null;
+ private String grammarURL = null;
private PGF pgf;
@@ -44,17 +40,11 @@ public class PGFWrapper {
public PGFWrapper() {
- this.baseURL = null;
- this.pgf = new PGF();
- }
-
- public PGFWrapper(String baseURL) {
- this.baseURL = baseURL;
this.pgf = new PGF();
}
public void updateAvailableGrammars() {
- String url = baseURL+"/grammars.xml";
+ String url = "/grammars.xml";
RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, URL.encode(url));
try
{
@@ -172,26 +162,12 @@ public class PGFWrapper {
//
// Settings
//
-
- public String getPGFName() {
- return pgfName;
- }
-
- public void setPGFName(String pgfName) {
- this.pgfName = pgfName;
- this.grammarURL = (pgfName == null) ? null : baseURL + "/" + pgfName;
- this.inputLanguage = null;
- this.outputLanguage = null;
- this.cat = null;
- updateSelectedGrammar();
- }
public String getGrammarURL() {
return grammarURL;
}
public void setGrammarURL(String grammarURL) {
- this.pgfName = null;
this.grammarURL = grammarURL;
this.inputLanguage = null;
this.outputLanguage = null;
diff --git a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/SettingsPanel.java b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/SettingsPanel.java
index a5c19bc64..b3c22572c 100644
--- a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/SettingsPanel.java
+++ b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/SettingsPanel.java
@@ -24,7 +24,7 @@ public class SettingsPanel extends Composite {
grammarBox = new MyListBox();
grammarBox.addChangeListener(new ChangeListener() {
public void onChange(Widget sender) {
- SettingsPanel.this.pgf.setPGFName(grammarBox.getSelectedValue());
+ SettingsPanel.this.pgf.setGrammarURL(grammarBox.getSelectedValue());
}
});
settingsPanel.add(new FormWidget("Grammar:", grammarBox));
@@ -45,6 +45,28 @@ public class SettingsPanel extends Composite {
});
settingsPanel.add(new FormWidget("To:", toLangBox));
+ if (contentService.getInit().getUserEMail() != null) {
+ String url = contentService.getInit().getContentURL();
+ settingsPanel.add(new FormWidget(contentService.getInit().getUserEMail(),
+ new HTML("Sign Out")));
+ } else {
+ String url = contentService.getInit().getContentURL();
+ url = "https://www.google.com/accounts/o8/ud"
+ + "?openid.ns=http://specs.openid.net/auth/2.0"
+ + "&openid.ns.max_auth_age=300"
+ + "&openid.claimed_id=http://specs.openid.net/auth/2.0/identifier_select"
+ + "&openid.identity=http://specs.openid.net/auth/2.0/identifier_select"
+ + "&openid.return_to=http://localhost:8080"+url
+ + "&openid.realm=http://localhost:8080/"
+ + "&openid.mode=checkid_setup"
+ + "&openid.ns.ax=http://openid.net/srv/ax/1.0"
+ + "&openid.ax.mode=fetch_request"
+ + "&openid.ax.type.email=http://axschema.org/contact/email"
+ + "&openid.ax.required=email";
+ settingsPanel.add(new FormWidget("",
+ new HTML("Sign In")));
+ }
+
initWidget(settingsPanel);
setStylePrimaryName("my-SettingsPanel");
@@ -54,7 +76,7 @@ public class SettingsPanel extends Composite {
private static class FormWidget extends HorizontalPanel {
public FormWidget(String label, Widget w) {
- setStylePrimaryName(".my-FormWidget");
+ setStylePrimaryName("form-widget");
setVerticalAlignment(HorizontalPanel.ALIGN_MIDDLE);
add(new Label(label));
add(w);
@@ -65,16 +87,18 @@ public class SettingsPanel extends Composite {
public void onAvailableGrammarsChanged() {
if (grammarBox != null) {
grammarBox.clear();
-
+ fromLangBox.clear();
+ toLangBox.clear();
+
for (ContentService.GrammarInfo grammar : contentService.getGrammars()) {
grammarBox.addItem(grammar.getName(), grammar.getURL());
}
- pgf.setPGFName(grammarBox.getSelectedValue());
+ pgf.setGrammarURL(grammarBox.getSelectedValue());
}
}
public void onSelectedGrammarChanged() {
if (grammarBox != null) {
- grammarBox.setSelectedValue(pgf.getPGFName());
+ grammarBox.setSelectedValue(pgf.getGrammarURL());
}
if (fromLangBox != null) {
fromLangBox.clear();
diff --git a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/TranslateApp.java b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/TranslateApp.java
index 9a6b84a8a..e6c58c1d8 100644
--- a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/TranslateApp.java
+++ b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/client/TranslateApp.java
@@ -253,16 +253,16 @@ public class TranslateApp implements EntryPoint {
protected void updateSettingsFromHistoryToken(String[] tokenParts) {
if (tokenParts.length >= 1 && tokenParts[0].length() > 0) {
- setPGFName(tokenParts[0]);
+ setGrammarURL(tokenParts[0]);
}
if (tokenParts.length >= 2 && tokenParts[1].length() > 0) {
setInputLanguage(tokenParts[1]);
}
}
- protected void setPGFName (String pgfName) {
- if (pgfName != null && !pgfName.equals(pgf.getPGFName())) {
- pgf.setPGFName(pgfName);
+ protected void setGrammarURL (String url) {
+ if (url != null && !url.equals(pgf.getGrammarURL())) {
+ pgf.setGrammarURL(url);
}
}
@@ -279,10 +279,10 @@ public class TranslateApp implements EntryPoint {
protected class MySettingsListener implements SettingsListener {
// Will only happen on load
public void onAvailableGrammarsChanged() {
- if (pgf.getPGFName() == null) {
+ if (pgf.getGrammarURL() == null) {
List grammars = pgf.getGrammars();
if (!grammars.isEmpty()) {
- pgf.setPGFName(grammars.get(0));
+ pgf.setGrammarURL(grammars.get(0));
}
}
}
@@ -310,7 +310,7 @@ public class TranslateApp implements EntryPoint {
public void onModuleLoad() {
statusPopup = new StatusPopup();
- pgf = new PGFWrapper(pgfBaseURL);
+ pgf = new PGFWrapper();
RootPanel.get().add(createUI());
pgf.addSettingsListener(new MySettingsListener());
History.addHistoryListener(new MyHistoryListener());
diff --git a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/public/Editor.css b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/public/Editor.css
index 0fd99f8a3..f568ab96e 100644
--- a/src/ui/gwt/src/org/grammaticalframework/ui/gwt/public/Editor.css
+++ b/src/ui/gwt/src/org/grammaticalframework/ui/gwt/public/Editor.css
@@ -152,10 +152,17 @@
font-size: 150%;
}
-.my-SettingsPanel * {
+.my-SettingsPanel {
+}
+
+.my-SettingsPanel .form-widget {
margin: 0 0.4em;
}
+.my-SettingsPanel .form-widget * {
+ margin: 0 0.1em;
+}
+
.my-LinksPanel * {
margin: 0 0.2em;
}
diff --git a/src/ui/gwt/www/editor/editor.html b/src/ui/gwt/www/editor/editor.html
new file mode 100644
index 000000000..114a88ccb
--- /dev/null
+++ b/src/ui/gwt/www/editor/editor.html
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Editor
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/ui/gwt/www/editor/index.html b/src/ui/gwt/www/editor/index.html
index 114a88ccb..1af492b4a 100644
--- a/src/ui/gwt/www/editor/index.html
+++ b/src/ui/gwt/www/editor/index.html
@@ -1,36 +1,4 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Editor
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+