Commit 9b7cdfb7 by Jeong Gilmo

#33721 手書きパレット機能の追加

- 手書きパレット編集画面と連携する機能追加
- 手書きパレットの編集画面についてファイルを追加
parent 137e7770
...@@ -123,4 +123,9 @@ public class ABookKeys { ...@@ -123,4 +123,9 @@ public class ABookKeys {
// taskReport.Jsonに一時保存フラグを保持するためのキー // taskReport.Jsonに一時保存フラグを保持するためのキー
public static final String LOCAL_SAVE_FLG = "localSaveFlg"; public static final String LOCAL_SAVE_FLG = "localSaveFlg";
// 編集画面を
public static final String CMD_EDIT_ATTACHED = "editAttached"; //再編集のためのcmdパラメタ
public static final String EDITABLE = "editable"; //commonAttachedDataUrl()で編集可否を判別するパラメタをWebからもらう。
public static final String FILE_PATH = "filePath"; //再編集する場合、クリックしたイマージのパスのパラメタ
} }
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>AIS Edit Tool</title>
<meta name="description" content="">
<meta name="viewport" content="width=device-width">
<meta name="viewport" content="height=device-height">
<link rel="stylesheet" href="./css/drawingboard.css">
<style>
.board {
margin: 0 auto;
}
</style>
<style>
#ais-edit-tool {
height: 90vh; /* For 90% screen height */
width: 90vw; /* For 90% screen width */
}
</style>
<style>
.drawing-board-canvas-wrapper {
border: 1px solid gray;
}
#overlay{
position:initial;
display:block;
width:100%;
height:100%;
z-index:30;
}
</style>
</head>
<body>
<noscript>JavaScript is required :(</noscript>
<div class="container">
<div>
<div class="board" id="ais-edit-tool">
</div>
</div>
</div>
<script src="./js/jquery.min.js"></script>
<script src="./js/simple-undo.js"></script>
<script src="./js/utils.js"></script>
<script src="./js/drawingboard.js"></script>
<script src="./js/controls/control.js"></script>
<script src="./js/controls/color.js"></script>
<script src="./js/controls/drawingmode.js"></script>
<script src="./js/controls/navigation.js"></script>
<script src="./js/controls/size.js"></script>
<script src="./js/controls/download.js"></script>
<script>
var aisEditTool = new DrawingBoard.Board('ais-edit-tool', {
controls: [
'Color',
{ Size: { type: 'dropdown' } },
{ DrawingMode: { filler: false } },
'Download'
],
color: '#ff0000',
background: false,
size: 3,
webStorage: 'false',
controlsPosition: 'center',
enlargeYourContainer: true
});
//Canvasのサイズを写真の横縦割合に合わせて変更
function resizeCanvasToRatio(ratio){
aisEditTool.resizeCanvasToRatio(ratio);
}
//CanvasのBackgroundをイメージファイルのurlに設定
function setBackground(url){
aisEditTool.setBackground(url);
}
//Canvasの修正可否を返す。
function isCanvasEdited(){
return aisEditTool.isCanvasEdited();
}
//パスを取得してoverlayイメージをCanvasの中に入れる。(iOS)
function createOverlayImageElement(imageSrc) {
aisEditTool.createOverlayImageElement(imageSrc);
}
//接続しているクライアントがPCかmobileかをはんだんする
function checkPC() {
var filter = "win16|win32|win64|mac|macintel";
if ( navigator.platform ) {
if ( filter.indexOf( navigator.platform.toLowerCase() ) < 0 ) {
//mobile
return false;
} else {
//pc
return true;
}
}
}
//このペースのロード完了後でイメージをロードする
document.addEventListener("DOMContentLoaded", function(event) {
console.log('DOMContentLoaded');
if(checkPC()){
parent.loadDlgImage(); //call parent, parent call setBackground
}
});
</script>
</body>
</html>
DrawingBoard.Control.Color = DrawingBoard.Control.extend({
name: 'colors',
initialize: function() {
this.initTemplate();
var that = this;
this.$el.on('click', '.drawing-board-control-colors-picker', function(e) {
var color = $(this).attr('data-color');
that.board.setColor(color);
that.$el.find('.drawing-board-control-colors-current')
.css('background-color', color)
.attr('data-color', color);
that.board.ev.trigger('color:changed', color);
that.$el.find('.drawing-board-control-colors-rainbows').addClass('drawing-board-utils-hidden');
e.preventDefault();
});
this.$el.on('click', '.drawing-board-control-colors-current', function(e) {
that.$el.find('.drawing-board-control-colors-rainbows').toggleClass('drawing-board-utils-hidden');
e.preventDefault();
});
$('body').on('click', function(e) {
var $target = $(e.target);
var $relatedButton = $target.hasClass('drawing-board-control-colors-current') ? $target : $target.closest('.drawing-board-control-colors-current');
var $myButton = that.$el.find('.drawing-board-control-colors-current');
var $popup = that.$el.find('.drawing-board-control-colors-rainbows');
if ( (!$relatedButton.length || $relatedButton.get(0) !== $myButton.get(0)) && !$popup.hasClass('drawing-board-utils-hidden') )
$popup.addClass('drawing-board-utils-hidden');
});
},
initTemplate: function() {
var tpl = '<div class="drawing-board-control-inner">' +
'<div class="drawing-board-control-colors-current" style="background-color: {{color}}" data-color="{{color}}"></div>' +
'<div class="drawing-board-control-colors-rainbows">{{rainbows}}</div>' +
'</div>';
var oneColorTpl = '<div class="drawing-board-control-colors-picker" data-color="{{color}}" style="background-color: {{color}}"></div>';
var rainbows = '';
// $.each([0.75, 0.5, 0.25], $.proxy(function(key, val) {
$.each([0.5], $.proxy(function(key, val) {
var i = 0;
var additionalColor = null;
rainbows += '<div class="drawing-board-control-colors-rainbow">';
// if (val == 0.25) additionalColor = this._rgba(0, 0, 0, 1);
// if (val == 0.5) additionalColor = this._rgba(150, 150, 150, 1);
// if (val == 0.75) additionalColor = this._rgba(255, 255, 255, 1);
// rainbows += DrawingBoard.Utils.tpl(oneColorTpl, {color: additionalColor.toString() });
// while (i <= 330) {
// rainbows += DrawingBoard.Utils.tpl(oneColorTpl, {color: this._hsl2Rgba(this._hsl(i-60, 1, val)).toString() });
// i+=30;
// }
// white, black, red, blue, yellow
var white = this._rgba(255,255,255,1);
var black = this._rgba(0,0,0,1);
var red = this._rgba(255,0,0,1);
var blue = this._rgba(0,0,255,1);
var yellow = this._rgba(255,255,0,1);
rainbows += DrawingBoard.Utils.tpl(oneColorTpl, {color: white.toString()});
rainbows += DrawingBoard.Utils.tpl(oneColorTpl, {color: black.toString()});
rainbows += DrawingBoard.Utils.tpl(oneColorTpl, {color: red.toString()});
rainbows += DrawingBoard.Utils.tpl(oneColorTpl, {color: blue.toString()});
rainbows += DrawingBoard.Utils.tpl(oneColorTpl, {color: yellow.toString()});
rainbows += '</div>';
}, this));
this.$el.append( $( DrawingBoard.Utils.tpl(tpl, {color: this.board.color, rainbows: rainbows }) ) );
this.$el.find('.drawing-board-control-colors-rainbows').addClass('drawing-board-utils-hidden');
},
onBoardReset: function(opts) {
this.board.setColor(this.$el.find('.drawing-board-control-colors-current').attr('data-color'));
},
_rgba: function(r, g, b, a) {
return { r: r, g: g, b: b, a: a, toString: function() { return "rgba(" + r +", " + g + ", " + b + ", " + a + ")"; } };
},
_hsl: function(h, s, l) {
return { h: h, s: s, l: l, toString: function() { return "hsl(" + h +", " + s*100 + "%, " + l*100 + "%)"; } };
},
_hex2Rgba: function(hex) {
var num = parseInt(hex.substring(1), 16);
return this._rgba(num >> 16, num >> 8 & 255, num & 255, 1);
},
//conversion function (modified a bit) taken from http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript
_hsl2Rgba: function(hsl) {
var h = hsl.h/360, s = hsl.s, l = hsl.l, r, g, b;
function hue2rgb(p, q, t) {
if(t < 0) t += 1;
if(t > 1) t -= 1;
if(t < 1/6) return p + (q - p) * 6 * t;
if(t < 1/2) return q;
if(t < 2/3) return p + (q - p) * (2/3 - t) * 6;
return p;
}
if (s === 0) {
r = g = b = l; // achromatic
} else {
var q = l < 0.5 ? l * (1 + s) : l + s - l * s;
var p = 2 * l - q;
r = Math.floor( (hue2rgb(p, q, h + 1/3)) * 255);
g = Math.floor( (hue2rgb(p, q, h)) * 255);
b = Math.floor( (hue2rgb(p, q, h - 1/3)) * 255);
}
return this._rgba(r, g, b, 1);
}
});
\ No newline at end of file
DrawingBoard.Control = function(drawingBoard, opts) {
this.board = drawingBoard;
this.opts = $.extend({}, this.defaults, opts);
this.$el = $(document.createElement('div')).addClass('drawing-board-control');
if (this.name)
this.$el.addClass('drawing-board-control-' + this.name);
this.board.ev.bind('board:reset', $.proxy(this.onBoardReset, this));
this.initialize.apply(this, arguments);
return this;
};
DrawingBoard.Control.prototype = {
name: '',
defaults: {},
initialize: function() {
},
addToBoard: function() {
this.board.addControl(this);
},
onBoardReset: function(opts) {
}
};
//extend directly taken from backbone.js
DrawingBoard.Control.extend = function(protoProps, staticProps) {
var parent = this;
var child;
if (protoProps && protoProps.hasOwnProperty('constructor')) {
child = protoProps.constructor;
} else {
child = function(){ return parent.apply(this, arguments); };
}
$.extend(child, parent, staticProps);
var Surrogate = function(){ this.constructor = child; };
Surrogate.prototype = parent.prototype;
child.prototype = new Surrogate();
if (protoProps) $.extend(child.prototype, protoProps);
child.__super__ = parent.prototype;
return child;
};
\ No newline at end of file
DrawingBoard.Control.Download = DrawingBoard.Control.extend({
name: 'download',
initialize: function() {
this.$el.append('<button class="drawing-board-control-download-button"></button>');
this.$el.on('click', '.drawing-board-control-download-button', $.proxy(function(e) {
this.board.downloadImg();
e.preventDefault();
}, this));
}
});
\ No newline at end of file
DrawingBoard.Control.DrawingMode = DrawingBoard.Control.extend({
name: 'drawingmode',
defaults: {
pencil: true,
eraser: true,
filler: true
},
initialize: function() {
this.prevMode = this.board.getMode();
$.each(["pencil", "eraser", "filler"], $.proxy(function(k, value) {
if (this.opts[value]) {
this.$el.append('<button class="drawing-board-control-drawingmode-' + value + '-button" data-mode="' + value + '"></button>');
}
}, this));
this.$el.on('click', 'button[data-mode]', $.proxy(function(e) {
var value = $(e.currentTarget).attr('data-mode');
var mode = this.board.getMode();
if (mode !== value) this.prevMode = mode;
var newMode = mode === value ? this.prevMode : value;
this.board.setMode( newMode );
e.preventDefault();
}, this));
this.board.ev.bind('board:mode', $.proxy(function(mode) {
this.toggleButtons(mode);
}, this));
this.toggleButtons( this.board.getMode() );
},
toggleButtons: function(mode) {
this.$el.find('button[data-mode]').each(function(k, item) {
var $item = $(item);
$item.toggleClass('active', mode === $item.attr('data-mode'));
});
}
});
DrawingBoard.Control.Navigation = DrawingBoard.Control.extend({
name: 'navigation',
defaults: {
back: true,
forward: true,
reset: true
},
initialize: function() {
var el = '';
if (this.opts.back) el += '<button class="drawing-board-control-navigation-back">&larr;</button>';
if (this.opts.forward) el += '<button class="drawing-board-control-navigation-forward">&rarr;</button>';
if (this.opts.reset) el += '<button class="drawing-board-control-navigation-reset">&times;</button>';
this.$el.append(el);
if (this.opts.back) {
var $back = this.$el.find('.drawing-board-control-navigation-back');
this.board.ev.bind('historyNavigation', $.proxy(this.updateBack, this, $back));
this.$el.on('click', '.drawing-board-control-navigation-back', $.proxy(function(e) {
this.board.goBackInHistory();
e.preventDefault();
}, this));
this.updateBack($back);
}
if (this.opts.forward) {
var $forward = this.$el.find('.drawing-board-control-navigation-forward');
this.board.ev.bind('historyNavigation', $.proxy(this.updateForward, this, $forward));
this.$el.on('click', '.drawing-board-control-navigation-forward', $.proxy(function(e) {
this.board.goForthInHistory();
e.preventDefault();
}, this));
this.updateForward($forward);
}
if (this.opts.reset) {
this.$el.on('click', '.drawing-board-control-navigation-reset', $.proxy(function(e) {
this.board.reset({ background: true });
e.preventDefault();
}, this));
}
},
updateBack: function($back) {
if (this.board.history.canUndo()) {
$back.removeAttr('disabled');
} else {
$back.attr('disabled', 'disabled');
}
},
updateForward: function($forward) {
if (this.board.history.canRedo()) {
$forward.removeAttr('disabled');
} else {
$forward.attr('disabled', 'disabled');
}
}
});
\ No newline at end of file
DrawingBoard.Control.Size = DrawingBoard.Control.extend({
name: 'size',
defaults: {
type: "auto",
// dropdownValues: [1, 3, 6, 10, 20, 30, 40, 50],
dropdownValues: [3, 6, 10],
min: 1,
max: 50
},
types: ['dropdown', 'range'],
initialize: function() {
if (this.opts.type == "auto")
this.opts.type = this._iHasRangeInput() ? 'range' : 'dropdown';
var tpl = $.inArray(this.opts.type, this.types) > -1 ? this['_' + this.opts.type + 'Template']() : false;
if (!tpl) return false;
this.val = this.board.opts.size;
this.$el.append( $( tpl ) );
this.$el.attr('data-drawing-board-type', this.opts.type);
this.updateView();
var that = this;
if (this.opts.type == "range") {
this.$el.on('change', '.drawing-board-control-size-range-input', function(e) {
that.val = $(this).val();
that.updateView();
that.board.ev.trigger('size:changed', that.val);
e.preventDefault();
});
}
if (this.opts.type == "dropdown") {
this.$el.on('click', '.drawing-board-control-size-dropdown-current', $.proxy(function(e) {
this.$el.find('.drawing-board-control-size-dropdown').toggleClass('drawing-board-utils-hidden');
}, this));
this.$el.on('click', '[data-size]', function(e) {
that.val = parseInt($(this).attr('data-size'), 0);
that.updateView();
that.board.ev.trigger('size:changed', that.val);
e.preventDefault();
});
}
},
_rangeTemplate: function() {
var tpl = '<div class="drawing-board-control-inner" title="{{size}}">' +
'<input type="range" min="{{min}}" max="{{max}}" value="{{size}}" step="1" class="drawing-board-control-size-range-input">' +
'<span class="drawing-board-control-size-range-current"></span>' +
'</div>';
return DrawingBoard.Utils.tpl(tpl, {
min: this.opts.min,
max: this.opts.max,
size: this.board.opts.size
});
},
_dropdownTemplate: function() {
var tpl = '<div class="drawing-board-control-inner" title="{{size}}">' +
'<div class="drawing-board-control-size-dropdown-current"><span></span></div>' +
'<ul class="drawing-board-control-size-dropdown">';
$.each(this.opts.dropdownValues, function(i, size) {
tpl += DrawingBoard.Utils.tpl(
'<li data-size="{{size}}"><span style="width: {{size}}px; height: {{size}}px; border-radius: {{size}}px;"></span></li>',
{ size: size }
);
});
tpl += '</ul></div>';
return tpl;
},
onBoardReset: function(opts) {
this.updateView();
},
updateView: function() {
var val = this.val;
this.board.ctx.lineWidth = val;
this.$el.find('.drawing-board-control-size-range-current, .drawing-board-control-size-dropdown-current span').css({
width: val + 'px',
height: val + 'px',
borderRadius: val + 'px',
marginLeft: -1*val/2 + 'px',
marginTop: -1*val/2 + 'px'
});
this.$el.find('.drawing-board-control-inner').attr('title', val);
if (this.opts.type == 'dropdown') {
var closest = null;
$.each(this.opts.dropdownValues, function(i, size) {
if (closest === null || Math.abs(size - val) < Math.abs(closest - val))
closest = size;
});
this.$el.find('.drawing-board-control-size-dropdown').addClass('drawing-board-utils-hidden');
}
},
_iHasRangeInput: function() {
var inputElem = document.createElement('input'),
smile = ':)',
docElement = document.documentElement,
inputElemType = 'range',
available;
inputElem.setAttribute('type', inputElemType);
available = inputElem.type !== 'text';
inputElem.value = smile;
inputElem.style.cssText = 'position:absolute;visibility:hidden;';
if ( /^range$/.test(inputElemType) && inputElem.style.WebkitAppearance !== undefined ) {
docElement.appendChild(inputElem);
defaultView = document.defaultView;
available = defaultView.getComputedStyle &&
defaultView.getComputedStyle(inputElem, null).WebkitAppearance !== 'textfield' &&
(inputElem.offsetHeight !== 0);
docElement.removeChild(inputElem);
}
return !!available;
}
});
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
(function() {
'use strict';
/**
* SimpleUndo is a very basic javascript undo/redo stack for managing histories of basically anything.
*
* options are: {
* * `provider` : required. a function to call on `save`, which should provide the current state of the historized object through the given "done" callback
* * `maxLength` : the maximum number of items in history
* * `onUpdate` : a function to call to notify of changes in history. Will be called on `save`, `undo`, `redo` and `clear`
* }
*
*/
var SimpleUndo = function(options) {
var settings = options ? options : {};
var defaultOptions = {
provider: function() {
throw new Error("No provider!");
},
maxLength: 30,
onUpdate: function() {}
};
this.provider = (typeof settings.provider != 'undefined') ? settings.provider : defaultOptions.provider;
this.maxLength = (typeof settings.maxLength != 'undefined') ? settings.maxLength : defaultOptions.maxLength;
this.onUpdate = (typeof settings.onUpdate != 'undefined') ? settings.onUpdate : defaultOptions.onUpdate;
this.initialItem = null;
this.clear();
};
function truncate (stack, limit) {
while (stack.length > limit) {
stack.shift();
}
}
SimpleUndo.prototype.initialize = function(initialItem) {
this.stack[0] = initialItem;
this.initialItem = initialItem;
};
SimpleUndo.prototype.clear = function() {
this.stack = [this.initialItem];
this.position = 0;
this.onUpdate();
};
SimpleUndo.prototype.save = function() {
this.provider(function(current) {
if (this.position >= this.maxLength) truncate(this.stack, this.maxLength);
this.position = Math.min(this.position,this.stack.length - 1);
this.stack = this.stack.slice(0, this.position + 1);
this.stack.push(current);
this.position++;
this.onUpdate();
}.bind(this));
};
SimpleUndo.prototype.undo = function(callback) {
if (this.canUndo()) {
var item = this.stack[--this.position];
this.onUpdate();
if (callback) {
callback(item);
}
}
};
SimpleUndo.prototype.redo = function(callback) {
if (this.canRedo()) {
var item = this.stack[++this.position];
this.onUpdate();
if (callback) {
callback(item);
}
}
};
SimpleUndo.prototype.canUndo = function() {
return this.position > 0;
};
SimpleUndo.prototype.canRedo = function() {
return this.position < this.count();
};
SimpleUndo.prototype.count = function() {
return this.stack.length - 1; // -1 because of initial item
};
//exports
// node module
if (typeof module != 'undefined') {
module.exports = SimpleUndo;
}
// browser global
if (typeof window != 'undefined') {
window.SimpleUndo = SimpleUndo;
}
})();
\ No newline at end of file
window.DrawingBoard = typeof DrawingBoard !== "undefined" ? DrawingBoard : {};
DrawingBoard.Utils = {};
/*!
* Tim (lite)
* github.com/premasagar/tim
*//*
A tiny, secure JavaScript micro-templating script.
*/
DrawingBoard.Utils.tpl = (function(){
"use strict";
var start = "{{",
end = "}}",
path = "[a-z0-9_][\\.a-z0-9_]*", // e.g. config.person.name
pattern = new RegExp(start + "\\s*("+ path +")\\s*" + end, "gi"),
undef;
return function(template, data){
// Merge data into the template string
return template.replace(pattern, function(tag, token){
var path = token.split("."),
len = path.length,
lookup = data,
i = 0;
for (; i < len; i++){
lookup = lookup[path[i]];
// Property not found
if (lookup === undef){
throw "tim: '" + path[i] + "' not found in " + tag;
}
// Return the required value
if (i === len - 1){
return lookup;
}
}
});
};
}());
/**
* https://github.com/jeromeetienne/microevent.js
* MicroEvent - to make any js object an event emitter (server or browser)
*
* - pure javascript - server compatible, browser compatible
* - dont rely on the browser doms
* - super simple - you get it immediatly, no mistery, no magic involved
*
* - create a MicroEventDebug with goodies to debug
* - make it safer to use
*/
DrawingBoard.Utils.MicroEvent = function(){};
DrawingBoard.Utils.MicroEvent.prototype = {
bind : function(event, fct){
this._events = this._events || {};
this._events[event] = this._events[event] || [];
this._events[event].push(fct);
},
unbind : function(event, fct){
this._events = this._events || {};
if( event in this._events === false ) return;
this._events[event].splice(this._events[event].indexOf(fct), 1);
},
trigger : function(event /* , args... */){
this._events = this._events || {};
if( event in this._events === false ) return;
for(var i = 0; i < this._events[event].length; i++){
this._events[event][i].apply(this, Array.prototype.slice.call(arguments, 1));
}
}
};
//I know.
DrawingBoard.Utils._boxBorderSize = function($el, withPadding, withMargin, direction) {
withPadding = !!withPadding || true;
withMargin = !!withMargin || false;
var width = 0,
props;
if (direction == "width") {
props = ['border-left-width', 'border-right-width'];
if (withPadding) props.push('padding-left', 'padding-right');
if (withMargin) props.push('margin-left', 'margin-right');
} else {
props = ['border-top-width', 'border-bottom-width'];
if (withPadding) props.push('padding-top', 'padding-bottom');
if (withMargin) props.push('margin-top', 'margin-bottom');
}
for (var i = props.length - 1; i >= 0; i--)
width += parseInt($el.css(props[i]).replace('px', ''), 10);
return width;
};
DrawingBoard.Utils.boxBorderWidth = function($el, withPadding, withMargin) {
return DrawingBoard.Utils._boxBorderSize($el, withPadding, withMargin, 'width');
};
DrawingBoard.Utils.boxBorderHeight = function($el, withPadding, withMargin) {
return DrawingBoard.Utils._boxBorderSize($el, withPadding, withMargin, 'height');
};
DrawingBoard.Utils.isColor = function(string) {
if (!string || !string.length) return false;
return (/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i).test(string) || $.inArray(string.substring(0, 3), ['rgb', 'hsl']) !== -1;
};
/**
* Packs an RGB color into a single integer.
*/
DrawingBoard.Utils.RGBToInt = function(r, g, b) {
var c = 0;
c |= (r & 255) << 16;
c |= (g & 255) << 8;
c |= (b & 255);
return c;
};
/**
* Returns informations on the pixel located at (x,y).
*/
DrawingBoard.Utils.pixelAt = function(image, x, y) {
var i = (y * image.width + x) * 4;
var c = DrawingBoard.Utils.RGBToInt(
image.data[i],
image.data[i + 1],
image.data[i + 2]
);
return [
i, // INDEX
x, // X
y, // Y
c // COLOR
];
};
/**
* Compares two colors with the given tolerance (between 0 and 255).
*/
DrawingBoard.Utils.compareColors = function(a, b, tolerance) {
if (tolerance === 0) {
return (a === b);
}
var ra = (a >> 16) & 255, rb = (b >> 16) & 255,
ga = (a >> 8) & 255, gb = (b >> 8) & 255,
ba = a & 255, bb = b & 255;
return (Math.abs(ra - rb) <= tolerance)
&& (Math.abs(ga - gb) <= tolerance)
&& (Math.abs(ba - bb) <= tolerance);
};
(function() {
var lastTime = 0;
var vendors = ['ms', 'moz', 'webkit', 'o'];
for(var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
window.requestAnimationFrame = window[vendors[x]+'RequestAnimationFrame'];
window.cancelAnimationFrame = window[vendors[x]+'CancelAnimationFrame'] || window[vendors[x]+'CancelRequestAnimationFrame'];
}
}());
...@@ -1396,4 +1396,9 @@ ...@@ -1396,4 +1396,9 @@
<string name="Report_5">報告(5)</string> <string name="Report_5">報告(5)</string>
<string name="Routine_5">定期点検(5)</string> <string name="Routine_5">定期点検(5)</string>
<string name="ReportReply_5">報告(回答)(5)</string> <string name="ReportReply_5">報告(回答)(5)</string>
<!--編集画面-->
<string name="msg_confirm_close_edit_page">編集を終了しますか?\n(保存されていない変更は破棄されます。)</string>
<string name="msg_error_edit_page_save">ファイルの保存中に予想以外のエラーが発生しました。\n編集画面を終了します。</string>
<string name="msg_error_edit_page_open">編集画面の表示に失敗しました。</string>
</resources> </resources>
...@@ -1404,4 +1404,9 @@ ...@@ -1404,4 +1404,9 @@
<string name="Report_5">보고(5)</string> <string name="Report_5">보고(5)</string>
<string name="Routine_5">정기점검(5)</string> <string name="Routine_5">정기점검(5)</string>
<string name="ReportReply_5">보고(응답)(5)</string> <string name="ReportReply_5">보고(응답)(5)</string>
<!--編集画面-->
<string name="msg_confirm_close_edit_page">편집을 종료하시겠습니까?\n(저장되지 않은 변경 사항은 삭제됩니다.)</string>
<string name="msg_error_edit_page_save">파일 저장 중에 예기치 않은 오류가 발생했습니다.\n편집창을 종료합니다.</string>
<string name="msg_error_edit_page_open">편집창을 여는데 실패했습니다.</string>
</resources> </resources>
\ No newline at end of file
...@@ -1402,4 +1402,10 @@ ...@@ -1402,4 +1402,10 @@
<string name="Report_5">Report(5)</string> <string name="Report_5">Report(5)</string>
<string name="Routine_5">Routine(5)</string> <string name="Routine_5">Routine(5)</string>
<string name="ReportReply_5">ReportReply(5)</string> <string name="ReportReply_5">ReportReply(5)</string>
<!--編集画面-->
<string name="msg_confirm_close_edit_page">Are you sure you want to finish editing?\n(Unsaved changes will be discarded.)</string>
<string name="msg_error_edit_page_save">An unexpected error has occurred while saving the image.\nClosing the editing Page.</string>
<string name="msg_error_edit_page_open">Failed to open the edit tool.</string>
</resources> </resources>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/photoEditDialog"
style="@style/Theme_CustomProgressDialog"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/background"
android:orientation="vertical">
<WebView
android:id="@+id/edit_webview"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<ImageButton
android:id="@+id/edit_page_close_btn"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_gravity="top|right"
android:layout_marginRight="7dp"
android:layout_marginTop="7dp"
android:background="@color/operation_search_button_color"
android:clickable="true"
android:elevation="0dp"
android:src="@drawable/btn_close"
android:tint="@color/background" />
</FrameLayout>
...@@ -28,6 +28,7 @@ import org.json.adf.JSONObject; ...@@ -28,6 +28,7 @@ import org.json.adf.JSONObject;
import java.io.File; import java.io.File;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.Iterator; import java.util.Iterator;
...@@ -35,7 +36,6 @@ import java.util.List; ...@@ -35,7 +36,6 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import jp.agentec.abook.abv.bl.acms.client.json.content.ContentJSON;
import jp.agentec.abook.abv.bl.acms.type.OperationType; import jp.agentec.abook.abv.bl.acms.type.OperationType;
import jp.agentec.abook.abv.bl.common.ABVEnvironment; import jp.agentec.abook.abv.bl.common.ABVEnvironment;
import jp.agentec.abook.abv.bl.common.Callback; import jp.agentec.abook.abv.bl.common.Callback;
...@@ -74,9 +74,9 @@ import jp.agentec.abook.abv.ui.home.helper.ABookCheckWebViewHelper; ...@@ -74,9 +74,9 @@ import jp.agentec.abook.abv.ui.home.helper.ABookCheckWebViewHelper;
import jp.agentec.abook.abv.ui.home.helper.ABookPermissionHelper; import jp.agentec.abook.abv.ui.home.helper.ABookPermissionHelper;
import jp.agentec.abook.abv.ui.home.helper.ActivityHandlingHelper; import jp.agentec.abook.abv.ui.home.helper.ActivityHandlingHelper;
import jp.agentec.abook.abv.ui.viewer.activity.CheckOZDViewActivity; import jp.agentec.abook.abv.ui.viewer.activity.CheckOZDViewActivity;
import jp.agentec.abook.abv.ui.viewer.activity.HTMLWebViewActivity;
import jp.agentec.abook.abv.ui.viewer.activity.HTMLXWalkWebViewActivity; import jp.agentec.abook.abv.ui.viewer.activity.HTMLXWalkWebViewActivity;
import jp.agentec.abook.abv.ui.viewer.activity.NoPdfViewActivity; import jp.agentec.abook.abv.ui.viewer.activity.NoPdfViewActivity;
import jp.agentec.abook.abv.ui.viewer.activity.PhotoEditActivity;
import jp.agentec.abook.abv.ui.viewer.foxitPdf.FoxitPdfCore; import jp.agentec.abook.abv.ui.viewer.foxitPdf.FoxitPdfCore;
import jp.agentec.adf.util.DateTimeUtil; import jp.agentec.adf.util.DateTimeUtil;
import jp.agentec.adf.util.FileUtil; import jp.agentec.adf.util.FileUtil;
...@@ -139,6 +139,10 @@ public abstract class ABVContentViewActivity extends ABVAuthenticatedActivity { ...@@ -139,6 +139,10 @@ public abstract class ABVContentViewActivity extends ABVAuthenticatedActivity {
public int mButtonStatus; // 保存ボタンチェック public int mButtonStatus; // 保存ボタンチェック
protected boolean mAddReport; // 作業追加区分 protected boolean mAddReport; // 作業追加区分
// 編集
protected String mEditFilePath; //再編集する時、Webからもらうクリックしたイメージファイルのパス
protected int mEnablePhotoEdit; //最初ファイルをアップロードする時、Webからもらう編集可能可否のパラメタ 0:編集する。 1:編集しない。
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
...@@ -859,6 +863,7 @@ public abstract class ABVContentViewActivity extends ABVAuthenticatedActivity { ...@@ -859,6 +863,7 @@ public abstract class ABVContentViewActivity extends ABVAuthenticatedActivity {
} }
public void commonShouldOverrideUrlLoading (Uri uri, OperationTaskDto operationTaskDto) { public void commonShouldOverrideUrlLoading (Uri uri, OperationTaskDto operationTaskDto) {
Logger.d(TAG, "Uri : %s", uri);
//parent method //parent method
Map<String, String> abookCheckParam = new HashMap<String, String>(); Map<String, String> abookCheckParam = new HashMap<String, String>();
for (String key : uri.getQueryParameterNames()) { for (String key : uri.getQueryParameterNames()) {
...@@ -1000,7 +1005,14 @@ public abstract class ABVContentViewActivity extends ABVAuthenticatedActivity { ...@@ -1000,7 +1005,14 @@ public abstract class ABVContentViewActivity extends ABVAuthenticatedActivity {
} }
} else if (mCmd.equals(ABookKeys.CMD_SAVE_ATTACHED)) { } else if (mCmd.equals(ABookKeys.CMD_SAVE_ATTACHED)) {
mAttachedFileName = abookCheckParam.get(ABookKeys.FILE_NAME); mAttachedFileName = abookCheckParam.get(ABookKeys.FILE_NAME);
//編集可否を判別
mEnablePhotoEdit = Integer.valueOf(abookCheckParam.get(ABookKeys.EDITABLE)); //添付したファイルの編集可否のパラメタ
getAttachedDataUrl(); getAttachedDataUrl();
} else if (mCmd.equals(ABookKeys.CMD_EDIT_ATTACHED)){
//編集パラメタ(
mAttachedFileName = abookCheckParam.get(ABookKeys.FILE_NAME); //再編集するファイルの名
mEditFilePath = abookCheckParam.get(ABookKeys.FILE_PATH); //再編集するファイルのパス
openEditPage();
} else if (mCmd.equals(ABookKeys.CMD_SHOW_REPORT_OZD)) { } else if (mCmd.equals(ABookKeys.CMD_SHOW_REPORT_OZD)) {
mReportFileName = abookCheckParam.get(ABookKeys.REPORT_FILE_NAME); mReportFileName = abookCheckParam.get(ABookKeys.REPORT_FILE_NAME);
// 作業報告画面改善 // 作業報告画面改善
...@@ -1084,6 +1096,10 @@ public abstract class ABVContentViewActivity extends ABVAuthenticatedActivity { ...@@ -1084,6 +1096,10 @@ public abstract class ABVContentViewActivity extends ABVAuthenticatedActivity {
FileUtil.delete(mLocalFile); FileUtil.delete(mLocalFile);
} }
mLocalFile = null; mLocalFile = null;
//編集可能可否をチェックする。
if (mEnablePhotoEdit == 0) { //編集の場合、編集画面を開ける。
commonOpenEditPage();
}
} catch (Exception e) { } catch (Exception e) {
isError = true; isError = true;
Logger.e(TAG, e); Logger.e(TAG, e);
...@@ -1151,6 +1167,10 @@ public abstract class ABVContentViewActivity extends ABVAuthenticatedActivity { ...@@ -1151,6 +1167,10 @@ public abstract class ABVContentViewActivity extends ABVAuthenticatedActivity {
}); });
} }
public void openEditPage(){
webViewLoadUrl("javascript:android.openEditPage()");
}
/** /**
* 位置情報取得 * 位置情報取得
* @param showPermissionDialogFlg * @param showPermissionDialogFlg
...@@ -1308,4 +1328,48 @@ public abstract class ABVContentViewActivity extends ABVAuthenticatedActivity { ...@@ -1308,4 +1328,48 @@ public abstract class ABVContentViewActivity extends ABVAuthenticatedActivity {
} }
} }
} }
/**
* 下位のWebviewからコールする編集画面
*/
public void commonOpenEditPage(){
//ダイアローグの上、新しいViewを作るため、Threadで実行する。Threadを使わない場合エラー発 生
runOnUiThread(new Runnable() {
@Override
public void run() {
//添付した写真はTempパスにある。
//保存されてある写真はoperationフォルダにある。
//保存されてある写真を修正する場合、ファイルをTempにコピーした後に編集する。
final String tempImagePath = ABVEnvironment.getInstance().getTempFilePath(getContentId(), mTaskKey, mAttachedFileName); //添付ファイルのTempパス
String savedImagePath = ABVEnvironment.getInstance().getOperationTaskReportLevelDirPath(mOperationId, mTaskKey,0) + "/" + mAttachedFileName; //保存された写真のパス
//保存されたイメージがあり、編集したいイメージのパスがTempがない場合、ファイルをTempにコピー
// パスがTempと一緒の場合、イメージが一回以上修正され、上書きしない。
if(FileUtil.exists(savedImagePath) && !mEditFilePath.equals(tempImagePath)){
try {
FileUtil.copy(savedImagePath,tempImagePath,true); //保存されたファイルをTempパスにコピー
} catch (IOException e) {
e.printStackTrace();
return;
}
}
if(FileUtil.exists(tempImagePath)){ //Tempパスにファイルがある場合、編集を実行
//編集画面をコール
PhotoEditActivity dialog = new PhotoEditActivity(ABVContentViewActivity.this, tempImagePath); //ロードして編集するイメージのパスを設定
dialog.show();
dialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialogInterface) {
//Web Cacheが更新されて編集画面のダイアローグ閉じた後、JavascriptにてImgタグを再生成してThumbnailを更新
webViewLoadUrl(String.format("javascript:document.getElementById('reportForm').contentWindow.changeThumbnailTagForAnd('%s','%s')", mAttachedFileName, tempImagePath));
afterABookCheckApi(mCmd, mTaskKey, 0, "", null);
}
});
}
else{
Logger.e(TAG, "image file is not found");
showSimpleAlertDialog(R.string.error,R.string.msg_error_edit_page_open);
}
}
});
}
} }
...@@ -486,6 +486,11 @@ public class HTMLWebViewActivity extends ParentWebViewActivity { ...@@ -486,6 +486,11 @@ public class HTMLWebViewActivity extends ParentWebViewActivity {
public void getAttachedDataUrl(String data) { public void getAttachedDataUrl(String data) {
commonAttachedDataUrl(data); commonAttachedDataUrl(data);
} }
@JavascriptInterface
public void openEditPage() {
commonOpenEditPage();
}
} }
@Override @Override
......
...@@ -525,6 +525,11 @@ public class HTMLXWalkWebViewActivity extends ParentWebViewActivity { ...@@ -525,6 +525,11 @@ public class HTMLXWalkWebViewActivity extends ParentWebViewActivity {
public void getAttachedDataUrl(String data) { public void getAttachedDataUrl(String data) {
commonAttachedDataUrl(data); commonAttachedDataUrl(data);
} }
@org.xwalk.core.JavascriptInterface
public void openEditPage() {
commonOpenEditPage();
}
} }
@Override @Override
......
...@@ -5,7 +5,6 @@ import android.content.Context; ...@@ -5,7 +5,6 @@ import android.content.Context;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.net.Uri; import android.net.Uri;
import android.view.View; import android.view.View;
import android.webkit.ValueCallback;
import android.widget.Button; import android.widget.Button;
import android.widget.ImageButton; import android.widget.ImageButton;
import android.widget.LinearLayout; import android.widget.LinearLayout;
...@@ -34,7 +33,6 @@ import jp.agentec.abook.abv.cl.util.ContentLogUtil; ...@@ -34,7 +33,6 @@ import jp.agentec.abook.abv.cl.util.ContentLogUtil;
import jp.agentec.abook.abv.cl.util.PreferenceUtil; import jp.agentec.abook.abv.cl.util.PreferenceUtil;
import jp.agentec.abook.abv.launcher.android.R; import jp.agentec.abook.abv.launcher.android.R;
import jp.agentec.abook.abv.ui.common.activity.ABVContentViewActivity; import jp.agentec.abook.abv.ui.common.activity.ABVContentViewActivity;
import jp.agentec.abook.abv.ui.common.activity.ABVUIActivity;
import jp.agentec.abook.abv.ui.common.appinfo.AppDefType; import jp.agentec.abook.abv.ui.common.appinfo.AppDefType;
import jp.agentec.abook.abv.ui.common.constant.ErrorCode; import jp.agentec.abook.abv.ui.common.constant.ErrorCode;
import jp.agentec.abook.abv.ui.common.constant.ErrorMessage; import jp.agentec.abook.abv.ui.common.constant.ErrorMessage;
...@@ -136,13 +134,17 @@ public class ParentWebViewActivity extends ABVContentViewActivity { ...@@ -136,13 +134,17 @@ public class ParentWebViewActivity extends ABVContentViewActivity {
boolean isError = false; boolean isError = false;
if (data != null) { if (data != null) {
try { try {
String imagePath = ABVEnvironment.getInstance().getTempFilePath(getContentId(), mTaskKey, mAttachedFileName); final String imagePath = ABVEnvironment.getInstance().getTempFilePath(getContentId(), mTaskKey, mAttachedFileName);
ABookCheckWebViewHelper.getInstance().decodeToImage(data, imagePath); ABookCheckWebViewHelper.getInstance().decodeToImage(data, imagePath);
//アプリ内のファイルのみ削除(Galleryファイルは削除しない) //アプリ内のファイルのみ削除(Galleryファイルは削除しない)
if (mLocalFile != null && mLocalFile.getPath().contains(getPackageName())) { if (mLocalFile != null && mLocalFile.getPath().contains(getPackageName())) {
FileUtil.delete(mLocalFile); FileUtil.delete(mLocalFile);
} }
mLocalFile = null; mLocalFile = null;
//編集可能可否をチェックする。
if (mEnablePhotoEdit == 0) { //編集の場合、編集画面を開ける。
commonOpenEditPage();
}
} catch (Exception e) { } catch (Exception e) {
isError = true; isError = true;
Logger.e(TAG, e); Logger.e(TAG, e);
......
...@@ -533,5 +533,10 @@ public class OperationTaskLayout extends RelativeLayout { ...@@ -533,5 +533,10 @@ public class OperationTaskLayout extends RelativeLayout {
public void getAttachedDataUrl(String data) { public void getAttachedDataUrl(String data) {
((ABVContentViewActivity) OperationTaskLayout.this.mContext).commonAttachedDataUrl(data); ((ABVContentViewActivity) OperationTaskLayout.this.mContext).commonAttachedDataUrl(data);
} }
@JavascriptInterface
public void openEditPage() {
((ABVContentViewActivity) OperationTaskLayout.this.mContext).commonOpenEditPage();
}
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment