diff --git a/OpenPage/assets/OpenPage.md b/OpenPage/assets/OpenPage.md
new file mode 100644
index 0000000..d9dfca7
--- /dev/null
+++ b/OpenPage/assets/OpenPage.md
@@ -0,0 +1,14 @@
+![](https://os.lxsang.me/repo/OpenPage/OpenPage.png)
+# OpenPage: ODT (Open Document Text) editor alpha
+**OpenPage** is an AntOS application developed in-browser using AntOSDK. It is a Pure Javascript based rich text editor compatible with Open Document Format.
+
+**Feature:**
+* Open, view and edit *.odt* documents
+* Offer various formatting style to text
+* Define and apply paragraph styles
+* Insert link, image
+* Embeded fonts
+* Save documents as ODF format so that it can be compatible with desktop applications like Open Office
+
+**Credit:**
+OpenPage is heavily based on the WebODF javascript library: https://webodf.org
\ No newline at end of file
diff --git a/OpenPage/assets/blank.odt b/OpenPage/assets/blank.odt
new file mode 100644
index 0000000..90a6000
Binary files /dev/null and b/OpenPage/assets/blank.odt differ
diff --git a/OpenPage/assets/icon.png b/OpenPage/assets/icon.png
new file mode 100644
index 0000000..ad142f9
Binary files /dev/null and b/OpenPage/assets/icon.png differ
diff --git a/OpenPage/build/debug/README.md b/OpenPage/build/debug/README.md
deleted file mode 100644
index 9dcf530..0000000
--- a/OpenPage/build/debug/README.md
+++ /dev/null
@@ -1,24 +0,0 @@
-# OpenPage
-This is an example project, generated by AntOS Development Kit
-
-## Howto
-
-1. Open the project.apj file with AntOSDK (simply double Click on it)
-2. Modify the UI in *assets/scheme.html*
-3. Modify application code in *coffees/main.coffee*
-4. Modify CSS style in *css/main.css*
-5. Other files need to be copied: put in to assets
-
-## Set up build target
-
-Click **Menu> Build > Build Option** or simply hit **ALT-Y**
-
-In the build options dialog, add or remove files that need to be
-included into the build
-
-Click **Save**
-
-## Build application
-* To build: **Menu > Build > Build** or **ALT-C**
-* To build and run: **Menu > Build > Build and Run** or **CTRL-R**
-* To release: **Menu > Build > Build release** or **ALT-P**
\ No newline at end of file
diff --git a/OpenPage/build/debug/main.css b/OpenPage/build/debug/main.css
deleted file mode 100644
index 5340c8d..0000000
--- a/OpenPage/build/debug/main.css
+++ /dev/null
@@ -1,77 +0,0 @@
-
-afx-app-window[data-id="OpenPage"] div[data-id="container"]
-{
- overflow: auto;
- margin:0px;
- padding:0px;
- padding-top: 10px;
- padding-bottom: 10px;
- text-align: center;
- background-color: #f2f1f0;
-}
-
-afx-app-window[data-id="OpenPage"] div[data-id="odfcanvas"]
-{
- cursor: text;
- margin:auto;
- box-shadow: 1px 1px 3px 3px #9f9F9F;
-}
-
-afx-app-window[data-id="OpenPage"] afx-hbox[data-id="toolbox"]
-{
- background-color: #f5f5f5;
- border: 1px solid #eaeaea;
- box-shadow: 3px 3px 3px #9f9F9F;
-}
-afx-app-window[data-id="OpenPage"] afx-hbox[data-id="status-bar"]
-{
- background-color: #f5f5f5;
- border: 1px solid #eaeaea;
- box-shadow: -3px -3px 3px #9f9F9F;
-}
-afx-app-window[data-id="OpenPage"] afx-hbox[data-id="toolbox"] afx-button button, afx-app-window[data-id="OpenPage"] afx-button[data-id="btzoomfix"] button
-{
- border: 1px solid #f5f5f5;
- background-color: transparent;
- width:100%;
- height: 100%;
-}
-
-afx-app-window[data-id="OpenPage"] afx-hbox[data-id="toolbox"] afx-button button:hover, afx-app-window[data-id="OpenPage"] afx-hbox[data-id="toolbox"] afx-button button.btactive, afx-app-window[data-id="OpenPage"] afx-button[data-id="btzoomfix"] button:hover
-{
- border: 1px solid #759DC0;
- background-color: transparent;
- border-radius:5px;
- color:#759DC0;
-}
-afx-app-window[data-id="HyperLinkDialog"] afx-label.header span
-{
- font-weight: bold;
-}
-afx-app-window[data-id="FormatDialog"] afx-label.header
-{
- padding-left: 5px;
- border-bottom: 1px solid #a6a6a6;
-}
-afx-app-window[data-id="FormatDialog"] afx-label.header span
-{
- font-weight: bold;
-}
-afx-app-window[data-id="FormatDialog"] afx-hbox[data-id="aligmentbox"] afx-label span,
-afx-app-window[data-id="FormatDialog"] afx-hbox[data-id="spacingbox"] afx-label span,
-afx-app-window[data-id="FormatDialog"] afx-hbox[data-id="stylebox"] afx-label span
-{
- display: block;
- padding-top: 7px;
-}
-
-afx-app-window[data-id="FormatDialog"] div[data-id="preview"]
-{
- border: 1px solid #a6a6a6;
-}
-afx-app-window[data-id="FormatDialog"] div[data-id="txtcolor"],
-afx-app-window[data-id="FormatDialog"] div[data-id="bgcolor"]
-{
- border:1px solid #a6a6a6;
- display: block;
-}
\ No newline at end of file
diff --git a/OpenPage/build/debug/package.json b/OpenPage/build/debug/package.json
deleted file mode 100644
index 17edcfe..0000000
--- a/OpenPage/build/debug/package.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "app":"OpenPage",
- "name":"OpenPage",
- "description":"",
- "info":{
- "author": "",
- "email": ""
- },
- "version":"0.0.1-a",
- "category":"Other",
- "iconclass":"fa fa-adn",
- "mimes":["none"]
-}
\ No newline at end of file
diff --git a/OpenPage/build/debug/scheme.html b/OpenPage/build/debug/scheme.html
deleted file mode 100644
index 3f16689..0000000
--- a/OpenPage/build/debug/scheme.html
+++ /dev/null
@@ -1,47 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/OpenPage/build/debug/main.js b/OpenPage/build/release/OpenPage.zip
similarity index 74%
rename from OpenPage/build/debug/main.js
rename to OpenPage/build/release/OpenPage.zip
index 76dbf10..882e08b 100644
Binary files a/OpenPage/build/debug/main.js and b/OpenPage/build/release/OpenPage.zip differ
diff --git a/OpenPage/coffees/dialogs.coffee b/OpenPage/coffees/dialogs.coffee
index 164bf1a..e8f155b 100644
--- a/OpenPage/coffees/dialogs.coffee
+++ b/OpenPage/coffees/dialogs.coffee
@@ -49,6 +49,12 @@ class FormatDialog extends this.OS.GUI.BaseDialog
right: @find("spnright"),
top: @find("spntop"),
bottom: @find("spnbottom"),
+ lineheight: @find("spnlheight")
+ padding:
+ left: @find("pspnleft"),
+ right: @find("pspnright"),
+ top: @find("pspntop"),
+ bottom: @find("pspnbottom"),
style:
bold: @find("swbold"),
italic: @find("switalic"),
@@ -59,10 +65,25 @@ class FormatDialog extends this.OS.GUI.BaseDialog
family: @find("lstfont"),
size: @find("spnfsize")
formats: @find("lstformats")
+ @initStyleObject()
+ @preview = ($(@find "preview").find "p")[0]
+ $(@preview)
+ .css "padding", "0"
+ .css "margin", "0"
+ @initUIEvent()
+ #@previewStyle()
+
+ initStyleObject: ()->
# init the format object
@currentStyle =
aligment: @_api.switcher("left", "right", "center", "justify"),
spacing:
+ left:0
+ top:0,
+ right:0,
+ bottom:0,
+ lineheight: 0
+ padding:
left:0
top:0,
right:0,
@@ -76,12 +97,6 @@ class FormatDialog extends this.OS.GUI.BaseDialog
font:
family: undefined,
size: 12
- @preview = ($(@find "preview").find "p")[0]
- $(@preview)
- .css "padding", "0"
- .css "margin", "0"
- @initUIEvent()
- @previewStyle()
initUIEvent: () ->
me = @
@@ -96,6 +111,8 @@ class FormatDialog extends this.OS.GUI.BaseDialog
set "onchange", "aligment", k, ((e) -> e.data)
for k,v of @ui.spacing
set "onchange", "spacing", k
+ for k,v of @ui.padding
+ set "onchange", "padding", k
for k,v of @ui.style
set "onchange", "style", k, ((e) -> e.data) if k isnt "color" and k isnt "bgcolor"
set "onchange", "font", "size"
@@ -116,14 +133,88 @@ class FormatDialog extends this.OS.GUI.BaseDialog
@ui.formats.set "onlistselect", (e) ->
me.fromODFStyleFormat e.data
@ui.formats.set "selected", 0
- #@currentStyle =
+ (@find "btok").set "onbtclick", (e) ->
+ me.saveCurrentStyle()
+
+ (@find "btx").set "onbtclick", (e) ->
+ me.quit()
+
+ (@find "bt-clone").set "onbtclick", (e) ->
+ me.clone()
+
+ clone: ()->
+ me = @
+ selected = @ui.formats.get "selected"
+ return unless selected
+ @openDialog "PromptDialog", (d) ->
+ return me.notify __("Abort: no style name is specified") unless d and d.trim() isnt ""
+ newstyle = me.parent.editorSession.cloneParagraphStyle selected.name, d
+ me.ui.formats.push { text:d, name: newstyle }
+ me.ui.formats.set "selected", ((me.ui.formats.get 'count') - 1)
+ me.notify __("New style: {0} added", newstyle)
+ , __("Clone style: {0}", selected.text), { label: __("New style name:") }
+
+ saveCurrentStyle: () ->
+ selected = @ui.formats.get "selected"
+ return unless selected
+ odfs =
+ "style:paragraph-properties":
+ "fo:margin-top": @currentStyle.spacing.top + "mm"
+ "fo:margin-left": @currentStyle.spacing.left + "mm"
+ "fo:margin-bottom": @currentStyle.spacing.bottom + "mm"
+ "fo:margin-right": @currentStyle.spacing.right + "mm"
+ "fo:padding-top": @currentStyle.padding.top + "mm"
+ "fo:padding-left": @currentStyle.padding.left + "mm"
+ "fo:padding-bottom": @currentStyle.padding.bottom + "mm"
+ "fo:padding-right": @currentStyle.padding.right + "mm"
+ "fo:line-height": if @currentStyle.spacing.lineheight > 0 then @currentStyle.spacing.lineheight + "mm" else "normal"
+ "fo:text-align": @currentStyle.aligment.selected || "left"
+ "style:text-properties":
+ "fo:font-weight": if @currentStyle.style.bold then "bold" else "normal"
+ "fo:font-style": if @currentStyle.style.italic then "italic" else "normal"
+ "style:text-underline-style": if @currentStyle.style.underline then "solid" else "none"
+ "fo:font-size": @currentStyle.font.size + "pt"
+ "fo:font-name": @currentStyle.font.family.text
+ "fo:color": if @currentStyle.style.color then @currentStyle.style.color.hex else "#000000"
+ "fo:background-color": if @currentStyle.style.bgcolor then @currentStyle.style.bgcolor.hex else "transparent"
+ @parent.editorSession.updateParagraphStyle selected.name, odfs
+ @notify __("Paragraph format [{0}] is saved", selected.text)
fromODFStyleFormat: (odfs) ->
- console.log "change style"
- console.log odfs
+ me = @
+ @initStyleObject()
+ cssUnits = new core.CSSUnits()
+ findFont = (name) ->
+ items = me.ui.font.family.get "items"
+ item = v for v in items when v.text is name
+ return undefined unless item
+ return item
+ # spacing
+ style = @parent.editorSession.getParagraphStyleAttributes(odfs.name)['style:paragraph-properties']
+ if style
+ @currentStyle.spacing.top = cssUnits.convertMeasure(style['fo:margin-top'], 'mm') || 0
+ @currentStyle.spacing.left = cssUnits.convertMeasure(style['fo:margin-left'], 'mm') || 0
+ @currentStyle.spacing.right = cssUnits.convertMeasure(style['fo:margin-right'], 'mm') || 0
+ @currentStyle.spacing.bottom = cssUnits.convertMeasure(style['fo:margin-bottom'], 'mm') || 0
+ @currentStyle.padding.top = cssUnits.convertMeasure(style['fo:padding-top'], 'mm') || 0
+ @currentStyle.padding.left = cssUnits.convertMeasure(style['fo:padding-left'], 'mm') || 0
+ @currentStyle.padding.right = cssUnits.convertMeasure(style['fo:padding-right'], 'mm') || 0
+ @currentStyle.padding.bottom = cssUnits.convertMeasure(style['fo:padding-bottom'], 'mm') || 0
+ @currentStyle.spacing.lineheight = cssUnits.convertMeasure(style['fo:line-height'], 'mm') || 4.2 # 1em = 4,2175176mm
+ @currentStyle.aligment[style['fo:text-align']] = true if style['fo:text-align']
+ style = @parent.editorSession.getParagraphStyleAttributes(odfs.name)['style:text-properties']
+ if style
+ @currentStyle.style.bold = style['fo:font-weight'] is 'bold'
+ @currentStyle.style.italic = style['fo:font-style'] is 'italic'
+ @currentStyle.style.underline = true if style['style:text-underline-style'] and style['style:text-underline-style'] isnt 'none'
+ @currentStyle.font.size = parseFloat style['fo:font-size']
+ @currentStyle.font.family = findFont style['style:font-name']
+ @currentStyle.style.color = { hex: style['fo:color'] } if style['fo:color']
+ @currentStyle.style.bgcolor = { hex: style['fo:background-color'] } if style['fo:background-color']
+ @previewStyle()
previewStyle: () ->
- console.log "previewing"
+ #console.log "previewing"
# reset ui
@ui.aligment.left.set "swon", @currentStyle.aligment.left
@ui.aligment.right.set "swon", @currentStyle.aligment.right
@@ -133,45 +224,62 @@ class FormatDialog extends this.OS.GUI.BaseDialog
@ui.spacing.right.set "value", @currentStyle.spacing.right
@ui.spacing.top.set "value", @currentStyle.spacing.top
@ui.spacing.bottom.set "value", @currentStyle.spacing.bottom
+ @ui.spacing.lineheight.set "value", @currentStyle.spacing.lineheight
+
+ @ui.padding.left.set "value", @currentStyle.padding.left
+ @ui.padding.right.set "value", @currentStyle.padding.right
+ @ui.padding.top.set "value", @currentStyle.padding.top
+ @ui.padding.bottom.set "value", @currentStyle.padding.bottom
+
@ui.style.bold.set "swon", @currentStyle.style.bold
@ui.style.italic.set "swon", @currentStyle.style.italic
@ui.style.underline.set "swon", @currentStyle.style.underline
@ui.font.size.set "value", @currentStyle.font.size
- items = @ui.font.family.get "items"
- item = i for v, i in items when v.name is name
- @ui.font.family.set "selected", item if item >= 0
+ #console.log @currentStyle
+ if @currentStyle.font.family
+ items = @ui.font.family.get "items"
+ item = i for v, i in items when v.text is @currentStyle.font.family.text
+ @ui.font.family.set "selected", item if item >= 0
- $(@ui.style.color).css "background-color", @currentStyle.style.color.hex if @currentStyle.style.color
- $(@ui.style.bgcolor).css "background-color", @currentStyle.style.bgcolor.hex if @currentStyle.style.bgcolor
+ $(@ui.style.color).css "background-color", if @currentStyle.style.color then @currentStyle.style.color.hex else "#000000"
+ $(@ui.style.bgcolor).css "background-color", if @currentStyle.style.bgcolor then @currentStyle.style.bgcolor.hex else "white"
# set the preview css
el = $ @preview
- el.css "text-align", @currentStyle.aligment.selected
- el.css "padding-left", @currentStyle.spacing.left + "mm"
- el.css "padding-right", @currentStyle.spacing.right + "mm"
- el.css "padding-top", @currentStyle.spacing.top + "mm"
- el.css "padding-bottom", @currentStyle.spacing.bottom + "mm"
+ el.css "text-align", if @currentStyle.aligment.selected then @currentStyle.aligment.selected else "left"
+ el.css "margin-left", @currentStyle.spacing.left + "mm"
+ el.css "margin-right", @currentStyle.spacing.right + "mm"
+ el.css "margin-top", @currentStyle.spacing.top + "mm"
+ el.css "margin-bottom", @currentStyle.spacing.bottom + "mm"
+
+ el.css "padding-left", @currentStyle.padding.left + "mm"
+ el.css "padding-right", @currentStyle.padding.right + "mm"
+ el.css "padding-top", @currentStyle.padding.top + "mm"
+ el.css "padding-bottom", @currentStyle.padding.bottom + "mm"
+
el
.css "font-weight", "normal"
.css "font-style", "normal"
.css "text-decoration", "none"
+ .css "line-height", "normal"
el.css "font-weight", "bold" if @currentStyle.style.bold
el.css "font-style", "italic" if @currentStyle.style.italic
el.css "text-decoration", "underline" if @currentStyle.style.underline
- el.css "color", @currentStyle.style.color.hex if @currentStyle.style.color
- el.css "background-color", @currentStyle.style.bgcolor.hex if @currentStyle.style.bgcolor
+ el.css "color", if @currentStyle.style.color then @currentStyle.style.color.hex else "#000000"
+ el.css "background-color", if @currentStyle.style.bgcolor then @currentStyle.style.bgcolor.hex else "transparent"
el.css "font-size", @currentStyle.font.size + "pt"
el.css "font-family", @currentStyle.font.family.name if @currentStyle.font.family
+ el.css "line-height", @currentStyle.spacing.lineheight + "mm" if @currentStyle.spacing.lineheight > 0
FormatDialog.scheme = """
-
+
-
+
@@ -188,7 +296,7 @@ FormatDialog.scheme = """
-
+
@@ -205,6 +313,25 @@ FormatDialog.scheme = """
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -226,12 +353,15 @@ FormatDialog.scheme = """
-
+
+
+
+
@@ -248,7 +378,7 @@ FormatDialog.scheme = """
-
+
diff --git a/OpenPage/coffees/main.coffee b/OpenPage/coffees/main.coffee
index 0618e9d..6f1ef05 100644
--- a/OpenPage/coffees/main.coffee
+++ b/OpenPage/coffees/main.coffee
@@ -4,19 +4,101 @@ class OpenPage extends this.OS.GUI.BaseApplication
main: () ->
# load session class
- if not OpenPage.EditorSession
- require ["webodf/editor/EditorSession"], (ES) ->
- OpenPage.EditorSession = ES
- @userid = @systemsetting.user.username
+ #if not OpenPage.EditorSession
+ # require ["webodf/editor/EditorSession"], (ES) ->
+ # OpenPage.EditorSession = ES
+ me =@
@eventSubscriptions = new core.EventSubscriptions()
@initToolbox()
- @initCanvas()
- @canvas.load "#{@_api.handler.get}/home://welcome.odt"
+ @userid = "#{@systemsetting.user.username}@#{@pid}"
+ #file = "home://welcome.odt"
+ #file = "#{@_api.handler.get}/home://welcome.odt"
+ #@canvas.load file
+ #odfContainer = new odf.OdfContainer file, (c) ->
+ # me.canvas.setOdfContainer c, false
@currentStyle = ""
+ if @args and @args.length > 0 then @open @args[0] else @newdoc()
@resource =
fonts: []
formats: []
+ @bindKey "ALT-N", () -> me.actionFile "#{me.name}-New"
+ @bindKey "ALT-O", () -> me.actionFile "#{me.name}-Open"
+ @bindKey "CTRL-S", () -> me.actionFile "#{me.name}-Save"
+ @bindKey "ALT-W", () -> me.actionFile "#{me.name}-Saveas"
+
+ menu: () ->
+ me = @
+ menu = [{
+ text: "__(File)",
+ child: [
+ { text: "__(New)", dataid: "#{@name}-New", shortcut: "A-N" },
+ { text: "__(Open)", dataid: "#{@name}-Open", shortcut: "A-O" },
+ { text: "__(Save)", dataid: "#{@name}-Save", shortcut: "C-S" },
+ { text: "__(Save as)", dataid: "#{@name}-Saveas", shortcut: "A-W" }
+ ],
+ onmenuselect: (e) -> me.actionFile e.item.data.dataid
+ }]
+ menu
+
+ actionFile: (e) ->
+ me = @
+ saveas = () ->
+ me.openDialog "FileDiaLog", (d, n, p) ->
+ me.currfile.setPath "#{d}#{n}"
+ me.save()
+ , __("Save as"), { file: me.currfile }
+ switch e
+ when "#{@name}-Open"
+ @openDialog "FileDiaLog", ( d, f , p) ->
+ me.open p
+ , __("Open file"), { mimes: me.meta().mimes }
+ when "#{@name}-Save"
+ #@currfile.cache = @editor.value()
+ return @save() if @currfile.basename
+ saveas()
+ when "#{@name}-Saveas"
+ saveas()
+ when "#{@name}-New"
+ @newdoc()
+
+
+ newdoc: () ->
+ blank = "#{@meta().path}/blank.odt"
+ @open blank, true
+ open: (p,b) ->
+ me = @
+
+ @pathAsDataURL(p)
+ .then (r) ->
+ me.closeDocument() if me.editorSession
+ me.initCanvas()
+ OdfContainer = new odf.OdfContainer r.reader.result, (c) ->
+ me.canvas.setOdfContainer c, false
+ return me.currfile = "Untitled".asFileHandler() if b
+ me.currfile.setPath p
+ me.scheme.set "apptitle", me.currfile.basename
+ me.notify __("File {0} opened", p)
+ .catch (e) ->
+ me.error __("Problem read file {0}", e)
+
+ save: () ->
+ me = @
+ return unless @editorSession
+ container = @canvas.odfContainer()
+ return @error __("No document container found") unless container
+ container.createByteArray (ba) ->
+ # create blob
+ me.currfile.cache = new Blob [ba], { type: "application/vnd.oasis.opendocument.text" }
+ me.currfile.write "application/vnd.oasis.opendocument.text", (r) ->
+ return me.error __("Cannot save file: {0}", r.error) if r.error
+ me.notify __("File {0} saved", me.currfile.basename)
+ me.scheme.set "apptitle", me.currfile.basename
+ me.currfile.dirty = false
+ me.editorFocus()
+ , (err) ->
+ @error __("Cannot create byte array from container: {0}", err|| "")
+
initToolbox: () ->
me = @
@basictool =
@@ -69,8 +151,14 @@ class OpenPage extends this.OS.GUI.BaseApplication
el.classList.add "notranslate"
@canvas = new odf.OdfCanvas(el)
@documentChanged = (e) ->
+ return if me.currfile.dirty
+ me.currfile.dirty = true
+ me.scheme.set "apptitle", me.currfile.basename + "*"
#console.log e
@metaChanged = (e) ->
+ return if me.currfile.dirty
+ me.currfile.dirty = true
+ me.scheme.set "apptitle", me.currfile.basename + "*"
#console.log e
@textStylingChanged = (e) ->
me.updateToolbar e
@@ -81,13 +169,23 @@ class OpenPage extends this.OS.GUI.BaseApplication
me.currentStyle = e.styleName
me.basictool.styles.set "selected", item
+ @styleAdded = (e) ->
+ return unless e.family is 'paragraph'
+ items = me.basictool.styles.get "items"
+ item = v for v in items when v.name is e.name
+ return if item
+ stylens = "urn:oasis:names:tc:opendocument:xmlns:style:1.0"
+ el = me.editorSession.getParagraphStyleElement e.name
+ dtext = el.getAttributeNS stylens, 'display-name'
+ me.basictool.styles.push { text: dtext , name: e.name }, true
+ #me.resource.formats.push {text: dtext, name:e.name}
+
@updateSlider = (v) ->
value = Math.floor v*100
me.basictool.zoom.set "value", value
zlb = me.find "lbzoom"
zlb.set "text", value+"%"
-
- #@canvas.enableAnnotations(true, true)
+ #me.canvas.enableAnnotations true, true
@canvas.addListener "statereadychange", ()->
me.session = new ops.Session(me.canvas)
viewOptions =
@@ -107,6 +205,10 @@ class OpenPage extends this.OS.GUI.BaseApplication
zoomingEnabled: true,
reviewModeEnabled: false
})
+ me.initFontList me.editorSession.getDeclaredFonts()
+ me.initStyles me.editorSession.getAvailableParagraphStyles()
+ #fix annotation problem on canvas
+ #console.log $("office:body").css "background-color", "red"
# basic format
me.directFormattingCtl = me.editorSession.sessionController.getDirectFormattingController()
me.directFormattingCtl.subscribe gui.DirectFormattingController.textStylingChanged, me.textStylingChanged
@@ -119,6 +221,8 @@ class OpenPage extends this.OS.GUI.BaseApplication
me.eventSubscriptions.addFrameSubscription me.editorSession, OpenPage.EditorSession.signalParagraphChanged, ()-> me.updateHyperlinkButtons()
me.eventSubscriptions.addFrameSubscription me.editorSession, OpenPage.EditorSession.signalParagraphStyleModified, ()-> me.updateHyperlinkButtons()
+ #annotation controller
+ me.annotationController = me.editorSession.sessionController.getAnnotationController()
#image controller
me.imageController = me.editorSession.sessionController.getImageController()
@@ -132,6 +236,9 @@ class OpenPage extends this.OS.GUI.BaseApplication
me.zoomHelper.subscribe gui.ZoomHelper.signalZoomChanged, me.updateSlider
me.updateSlider me.zoomHelper.getZoomLevel()
+ # format controller
+ me.editorSession.subscribe OpenPage.EditorSession.signalCommonStyleCreated, me.styleAdded
+
me.editorSession.sessionController.setUndoManager new gui.TrivialUndoManager()
me.editorSession.sessionController.getUndoManager().subscribe gui.UndoManager.signalDocumentModifiedChanged, me.documentChanged
me.editorSession.sessionController.getMetadataController().subscribe gui.MetadataController.signalMetadataChanged, me.metaChanged
@@ -144,8 +251,6 @@ class OpenPage extends this.OS.GUI.BaseApplication
}
}
me.session.enqueue([op])
- me.initFontList me.editorSession.getDeclaredFonts()
- me.initStyles me.editorSession.getAvailableParagraphStyles()
me.editorSession.sessionController.insertLocalCursor()
me.editorSession.sessionController.startEditing()
#console.log me.editorSession.getDeclaredFonts()
@@ -157,8 +262,9 @@ class OpenPage extends this.OS.GUI.BaseApplication
@basictool.fonts.set "items", list
initStyles: (list) ->
+ list.unshift {name:"", displayName: 'Default style' }
v.text = v.displayName for v in list
- @resource.formats.push { text: v.text, name: v.name, el: @editorSession.getParagraphStyleElement(v.name) } for v in list
+ @resource.formats.push { text: v.text, name: v.name } for v in list
@basictool.styles.set "items", list
updateToolbar: (changes) ->
@@ -215,6 +321,9 @@ class OpenPage extends this.OS.GUI.BaseApplication
ac: (e) ->
@directFormattingCtl.alignParagraphCenter()
+ note: (e) ->
+ @annotationController.addAnnotation()
+
aj: (e) ->
@directFormattingCtl.alignParagraphJustified()
@@ -274,30 +383,37 @@ class OpenPage extends this.OS.GUI.BaseApplication
redo: (e) ->
@editorSession.redo()
- image: (e) ->
- me = @
- @openDialog "FileDiaLog", (d, n, p) ->
+ pathAsDataURL: (p) ->
+ return new Promise (resolve, error) ->
fp = p.asFileHandler()
- fp.asFileHandler().read (data) ->
+ fp.read (data) ->
blob = new Blob [data], { type: fp.info.mime }
reader = new FileReader()
reader.onloadend = () ->
- return me.error __("Couldnt load image {0}", p) if reader.readyState isnt 2
- # insert the image to document
+ return error(p) if reader.readyState isnt 2
+ resolve {reader: reader, fp: fp }
+ reader.readAsDataURL blob
+ , "binary"
+
+
+ image: (e) ->
+ me = @
+ @openDialog "FileDiaLog", (d, n, p) ->
+ me.pathAsDataURL(p)
+ .then (r) ->
hiddenImage = new Image()
hiddenImage.style.position = "absolute"
hiddenImage.style.left = "-99999px"
document.body.appendChild hiddenImage
hiddenImage.onload = () ->
- content = reader.result.substring(reader.result.indexOf(",") + 1)
+ content = r.reader.result.substring(r.reader.result.indexOf(",") + 1)
#insert image
me.textController.removeCurrentSelection()
- me.imageController.insertImage fp.info.mime, content, hiddenImage.width, hiddenImage.height
+ me.imageController.insertImage r.fp.info.mime, content, hiddenImage.width, hiddenImage.height
document.body.removeChild hiddenImage
- hiddenImage.src = reader.result
-
- reader.readAsDataURL blob
- , "binary"
+ hiddenImage.src = r.reader.result
+ .catch () ->
+ me.error __("Couldnt load image {0}", p)
, __("Select image file"), { mimes: ["image/.*"] }
styles: (e) ->
@@ -306,14 +422,15 @@ class OpenPage extends this.OS.GUI.BaseApplication
zoom: (e) ->
#console.log "zooming", e
+ return unless @zoomHelper
@zoomHelper.setZoomLevel e/100.0
format: (e) ->
@openDialog new FormatDialog(), (d) ->
- console.log d
+ return
, __("Add/Modify paragraph format"), @resource
- closeDocument: () ->
+ closeDocument: (f) ->
# finish editing
return unless @editorSession and @session
me = @
@@ -335,6 +452,7 @@ class OpenPage extends this.OS.GUI.BaseApplication
me.directFormattingCtl.unsubscribe gui.DirectFormattingController.paragraphStylingChanged, me.textStylingChanged
me.editorSession.unsubscribe OpenPage.EditorSession.signalParagraphChanged, me.paragrahStyleChanged
me.zoomHelper.unsubscribe gui.ZoomHelper.signalZoomChanged, me.updateSlider
+ me.editorSession.unsubscribe OpenPage.EditorSession.signalCommonStyleCreated, me.styleAdded
# destry editorSession
me.editorSession.destroy (e) ->
return me.error __("Cannot destroy editor session {0}", e) if e
@@ -345,7 +463,9 @@ class OpenPage extends this.OS.GUI.BaseApplication
core.Async.destroyAll [me.canvas.destroy], (e) ->
return me.error __("Cannot destroy canvas {0}", e) if e
me.notify "Document closed"
+ f() if f
me.session = undefined
+ me.annotationController = undefined
me.directFormattingCtl = undefined
me.textController = undefined
me.imageController = undefined
@@ -355,10 +475,18 @@ class OpenPage extends this.OS.GUI.BaseApplication
me.textStylingChanged = undefined
me.paragrahStyleChanged = undefined
me.updateSlider = undefined
+ me.styleAdded = undefined
+ me.basictool.fonts.set "selected", -1
+ me.basictool.styles.set "selected", -1
+
#
cleanup: (e) ->
- @closeDocument()
+ me = @
+ if @editorSession
+ e.preventDefault()
+ me.closeDocument ()->
+ me.quit()
this.OS.register "OpenPage", OpenPage
\ No newline at end of file
diff --git a/OpenPage/css/dialog.css b/OpenPage/css/dialog.css
index 2ebc292..b6fb0f3 100644
--- a/OpenPage/css/dialog.css
+++ b/OpenPage/css/dialog.css
@@ -13,7 +13,8 @@ afx-app-window[data-id="FormatDialog"] afx-label.header span
}
afx-app-window[data-id="FormatDialog"] afx-hbox[data-id="aligmentbox"] afx-label span,
afx-app-window[data-id="FormatDialog"] afx-hbox[data-id="spacingbox"] afx-label span,
-afx-app-window[data-id="FormatDialog"] afx-hbox[data-id="stylebox"] afx-label span
+afx-app-window[data-id="FormatDialog"] afx-hbox[data-id="stylebox"] afx-label span,
+afx-app-window[data-id="FormatDialog"] afx-hbox[data-id="font-box"] > div > afx-label span
{
display: block;
padding-top: 7px;
diff --git a/OpenPage/css/main.css b/OpenPage/css/main.css
index 0946369..ef56663 100644
--- a/OpenPage/css/main.css
+++ b/OpenPage/css/main.css
@@ -1,3 +1,4 @@
+@namespace office url(urn:oasis:names:tc:opendocument:xmlns:office:1.0);
afx-app-window[data-id="OpenPage"] div[data-id="container"]
{
overflow: auto;
@@ -7,13 +8,41 @@ afx-app-window[data-id="OpenPage"] div[data-id="container"]
padding-bottom: 10px;
text-align: center;
background-color: #f2f1f0;
+ /*position: relative;*/
}
+/*
+@media screen, print, handheld, projection
+{
+ office|body{
+ display: inline !important;
+ }
+}*/
+
+
+/*
+Fix annotation problem not showing
+*/
+/*
+afx-app-window[data-id="OpenPage"] document, afx-app-window[data-id="OpenPage"] office:body{
+ display: inline !important;
+}
+afx-app-window[data-id="OpenPage"] .annotationsPane{
+ right: 0 !important;
+ top: 0 !important;
+ position: absolute !important;
+}*/
afx-app-window[data-id="OpenPage"] div[data-id="odfcanvas"]
{
cursor: text;
margin:auto;
box-shadow: 1px 1px 3px 3px #9f9F9F;
+ /*added*/
+ transform-origin: top center;
+ -webkit-transform-origin: top center;
+ -moz-transform-origin: top center;
+ -o-transform-origin: top center;
+ overflow: hidden;
}
afx-app-window[data-id="OpenPage"] afx-hbox[data-id="toolbox"]
@@ -42,4 +71,5 @@ afx-app-window[data-id="OpenPage"] afx-hbox[data-id="toolbox"] afx-button button
background-color: transparent;
border-radius:5px;
color:#759DC0;
-}
\ No newline at end of file
+}
+
diff --git a/OpenPage/javascripts/EditorSession.js b/OpenPage/javascripts/EditorSession.js
index 874b4f4..c1b544e 100644
--- a/OpenPage/javascripts/EditorSession.js
+++ b/OpenPage/javascripts/EditorSession.js
@@ -24,9 +24,10 @@
/*global runtime, define, document, core, odf, gui, ops*/
-define("webodf/editor/EditorSession", [
+/*define("webodf/editor/EditorSession", [
"dojo/text!resources/fonts/fonts.css"
-], function (fontsCSS) { // fontsCSS is retrieved as a string, using dojo's text retrieval AMD plugin
+],*/
+this.OS.APP.OpenPage.EditorSession = (function (fontsCSS) { // fontsCSS is retrieved as a string, using dojo's text retrieval AMD plugin
"use strict";
runtime.loadClass("core.Async");
@@ -656,5 +657,5 @@ define("webodf/editor/EditorSession", [
/**@const*/EditorSession.signalUndoStackChanged = "signalUndoStackChanged";
return EditorSession;
-});
-
+})("");
+
diff --git a/OpenPage/package.json b/OpenPage/package.json
index 17edcfe..cd58c36 100644
--- a/OpenPage/package.json
+++ b/OpenPage/package.json
@@ -1,13 +1,13 @@
{
"app":"OpenPage",
"name":"OpenPage",
- "description":"",
+ "description":"Open Document Format (ODF) text editor using WebODF",
"info":{
- "author": "",
- "email": ""
+ "author": "Xuan Sang LE",
+ "email": "xsang.le@gmail.com"
},
"version":"0.0.1-a",
"category":"Other",
- "iconclass":"fa fa-adn",
- "mimes":["none"]
+ "icon":"icon.png",
+ "mimes":["application/vnd.oasis.opendocument.text"]
}
\ No newline at end of file
diff --git a/OpenPage/project.apj b/OpenPage/project.apj
index ce6e0a0..8c0adfa 100644
--- a/OpenPage/project.apj
+++ b/OpenPage/project.apj
@@ -1 +1,2 @@
-{"name":"OpenPage","root":"home://workspace/OpenPage","css":["css/main.css","css/dialog.css"],"javascripts":["javascripts/webodf.js","javascripts/EditorSession.js"],"coffees":["coffees/main.coffee","coffees/dialogs.coffee"],"copies":["assets/scheme.html","package.json","README.md"]}
\ No newline at end of file
+{"name":"OpenPage","root":"home://Documents/workspace/antosdk-apps/OpenPage","css":["css/main.css","css/dialog.css"],"javascripts":["javascripts/webodf.js","javascripts/EditorSession.js"],"coffees":["coffees/main.coffee","coffees/dialogs.coffee"],"copies":["assets/scheme.html","package.json","assets/OpenPage.md","assets/icon.png"]}
+>>>>>>> 56d24a53d411c877d28ed671d0f49db49a9c41b9