COOPY » Guide  version 0.6.5
/home/paulfitz/cvs/coopy_scm/coopy/src/libsocialcalc/SocialCalcSheet.cpp
Go to the documentation of this file.
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 }
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Defines