|
From: <tre...@us...> - 2008-02-07 12:20:52
|
Revision: 726
http://ogoglio.svn.sourceforge.net/ogoglio/?rev=726&view=rev
Author: trevorolio
Date: 2008-02-07 04:20:53 -0800 (Thu, 07 Feb 2008)
Log Message:
-----------
More attachment work:
a first pass at a body editor UI
a template for Joe with just a texture containing shirts and pants
fixed up the populate mojo to read an attachment property out of template.properties
Modified Paths:
--------------
maven/trunk/ogoglio-server/src/main/java/com/ogoglio/persist/TemplatePersistTasks.java
maven/trunk/ogoglio-server/src/main/java/com/ogoglio/site/AccountServlet.java
maven/trunk/ogoglio-server/src/main/resources/hibernate/migration-2.xml
maven/trunk/ogoglio-server/src/main/resources/hibernate/migration-3.xml
maven/trunk/ogoglio-server/src/main/resources/siteTemplates/body.css
maven/trunk/ogoglio-server/src/main/resources/siteTemplates/body.html
maven/trunk/ogoglio-server/src/main/resources/siteTemplates/body.js
maven/trunk/ogoglio-server/src/main/resources/siteTemplates/ogoglio.js
Added Paths:
-----------
maven/trunk/ogoglio-server/src/main/resources/populate/template-90/
maven/trunk/ogoglio-server/src/main/resources/populate/template-90/JoeShirtAndPants.obj
maven/trunk/ogoglio-server/src/main/resources/populate/template-90/body.gif
maven/trunk/ogoglio-server/src/main/resources/populate/template-90/template.properties
Modified: maven/trunk/ogoglio-server/src/main/java/com/ogoglio/persist/TemplatePersistTasks.java
===================================================================
--- maven/trunk/ogoglio-server/src/main/java/com/ogoglio/persist/TemplatePersistTasks.java 2008-02-07 12:20:35 UTC (rev 725)
+++ maven/trunk/ogoglio-server/src/main/java/com/ogoglio/persist/TemplatePersistTasks.java 2008-02-07 12:20:53 UTC (rev 726)
@@ -36,6 +36,8 @@
protected static final String TEMPLATE_BY_OWNER = "com.ogoglio.persist.templateByOwner";
+ public static final String TEMPLATES_BY_ATTACHMENT = "com.ogoglio.persist.templatesByAttachment";
+
public static TemplateRecord createTemplate(final String displayName, final String ownerUsername, SessionFactory sessionFactory) throws PersistException {
final TemplateRecord record = new TemplateRecord(displayName, ownerUsername);
HibernateTask task = new HibernateTask() {
@@ -91,6 +93,19 @@
return (TemplateRecord[]) task.execute();
}
+ public static TemplateRecord[] findAttachmentTemplates(SessionFactory sessionFactory) throws PersistException {
+ HibernateTask task = new HibernateTask() {
+ public Object run(Session session) throws PersistException {
+ Query query = session.getNamedQuery(TEMPLATES_BY_ATTACHMENT);
+ query.setBoolean("attachment", true);
+ return prepareTemplatesCollections(query);
+ }
+
+ };
+ task.setSessionFactory(sessionFactory);
+ return (TemplateRecord[]) task.execute();
+ }
+
private static TemplateRecord[] prepareTemplatesCollections(Query query) {
TemplateRecord[] allRecs = (TemplateRecord[]) query.list().toArray(new TemplateRecord[0]);
for (int i = 0; i < allRecs.length; ++i) {
Modified: maven/trunk/ogoglio-server/src/main/java/com/ogoglio/site/AccountServlet.java
===================================================================
--- maven/trunk/ogoglio-server/src/main/java/com/ogoglio/site/AccountServlet.java 2008-02-07 12:20:35 UTC (rev 725)
+++ maven/trunk/ogoglio-server/src/main/java/com/ogoglio/site/AccountServlet.java 2008-02-07 12:20:53 UTC (rev 726)
@@ -663,6 +663,7 @@
public class TemplateQueryResource extends AuthenticatedSiteResource {
public TemplateQueryResource() {
super("template", false, getSessionFactory());
+ addSubResource(new TemplateQueryAttachmentResource());
addSubResource(new TemplateQueryIDsResource());
}
@@ -671,6 +672,23 @@
}
}
+ public class TemplateQueryAttachmentResource extends AuthenticatedSiteResource {
+ public TemplateQueryAttachmentResource() {
+ super("attachment", false, getSessionFactory());
+ }
+
+ public void doGet(HttpServletRequest request, HttpServletResponse response, String[] pathElements, AccountRecord authedAccount) throws PersistException, ServletException, IOException {
+ XMLElement result = new XMLElement("list");
+
+ TemplateRecord[] records = TemplatePersistTasks.findAttachmentTemplates(getSessionFactory());
+ for (int i = 0; i < records.length; i++) {
+ result.addChild(DocumentFactory.documentFromRecord(records[i]).toElement());
+ }
+
+ sendStringResponse(result.toString(), "text/xml", response);
+ }
+ }
+
public class TemplateQueryIDsResource extends AuthenticatedSiteResource {
public TemplateQueryIDsResource() {
super(SiteResource.WILDCARD_ELEMENT, true, getSessionFactory());
Modified: maven/trunk/ogoglio-server/src/main/resources/hibernate/migration-2.xml
===================================================================
--- maven/trunk/ogoglio-server/src/main/resources/hibernate/migration-2.xml 2008-02-07 12:20:35 UTC (rev 725)
+++ maven/trunk/ogoglio-server/src/main/resources/hibernate/migration-2.xml 2008-02-07 12:20:53 UTC (rev 726)
@@ -259,6 +259,10 @@
<![CDATA[ from com.ogoglio.persist.TemplateRecord as template where template.templateID = :templateID ]]>
</query>
+ <query name="com.ogoglio.persist.templatesByAttachment">
+ <![CDATA[ from com.ogoglio.persist.TemplateRecord as template where template.attachment = :attachment ]]>
+ </query>
+
<query name="com.ogoglio.persist.templateByIDs">
<![CDATA[ from com.ogoglio.persist.TemplateRecord as template where template.templateID in ( :templateIDs ) ]]>
</query>
Modified: maven/trunk/ogoglio-server/src/main/resources/hibernate/migration-3.xml
===================================================================
--- maven/trunk/ogoglio-server/src/main/resources/hibernate/migration-3.xml 2008-02-07 12:20:35 UTC (rev 725)
+++ maven/trunk/ogoglio-server/src/main/resources/hibernate/migration-3.xml 2008-02-07 12:20:53 UTC (rev 726)
@@ -257,6 +257,10 @@
<![CDATA[ from com.ogoglio.persist.TemplateRecord as template where template.templateID = :templateID ]]>
</query>
+ <query name="com.ogoglio.persist.templatesByAttachment">
+ <![CDATA[ from com.ogoglio.persist.TemplateRecord as template where template.attachment = :attachment ]]>
+ </query>
+
<query name="com.ogoglio.persist.templateByIDs">
<![CDATA[ from com.ogoglio.persist.TemplateRecord as template where template.templateID in ( :templateIDs ) ]]>
</query>
Added: maven/trunk/ogoglio-server/src/main/resources/populate/template-90/JoeShirtAndPants.obj
===================================================================
--- maven/trunk/ogoglio-server/src/main/resources/populate/template-90/JoeShirtAndPants.obj (rev 0)
+++ maven/trunk/ogoglio-server/src/main/resources/populate/template-90/JoeShirtAndPants.obj 2008-02-07 12:20:53 UTC (rev 726)
@@ -0,0 +1 @@
+# This is intentionally empty
Added: maven/trunk/ogoglio-server/src/main/resources/populate/template-90/body.gif
===================================================================
(Binary files differ)
Property changes on: maven/trunk/ogoglio-server/src/main/resources/populate/template-90/body.gif
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: maven/trunk/ogoglio-server/src/main/resources/populate/template-90/template.properties
===================================================================
--- maven/trunk/ogoglio-server/src/main/resources/populate/template-90/template.properties (rev 0)
+++ maven/trunk/ogoglio-server/src/main/resources/populate/template-90/template.properties 2008-02-07 12:20:53 UTC (rev 726)
@@ -0,0 +1,2 @@
+
+attachment: true
Modified: maven/trunk/ogoglio-server/src/main/resources/siteTemplates/body.css
===================================================================
--- maven/trunk/ogoglio-server/src/main/resources/siteTemplates/body.css 2008-02-07 12:20:35 UTC (rev 725)
+++ maven/trunk/ogoglio-server/src/main/resources/siteTemplates/body.css 2008-02-07 12:20:53 UTC (rev 726)
@@ -2,55 +2,56 @@
width: 300px;
height: 400px;
position: absolute;
- top: 20px;
- left: 205px;
+ top: 0px;
+ left: 0px;
}
-#leftControlDiv {
+#tabDiv {
+ margin: 0px;
+ padding: 0px;
+ width: 400px;
+ height: 400px;
position: absolute;
- top: 25px;
- left: 0px;
- width: 200px;
- height: 400px;
- overflow: auto;
- visibility: hidden;
+ top: 0px;
+ left: 310px;
}
-#rightControlDiv {
- position: absolute;
- top: 25px;
- left: 510px;
- width: 200px;
- height: 400px;
- visibility: hidden;
+#morphTable {
+ margin: 0px;
+ padding: 0px;
+ border: none;
}
-#topControlDiv {
- position: absolute;
- top: 0px;
- left: 25px;
- height: 20px;
- width: 100%;
- text-align: center;
- visibility: hidden;
+#morphTable td {
+ padding: 5px;
+ border: none;
}
-#topControlDiv form {
+.tab {
+ margin: 0px 0px 10px 0px;
+ padding: 0px;
+ width: 75px;
+ height: 100px;
display: inline;
}
-#bottomControlDiv {
+.tabbedControlDiv {
position: absolute;
- top: 435px;
+ top: 30px;
left: 0px;
- height: 30px;
- width: 100%;
+ width: 400px;
+ height: 370px;
+ overflow: auto;
visibility: hidden;
}
-#bottomControlDiv form {
+
+#bodyControlDiv {
display: inline;
}
+#bodyControlDiv form {
+ display: inline;
+}
#morphControls form {
display: inline;
@@ -61,6 +62,10 @@
width: 75px;
}
+#attachmentControlDiv form {
+ display: inline;
+}
+
#textureForm {
margin-top: 25px;
}
Modified: maven/trunk/ogoglio-server/src/main/resources/siteTemplates/body.html
===================================================================
--- maven/trunk/ogoglio-server/src/main/resources/siteTemplates/body.html 2008-02-07 12:20:35 UTC (rev 725)
+++ maven/trunk/ogoglio-server/src/main/resources/siteTemplates/body.html 2008-02-07 12:20:53 UTC (rev 726)
@@ -60,32 +60,48 @@
<h2 id="title">Body Editor:</h2>
<div id="main">
- <div id="topControlDiv">
- <span id="bodyListControl"> </span>
- <span id="bodyDataControl"> </span>
+ <div id="tabDiv">
+ <div id="tabsDiv">
+ <div id="bodyTab" class="tab"><a onclick="showTab('bodyTab', 'bodyControlDiv'); return false;" href="body.html">Bodies</a></div>
+ <div id="morphTab" class="tab"><a onclick="showTab('morphTab', 'morphControlDiv'); return false;" href="body.html">Morphs</a></div>
+ <div id="animationTab" class="tab"><a onclick="showTab('animationTab', 'animationControlDiv'); return false;" href="body.html">Animations</a></div>
+ <div id="attachmentTab" class="tab"><a onclick="showTab('attachmentTab', 'attachmentControlDiv'); return false;" href="body.html">Attachments</a></div>
+ </div>
+ <div id="bodyControlDiv" class="tabbedControlDiv">
+ <h3>Body name: <span id="bodyListControl"> </span></h3>
+
+ <h3>Base body: <span id="bodyDataControl"> </span></h3>
+
+
+ <h3>Texture Selection: <span id="textureSelectionDiv"> </span></h3>
+
+
+ <h3>Custom Texture Upload:</h3>
+ <form id="textureForm" onsubmit="handleTextureForm();" target="textureTargetFrame" action="" enctype="multipart/form-data" method="post">
+ <input type="file" size="7" name="textureData" />
+ <input type="submit" value="upload custom skin" />
+ </form>
+ <form id="textureDeleteForm" onsubmit="textureDeleteGo(); return false;"><input style="text-align: right; margin-top: 20px;" type="submit" value="delete custom skin"/></form>
+ <iframe id="textureTargetFrame" name="textureTargetFrame" style="width: 1px; height: 1px;"></iframe>
+
+ <h3>Profile photo:</h3>
+ <form onsubmit="doSaveAccountPhoto(); return false"><input type="submit" value="save profile photo" /></form>
+ </div>
+ <div id="morphControlDiv" class="tabbedControlDiv">
+ <div id="morphControls"> </div>
+ <div id="saveControlDiv" style="text-align: center;">
+ <form onsubmit="doSave(); return false"><input type="submit" value="save" /></form>
+ </div>
+ </div>
+ <div id="animationControlDiv" class="tabbedControlDiv">
+ <div id="animationControls"> </div>
+ </div>
+ <div id="attachmentControlDiv" class="tabbedControlDiv">
+ <div id="attachmentControls"> </div>
+ </div>
</div>
- <div id="leftControlDiv">
- <div id="morphControls"> </div>
- </div>
- <div id="rightControlDiv">
- <div id="animationControls"> </div>
-
- <div id="textureSelectionDiv"> </div>
-
- <form id="textureForm" onsubmit="handleTextureForm();" target="textureTargetFrame" action="" enctype="multipart/form-data" method="post">
- <input type="file" size="7" name="textureData" />
- <input type="submit" value="upload custom skin" />
- </form>
- <form id="textureDeleteForm" onsubmit="textureDeleteGo(); return false;"><input type="submit" value="delete custom skin"/></form>
- <iframe id="textureTargetFrame" name="textureTargetFrame" style="width: 1px; height: 1px;"></iframe>
- </div>
-
+
<div id="appletDiv"> </div>
-
- <div id="bottomControlDiv" style="text-align: center;">
- <form onsubmit="doSave(); return false"><input type="submit" value="save" /></form>
- <form onsubmit="doSaveAccountPhoto(); return false"><input type="submit" value="save profile photo" /></form>
- </div>
</div> <!-- end main -->
Modified: maven/trunk/ogoglio-server/src/main/resources/siteTemplates/body.js
===================================================================
--- maven/trunk/ogoglio-server/src/main/resources/siteTemplates/body.js 2008-02-07 12:20:35 UTC (rev 725)
+++ maven/trunk/ogoglio-server/src/main/resources/siteTemplates/body.js 2008-02-07 12:20:53 UTC (rev 726)
@@ -1,21 +1,44 @@
var loginCookie = getLoginCookie();
var appletDiv = null;
-var leftControlDiv = null;
-var rightControlDiv = null;
-var bottomControlDiv = null;
-var topControlDiv = null;
var textureSelectionDiv = null;
var textureForm = null;
var morphControls = null;
var animationControls = null;
var bodyListControl = null;
var bodyDataControl = null;
+var attachmentControls = null;
+var tabbedControlDivs = new Array();
+var bodyControlDiv = null;
+var morphControlDiv = null;
+var animationControlDiv = null;
+var attachmentDiv = null;
+
var bodyXML = null;
var bodyListXML = null;
-var bodyDataListXML = null
+var bodyDataListXML = null;
+var attachmentTemplateListXML = null;
+var oldTab = null;
+function showTab(tabID, controlDivID){
+ var tab = document.getElementById(tabID);
+ var controlDiv = document.getElementById(controlDivID);
+ for(var i=0; i < tabbedControlDivs.length; i++){
+ if(tabbedControlDivs[i] == controlDiv){
+ tabbedControlDivs[i].style.visibility = "visible";
+ } else {
+ tabbedControlDivs[i].style.visibility = "hidden";
+ }
+ }
+
+ if(oldTab != null){
+ oldTab.style.borderBottom = "none";
+ }
+ oldTab = tab;
+ tab.style.borderBottom = "solid 3px #666";
+}
+
function handleBodyAuth(){
if(loginCookie == null){
appletDiv.innerHTML = "<h2>Please log in to use this page.</h2>";
@@ -31,11 +54,8 @@
}
function stopAndDisplayError(errorMessage){
- topControlDiv.innerHTML = "";
- leftControlDiv.innerHTML = "";
- rightControlDiv.innerHTML = "";
- bottomControlDiv.innerHTML = "";
- centerControlDiv.innerHTML = errorMessage;
+ tabDiv.innerHTML = "";
+ appletDiv.innerHTML = errorMessage;
}
function handleBody(xml){
@@ -64,6 +84,16 @@
}
bodyDataListXML = xml;
+ requestAttachmentTemplateList(handleAttachmentTemplateList);
+}
+
+function handleAttachmentTemplateList(xml){
+ if(xml == null){
+ stopAndDisplayError("Could not load attachment template list");
+ return;
+ }
+ attachmentTemplateListXML = xml;
+
awaitInitialLoad();
}
@@ -82,15 +112,27 @@
var defaultBodyID = +bodyXML.getAttribute("bodyconfigurationid");
var ownerUsername = bodyXML.getAttribute("ownerusername");
- var morphHTML = "";
- for(var i = editor.getMorphCount() - 1; i >= 0; i--){
+ var numColumns = 3;
+ var morphHTML = "<table id='morphTable'>";
+ for(var i = 0; i < editor.getMorphCount(); i++){
+ if(i % numColumns == 0){
+ morphHTML += "<tr>";
+ }
+
var morphName = editor.getMorphName(i);
var settingValue = editor.getMorphSetting(morphName);
+ morphHTML += "<td>";
morphHTML += "<h4>" + morphName + ":</h4>";
morphHTML += "<form onsubmit='changeMorph(\"" + morphName + "\", 0.1);return false;'><input type='submit' value='+' name='" + morphName + "'></form>";
morphHTML += " <span id='" + morphName + " setting'>" + formatSettingValue(settingValue) + "</span> ";
morphHTML += "<form onsubmit='changeMorph(\"" + morphName + "\", -0.1);return false;'><input type='submit' value='-' name='" + morphName + "'></form>";
+ morphHTML += "</td>";
+
+ if(i % numColumns == numColumns - 1 || i == editor.getMorphCount() - 1){
+ morphHTML += "</tr>";
+ }
}
+ morphHTML += "</table>";
morphControls.innerHTML = morphHTML;
var animationHTML = "";
@@ -120,12 +162,17 @@
textureForm.action = appPath + "/account/" + ownerUsername + "/body/" + defaultBodyID + "/texture";
+ var bodyConfigurationXML = null;
+
var bodySwitcherHTML = "<form id='bodySwitcherForm' action='body.html' method='get' onsubmit='return false;'>";
bodySwitcherHTML += "<select id='bodySwitcher' onchange='bodySwitcherGo();' name='bodySwitcher'>";
for(var i=0; i < bodyListXML.childNodes.length; i++){
var displayName = bodyListXML.childNodes[i].getAttribute("displayname");
var bodyConfigurationID = bodyListXML.childNodes[i].getAttribute("bodyconfigurationid");
var selected = bodyListXML.childNodes[i].getAttribute("bodyconfigurationid") == bodyXML.getAttribute("bodyconfigurationid");
+ if(selected){
+ bodyConfigurationXML = bodyListXML.childNodes[i];
+ }
var selectedText = selected ? " selected='selected'" : "";
bodySwitcherHTML += "<option " + selectedText + " value='" + bodyConfigurationID + "'>" + escapeHTML(displayName) + "</option>";
}
@@ -148,13 +195,65 @@
bodyDataHTML += "</select>";
bodyDataHTML += "</form>";
bodyDataControl.innerHTML = bodyDataHTML;
+
+ writeAttachmentControls();
+
+ showTab("bodyTab", "bodyControlDiv");
+}
- topControlDiv.style.visibility = "visible";
- bottomControlDiv.style.visibility = "visible";
- leftControlDiv.style.visibility = "visible";
- rightControlDiv.style.visibility = "visible";
+function writeAttachmentControls(){
+ var attachmentHTML = "<ul>";
+ for(var i=0; i < attachmentTemplateListXML.childNodes.length; i++){
+ var node = attachmentTemplateListXML.childNodes[i];
+ var displayName = node.getAttribute("displayname");
+ var templateID = +node.getAttribute("templateid");
+ var ownerUsername = node.getAttribute("ownerusername");
+
+ attachmentHTML += "<br/>" + escapeHTML(displayName);
+
+ var attachmentID = getAttachmentID(templateID);
+ var selected = attachmentID == -1 ? "" : " checked='checked'";
+ attachmentHTML += " <form onsubmit='return false;'><input onchange='goAttachmentChange(\"" + ownerUsername + "\", " + templateID + ");' name='" + templateID + "' type='checkbox' " + selected + " /></form>";
+ }
+ attachmentHTML += "</ul>";
+ if(attachmentTemplateListXML.childNodes.length == 0){
+ attachmentHTML += "There are no available attachments. Dang.";
+ }
+ attachmentControls.innerHTML = attachmentHTML;
}
+function goAttachmentChange(ownerUsername, templateID){
+ var editor = document.getElementById("viewer");
+ var attachmentID = getAttachmentID(templateID);
+ if(attachmentID == -1){
+ editor.addAttachment(ownerUsername, templateID);
+ } else {
+ editor.removeAttachment(attachmentID + "");
+ }
+ requestDefaultBodyDocument(authedUsername, handleBodyPostAttachmentChange);
+ return true;
+}
+
+
+function handleBodyPostAttachmentChange(xml){
+ if(xml == null){
+ return;
+ }
+ bodyXML = xml;
+}
+
+function getAttachmentID(templateID){
+ for(var i=0; i < bodyXML.childNodes.length; i++){
+ if(bodyXML.childNodes[i].tagName != "attachment"){
+ continue;
+ }
+ if(+bodyXML.childNodes[i].getAttribute("templateid") == templateID){
+ return +bodyXML.childNodes[i].getAttribute("attachmentid");
+ }
+ }
+ return -1;
+}
+
function bodyDataSelectGo(){
var editor = document.getElementById("viewer");
var form = document.getElementById("bodyDataForm");
@@ -334,16 +433,27 @@
function initBodyEditor(){
appletDiv = document.getElementById("appletDiv");
- leftControlDiv = document.getElementById("leftControlDiv");
- rightControlDiv = document.getElementById("rightControlDiv");
- bottomControlDiv = document.getElementById("bottomControlDiv");
- topControlDiv = document.getElementById("topControlDiv");
+
+ bodyControlDiv = document.getElementById("bodyControlDiv");
+ if(bodyControlDiv == null){
+ alert("no control div");
+ return;
+ }
+ tabbedControlDivs[tabbedControlDivs.length] = bodyControlDiv;
+ morphControlDiv = document.getElementById("morphControlDiv");
+ tabbedControlDivs[tabbedControlDivs.length] = morphControlDiv;
+ animationControlDiv = document.getElementById("animationControlDiv");
+ tabbedControlDivs[tabbedControlDivs.length] = animationControlDiv;
+ attachmentControlDiv = document.getElementById("attachmentControlDiv");
+ tabbedControlDivs[tabbedControlDivs.length] = attachmentControlDiv;
+
bodyListControl = document.getElementById("bodyListControl");
bodyDataControl = document.getElementById("bodyDataControl");
textureSelectionDiv = document.getElementById("textureSelectionDiv");
textureForm = document.getElementById("textureForm");
morphControls = document.getElementById("morphControls");
animationControls = document.getElementById("animationControls");
+ attachmentControls = document.getElementById("attachmentControls");
addAuthListeners(handleBodyAuth, handleBodyAuth);
}
\ No newline at end of file
Modified: maven/trunk/ogoglio-server/src/main/resources/siteTemplates/ogoglio.js
===================================================================
--- maven/trunk/ogoglio-server/src/main/resources/siteTemplates/ogoglio.js 2008-02-07 12:20:35 UTC (rev 725)
+++ maven/trunk/ogoglio-server/src/main/resources/siteTemplates/ogoglio.js 2008-02-07 12:20:53 UTC (rev 726)
@@ -644,6 +644,10 @@
new XMLRequestManager(appPath + "/account/" + username + "/template/", new BasicHTTPListener(listener)).send();
}
+function requestAttachmentTemplateList(listener){
+ new XMLRequestManager(appPath + "/account/template/attachment/", new BasicHTTPListener(listener)).send();
+}
+
function requestTemplate(username, templateID, listener){
new XMLRequestManager(appPath + "/account/" + username + "/template/" + templateID, new BasicHTTPListener(listener)).send();
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|