COOPY » Guide
version 0.6.5
|
00001 #include <coopy/SocialCalcSheet.h> 00002 00003 using namespace coopy::store; 00004 using namespace coopy::store::socialcalc; 00005 using namespace coopy::js; 00006 using namespace std; 00007 00008 extern std::string socialcalc_3(); 00009 extern std::string socialcalcconstants(); 00010 extern std::string socialcalctableeditor(); 00011 extern std::string socialcalcspreadsheetcontrol(); 00012 extern std::string socialcalcwrap(); 00013 00014 bool SocialCalcSheet::jsSetup(JsWrap& j) { 00015 string check = j.apply("(typeof socialcalcwrap_loaded!='undefined')?'loaded':'not loaded'"); 00016 if (check!="loaded") { 00017 dbg_printf("Setup\n"); 00018 j.apply(socialcalc_3()); 00019 j.apply(socialcalcconstants()); 00020 j.apply(socialcalctableeditor()); 00021 j.apply(socialcalcspreadsheetcontrol()); 00022 j.apply(socialcalcwrap()); 00023 } 00024 return true; 00025 } 00026 00027 bool SocialCalcSheet::select() const { 00028 if (!jssheet) { 00029 ((SocialCalcSheet *)this)->setup(); 00030 } 00031 if (!jssheet) return false; 00032 if (!js.isCurrentId(id)) { 00033 ((JsWrap *)&js)->send("set_active_sheet",jssheet); 00034 js.setCurrentId(id); 00035 } 00036 return true; 00037 } 00038 00039 bool SocialCalcSheet::reset() { 00040 if (jssheet) { 00041 JS_RemoveValueRoot(js.context(),jssheet); 00042 delete jssheet; 00043 jssheet = NULL; 00044 } 00045 return true; 00046 } 00047 00048 bool SocialCalcSheet::setup() { 00049 jsSetup(js); 00050 reset(); 00051 jssheet = new jsval; 00052 if (!jssheet) return false; 00053 jsval lval; 00054 JSBool ok = JS_CallFunctionName(js.context(), js.global(), 00055 "create_spreadsheet", 00056 0,&lval,jssheet); 00057 if (!jssheet) return false; 00058 JS_AddValueRoot(js.context(),jssheet); 00059 id = js.getId(); 00060 dbg_printf("Made a sheet! %d\n", id); 00061 js.send("set_active_sheet",jssheet); 00062 dbg_printf("Set a sheet!\n"); 00063 js.setCurrentId(id); 00064 return true; 00065 } 00066 00067 00068 std::string SocialCalcSheet::cellString(int x, int y) const { 00069 bool escaped; 00070 return cellString(x,y,escaped); 00071 } 00072 00073 std::string SocialCalcSheet::cellString(int x, int y, bool& escaped) const { 00074 escaped = true; 00075 if (!select()) return ""; 00076 jsval args[3] = { INT_TO_JSVAL(x), INT_TO_JSVAL(y) }; 00077 jsval rval; 00078 JSBool ok = JS_CallFunctionName(js.context(),js.global(),"sheet_get_cell",2,&args[0],&rval); 00079 if (JSVAL_IS_NULL(rval)) { 00080 return ""; 00081 } 00082 JSString *str = JS_ValueToString(js.context(),rval); 00083 escaped = false; 00084 return JS_EncodeString(js.context(), str); 00085 } 00086 00087 bool SocialCalcSheet::cellString(int x, int y, const std::string& str, bool escaped) { 00088 if (!select()) return false; 00089 jsval args[3] = { INT_TO_JSVAL(x), INT_TO_JSVAL(y), JSVAL_NULL }; 00090 if (!escaped) { 00091 args[2] = STRING_TO_JSVAL(JS_NewStringCopyN(js.context(),str.c_str(), 00092 str.length())); 00093 } 00094 jsval rval; 00095 JSBool ok = JS_CallFunctionName(js.context(),js.global(),"sheet_set_cell",3,&args[0],&rval); 00096 if (x>=w) w = x+1; 00097 if (y>=h) h = y+1; 00098 return true; 00099 } 00100 00101 ColumnRef SocialCalcSheet::moveColumn(const ColumnRef& src, const ColumnRef& base) { 00102 if (!select()) return ColumnRef(); 00103 jsval args[4] = { 00104 INT_TO_JSVAL(src.getIndex()), 00105 INT_TO_JSVAL(base.getIndex()), 00106 INT_TO_JSVAL(w), 00107 INT_TO_JSVAL(h) 00108 }; 00109 jsval rval; 00110 JSBool ok = JS_CallFunctionName(js.context(),js.global(),"sheet_move_column", 00111 4,&args[0],&rval); 00112 int ret = JSVAL_TO_INT(rval); 00113 return ColumnRef(ret); 00114 } 00115 00116 bool SocialCalcSheet::deleteColumn(const ColumnRef& column) { 00117 if (!select()) return false; 00118 jsval args[3] = { 00119 INT_TO_JSVAL(column.getIndex()) , 00120 INT_TO_JSVAL(w), 00121 INT_TO_JSVAL(h) 00122 }; 00123 jsval rval; 00124 JSBool ok = JS_CallFunctionName(js.context(),js.global(), 00125 "sheet_delete_column",3,&args[0],&rval); 00126 int ret = JSVAL_TO_INT(rval); 00127 if (ret>=0) w--; 00128 return ret>=0; 00129 } 00130 00131 ColumnRef SocialCalcSheet::insertColumn(const ColumnRef& base) { 00132 if (!select()) return ColumnRef(); 00133 jsval args[3] = { 00134 INT_TO_JSVAL(base.getIndex()) , 00135 INT_TO_JSVAL(w), 00136 INT_TO_JSVAL(h) 00137 }; 00138 jsval rval; 00139 JSBool ok = JS_CallFunctionName(js.context(),js.global(), 00140 "sheet_insert_column",3,&args[0],&rval); 00141 int ret = JSVAL_TO_INT(rval); 00142 if (ret>=0) w++; 00143 return ColumnRef(ret); 00144 } 00145 00146 ColumnRef SocialCalcSheet::insertColumn(const ColumnRef& base, const ColumnInfo& kind) { 00147 return insertColumn(base); 00148 } 00149 00150 bool SocialCalcSheet::modifyColumn(const ColumnRef& base, const ColumnInfo& kind) { 00151 return false; 00152 } 00153 00154 RowRef SocialCalcSheet::insertRow(const RowRef& base) { 00155 if (!select()) return RowRef(); 00156 jsval args[3] = { 00157 INT_TO_JSVAL(base.getIndex()) , 00158 INT_TO_JSVAL(w), 00159 INT_TO_JSVAL(h) 00160 }; 00161 jsval rval; 00162 JSBool ok = JS_CallFunctionName(js.context(),js.global(), 00163 "sheet_insert_row",3,&args[0],&rval); 00164 int ret = JSVAL_TO_INT(rval); 00165 if (ret>=0) h++; 00166 return RowRef(ret); 00167 } 00168 00169 bool SocialCalcSheet::deleteRow(const RowRef& src) { 00170 return deleteRows(src,src); 00171 } 00172 00173 bool SocialCalcSheet::deleteRows(const RowRef& first, const RowRef& last) { 00174 if (!select()) return false; 00175 jsval args[4] = { 00176 INT_TO_JSVAL(first.getIndex()) , 00177 INT_TO_JSVAL(last.getIndex()) , 00178 INT_TO_JSVAL(w), 00179 INT_TO_JSVAL(h) 00180 }; 00181 jsval rval; 00182 JSBool ok = JS_CallFunctionName(js.context(),js.global(), 00183 "sheet_delete_rows",4,&args[0],&rval); 00184 int ret = JSVAL_TO_INT(rval); 00185 if (ret>=0) h -= ret; 00186 return ret>=0; 00187 } 00188 00189 RowRef SocialCalcSheet::moveRow(const RowRef& src, const RowRef& base) { 00190 return RowRef(); 00191 } 00192 00193 bool SocialCalcSheet::fromCsvString(const std::string& str) { 00194 if (!setup()) return false; 00195 dbg_printf("SocialCalc: Loading from csv\n"); 00196 js.send("load_from_csv",str); 00197 updateSize(); 00198 return true; 00199 } 00200 00201 bool SocialCalcSheet::fromSocialCalcString(const std::string& str) { 00202 if (!setup()) return false; 00203 dbg_printf("SocialCalc: Loading from native:\n===\n%s\n===\n", str.c_str()); 00204 js.send("set_src",str); 00205 dbg_printf("Set src!\n"); 00206 updateSize(); 00207 return true; 00208 } 00209 00210 std::string SocialCalcSheet::toSocialCalcString(const Property& config) { 00211 if (!select()) return ""; 00212 string result = js.apply("get_full()"); 00213 00214 return result; 00215 } 00216 00217 bool SocialCalcSheet::updateSize() { 00218 jsval jw, jh; 00219 jsval lval; 00220 JSBool ok; 00221 ok = JS_CallFunctionName(js.context(), js.global(), 00222 "sheet_get_width", 00223 0,&lval,&jw); 00224 ok = ok && JS_CallFunctionName(js.context(), js.global(), 00225 "sheet_get_height", 00226 0,&lval,&jh); 00227 if (!ok) return false; 00228 w = JSVAL_TO_INT(jw); 00229 h = JSVAL_TO_INT(jh); 00230 //printf("SIZE %dx%d\n", w, h); 00231 return true; 00232 }