1 /*参考データ
  2 
  3 
  4     */
  5 public class TouchTestActivity extends Activity {
  6 
  7 	@Override
  8 	public void onCreate(Bundle savedInstanceState) {
  9 		super.onCreate(savedInstanceState);
 10 
 11 	}
 12 
 13 	//簡単なタッチイベント処理
 14 	@Override
 15 	public boolean onTouchEvent(MotionEvent event) {
 16 		switch ( event.getAction() ) {
 17 
 18 		case MotionEvent.ACTION_DOWN:
 19 			//画面がタッチされたときの動作
 20 			break;
 21 
 22 		case MotionEvent.ACTION_MOVE:
 23 			//タッチしたまま移動したときの動作
 24 			break;
 25 
 26 		case MotionEvent.ACTION_UP:
 27 			//タッチが離されたときの動作
 28 			break;
 29 
 30 		case MotionEvent.ACTION_CANCEL:
 31 			//他の要因によってタッチがキャンセルされたときの動作
 32 			break;
 33 
 34 	    	}
 35 
 36 		return super.onTouchEvent(event); 
 37 	}
 38 
 39 }
 40 /*    xUI.Touch(e)
 41 引数:    e    タッチイベント
 42 戻値:        UI制御用
 43     タッチ動作
 44 タッチ処理を集中的にコントロールするファンクション
 45 
 46 関連プロパティ
 47     xUI.touchStart
 48     xUI.touchEnd
 49     xUI.touchEnd
 50     xUI.edmode
 51 0 : 通常編集
 52 1 : ブロック編集
 53 2 : セクション編集
 54 3 : セクション編集フローティング
 55 モード変更はxUI.mdChg関数を介してい行う
 56 
 57 モード別テーブルセル編集操作一覧
 58 
 59 
 60 
 61  */
 62 xUI.Touch=function(e){
 63     xUI.touchStart
 64     xUI.touchEnd
 65     
 66     
 67     console.log(e.target.id);
 68     if(e.target.id=='dialogEdit'){return false};
 69     if((this.edmode==3)&&(e.target.id=='sheet_body')&&(e.type=='mouseout')){
 70         xUI.sectionUpdate();
 71         this.mdChg(2);
 72         this.Touch.action=false;
 73         return false;
 74     };
 75 if(dbg) dbgPut(e.target.id+":"+e.type.toString());
 76 //document.getElementById("iNputbOx").focus();
 77 
 78 if(this.edchg){ this.eddt= document.getElementById("iNputbOx").value };
 79 //IEのとき event.button event.srcElement
 80 //    if(MSIE){TargeT = event.srcElement ;Bt = event.button ;}else{};
 81 
 82         var TargeT=e.target;var Bt=e.which;//ターゲットオブジェクト取得
 83 // dbgPut(TargeT.id);
 84 //IDの無いエレメントは処理スキップ
 85     if(! TargeT.id){
 86         xUI.Touch.action = false;
 87 //         if (this.edmode==3){this.Touch()}
 88         return false;
 89     }
 90 //カラム移動処理の前にヘッダ処理を追加 2010/08
 91     if(TargeT.id.match(/^L([0-9]+)_(-?[0-9]+)_([0-9]+)$/)) {
 92         var tln=1*RegExp.$1;var pgn=1*RegExp.$2;var cbn=1*RegExp.$3;//timeline(column)ID/pageID/columnBlockID
 93 switch(e.type){
 94 case    "dblclick":
 95         reNameLabel((tln).toString());
 96 break;
 97 case    "mousedown":
 98     if(this.edmode==0)xUI.changeColumn(tln,2*pgn+cbn);
 99 break;
100 }
101     xUI.Touch.action = false;
102     return ;
103     }
104 //-------------------ヘッダ処理解決
105 
106 //    if(TargeT.id.split("_").length>2){return false};//判定を変更
107 //ページヘッダ処理終了
108 //=============================================モード別処理
109 if(this.edmode==3){
110 /*
111     セクション編集フローティング
112 
113     フローティング移動中
114 
115 */
116 
117     var hottrack=TargeT.id.split('_')[0];
118     var hotpoint=TargeT.id.split('_')[1];
119 switch (e.type){
120 case    "dblclick"    :
121 case    "mousedown"    :    
122 	document.getElementById("iNputbOx").focus();
123 break;
124 case    "click"    :
125 case    "mouseup"    ://終了位置で解決
126 //[ctrl][shift]同時押しでオプション動作
127     xUI.sectionUpdate();
128     this.mdChg(2);
129     this.Touch.action=false;
130 
131 //    this.floatTextHi();
132 break;
133 case    "mouseover"    :
134     if((hottrack!=xUI.Select[0])||(! xUI.Touch.action)) {
135         if(TargeT.id && TargeT.id.match(/r?L\d/)){
136             xUI.sectionUpdate();
137             this.mdChg(2);
138             this.Touch.action=false;
139         }
140         return false
141     };
142 if(! this.Touch.action){
143     return false;
144 
145     if(this.Touch.action){
146         if (TargeT.id && xUI.Touch.rID!=TargeT.id ){
147             this.selection(TargeT.id);
148             if(((e.ctrlKey)||(e.metaKey))||(this.spinSelect)) this.spin("update");
149             return false;
150         }else{
151             return true;
152         };
153     };
154 }else{
155         this.sectionPreview(hotpoint);
156 }
157     break;
158 default    :    return true;
159 };
160     return false;
161 
162 }else if(this.edmode==2){
163 	document.getElementById("iNputbOx").focus();
164     var hottrack=TargeT.id.split('_')[0];
165     var hotpoint=TargeT.id.split('_')[1];
166 /*
167     モード遷移は他の状態からコール
168     セクション編集モード
169     トラック内限定で区間編集を行う。
170     モード変更コマンドの発行はemode==0の際のみ有効
171     モード変更のトリガは、ダブルクリック
172 基本操作
173 3種のターゲットがある
174         body
175 セクション全体がトラック内を前後に移動する
176 フローティングムーブに準ずる処理  ホットポイントオフセットが存在する
177         head
178         tail
179 トラック内でセクションが伸縮
180 他のノードを固定してヘッドまたはテールノードが移動することでセクションを伸縮する  
181 
182 edmode==3  中は、タッチオーバーでセクション body||head||tail 移動
183 リリースで移動(=編集)を解決  1回毎に更新回数を記録
184 ダブルクリックまたは対象トラック外をクリックで解決してモード解除
185 エスケープまたは対象トラック外右クリックで変更を廃棄して編集前に戻す
186 
187 キーボード操作(1フレームづつ移動なので要注意)
188     モード遷移・確定 [ctrl]+[shift]+[ENTER]
189     ボディ移動       [↑]/[↓]
190     ヘッド移動       [ctrl]+[↑]/[↓]
191     テール移動       [shift]+[↑]/[↓]
192                      [shift]+[ctrl]+[↑]/[↓]
193      編集破棄+モード解除
194                      [esc]
195                      
196     セクション操作オフセットをxUIのプロパティで設定する
197     値が0なら前方伸長  値が末尾なら後方伸長それ以外は移動
198     継続時間が1の場合は末尾として扱う
199     解決順が  末尾>先頭>以外になれば操作種別を1種にできる
200     すべてsectionMove(start,duration)に集約できそう
201     
202 */
203 switch (e.type){
204 case    "dblclick"    :
205 //セクション操作モードを抜けて確定処理を行う
206 //確定処理はmdChg メソッド内で実行
207               this.mdChg("normal");
208 break;            
209 case    "mousedown"    :
210     //サブモードを設定
211     if((
212         Math.abs(hotpoint -(xUI.Select[1]+(xUI.Selection[1]/2))) >
213         Math.abs(xUI.Selection[1]/2)
214         )&&(hottrack == xUI.Select[0])
215     ){
216 //レンジ外
217         if (e.shiftKey){
218 //近接端で移動
219             xUI.sectionManipulateOffset[1] = (hotpoint<xUI.Select[1])? 0:this.Selection[1];
220             xUI.sectionManipulateOffset[0] = 'body';
221         }else if((e.ctrlKey)||(e.metaKey)){
222 //近接端で延伸
223             xUI.sectionManipulateOffset[1] = (hotpoint<xUI.Select[1])? 0:this.Selection[1];
224             xUI.sectionManipulateOffset[0] = (hotpoint<xUI.Select[1])? 'head':'tail'; 
225         }else{
226             return xUI.mdChg(0);//モード解除
227         }
228         this.sectionPreview(hotpoint);
229         this.sectionUpdate();
230     }else{
231 //フロートモードへ遷移
232         xUI.sectionManipulateOffset[1] = hotpoint-this.Select[1];
233         xUI.sectionManipulateOffset[0] = 'body';
234         if(xUI.sectionManipulateOffset[1]==xUI.Selection[1]){
235             xUI.sectionManipulateOffset[0] = 'tail';
236         } else if(xUI.sectionManipulateOffset[1]==0){
237             xUI.sectionManipulateOffset[0] = 'head';
238         }
239     }
240     xUI.mdChg(3);    
241     xUI.Touch.action=true;
242 //    console.log([xUI.edmode,hotpoint,xUI.sectionManipulateOffset,xUI.Touch.action]);
243 break;
244 case    "click"    :;//クリックしたセルで解決  (any):body/+[ctrl]:head/+[shift]:tail 
245     if(hottrack!=xUI.Select[0]) {
246         //対象トラック外なら確定して解除
247         this.mdChg("normal");        
248     }
249 break;
250 
251 case    "mouseup"    ://終了位置で解決
252 //[ctrl]同時押しで複製処理
253     //  this.mdChg(0,(e.ctrlKey));
254     this.Touch.action=false;
255     this.floatTextHi();
256 break;
257 case    "mouseover"    :
258     
259 //トラックが異なる場合 NOP return
260 //    var sectionRegex=new RegExp('^'+String(xUI.Select[0])+'_([0-9]+)$');
261 //    if((!(TargeT.id.match(sectionRegex)))||(! xUI.Touch.action)){return false};//ターゲットトラック以外を排除
262     if((hottrack!=xUI.Select[0])||(! xUI.Touch.action)) {return false};
263 if(! this.Touch.action){
264     return false;
265 
266     if(this.Touch.action){
267         if (TargeT.id && xUI.Touch.rID!=TargeT.id ){
268             this.selection(TargeT.id);
269             if(((e.ctrlKey)||(e.metaKey))||(this.spinSelect)) this.spin("update");
270             return false;
271         }else{
272             return true;
273         };
274     };
275 }else{
276             this.sectionPreview(hotpoint);
277 }
278     break;
279 default    :    return true;
280 };
281     return false;
282 
283 }else if(this.edmode==1){
284 //return false;
285 //ブロックムーブ(フローティングモード)
286 /*
287     基本動作:
288 タッチオーバーでセクションを移動
289 リリースで移動を解決してモード解除
290 ダブルクリック・クリック等は基本的に発生しないので無視
291 */
292 switch (e.type){
293 case    "dblclick"    :
294 //              this.mdChg("section");
295 //              this.floatTextHi();//導入処理
296 //            this.selectCell(TargeT.id);
297 //    this.floatDestAddress=this.Select.slice();
298             
299 case    "mousedown"    :
300 case    "click"    :
301 case    "mouseup"    ://終了位置で解決
302 //    console.log("<<<<<<")
303 //[ctrl]同時押しで複製処理
304       this.mdChg(0,((e.ctrlKey)||(e.metaKey)));
305       this.floatTextHi();
306 break;
307 case    "mouseover"    ://可能な限り現在位置で変数を更新
308     if(!(TargeT.id.match(/^([0-9]+)_([0-9]+)$/))){return false};//シートセル以外を排除
309 //オフセットを参照して  .Select .Selection を操作する
310 /*
311     
312 */
313 if(false){
314     if(this.Touch.action){
315         if (TargeT.id && xUI.Touch.rID!=TargeT.id ){
316             this.selection(TargeT.id);
317             if(((e.ctrlKey)||(e.metaKey))||(this.spinSelect)) this.spin("update");
318             return false;
319         }else{
320             return true;
321         };
322     };
323 }else{
324             this.selectCell(TargeT.id);
325     this.floatDestAddress=this.Select.slice();
326 }
327     break;
328 default    :    return true;
329 };
330     return false;
331 }
332 //=============================================カラム移動処理
333     if(!(TargeT.id.match(/^([0-9]+)_([0-9]+)$/))){return false};//シートセル以外を排除
334 
335 switch (e.type){
336 case    "dblclick"    :
337             //ダブルクリック時はモード保留して(解除か?)タイムラインセクション編集モードに入る
338             this.mdChg("section",TargeT.id);
339             this.Touch.action=false;
340             return false;
341 break;
342 case    "mousedown"    :
343 //document.getElementById("iNputbOx").value=("mouseDown")
344     if (this.edchg){this.put(this.eddt);}//更新
345 
346     this.Touch.rID=this.getid("Select");//
347     this.Touch.sID=TargeT.id;
348     this.Touch.action=true;
349 
350 //    if(TargeT.id==this.getid("Select"))
351 //    {    }else{    };
352 
353         if(this.Selection[0]!=0||this.Selection[1]!=0){
354 //選択範囲が存在した場合
355 //if(dbg) dbgPut(this.edmode+":"+this.getid("Select")+"=="+TargeT.id);
356 //        var CurrentSelect=TargeT.id.split("_");
357 /*
358         var CurrentAction=this.actionRange();
359         if(
360         (CurrentAction[0][0]<=CurrentSelect[0] && CurrentAction[1][0]>=CurrentSelect[0])&&
361         (CurrentAction[0][1]<=CurrentSelect[1] && CurrentAction[1][1]>=CurrentSelect[1])
362         ){}
363 */
364         if(TargeT.id==this.getid("Select")){
365               //フォーカスセルにタッチダウンしてブロック移動へモード遷移
366             //クリック時とダブルクリック時の判定をしてスキップしたほうが良い
367 //            if(TargeT.id!=this.floatDestAddress.join("_")){}
368             this.mdChg('block');
369             this.floatTextHi();
370             this.selectCell(TargeT.id);
371             this.floatDestAddress=this.Select.slice();
372 
373             this.Touch.action=false;
374             return false;
375           }else{
376         if(e.shiftKey){
377             this.selection(TargeT.id);
378             if(((e.ctrlKey)||(e.metaKey))||(this.spinSelect)) this.spin("update");
379             return false;//マルチセレクト
380         }else{
381             this.selection();//セレクション解除
382             this.Touch.action=false;
383             this.selectCell(TargeT.id);//セレクト移動
384         }
385             return false;
386           }
387         }else{
388 //選択範囲が存在しない場合
389             this.selection();//セレクション解除
390         };
391 
392         if(e.shiftKey){
393             this.selection(TargeT.id);
394             if(((e.ctrlKey)||(e.metaKey))||(this.spinSelect)) this.spin("update");
395             return false;//マルチセレクト
396         }else{
397             if ((! e.ctrlKey)&&(! e.metaKey)){this.selection()};//コントロールなければ選択範囲の解除
398 
399             //this.Touch.action=false;
400             this.selectCell(TargeT.id);
401         };
402     break;
403 case    "mouseup"    :
404 //document.getElementById("iNputbOx").value=("mouseUp")
405         this.Touch.action=false;
406     if( this.Touch.sID!=TargeT.id){
407         if(e.shiftKey){
408             this.selection(TargeT.id);
409             if(((e.ctrlKey)||(e.metaKey))||(this.spinSelect)) this.spin("update");
410             return false;//マルチセレクト
411         }else{
412             return false;//セレクトしたまま移動
413         };
414     };
415     break;
416 case    "click"    :
417 
418     break;
419 case    "mouseover"    :
420     if(this.Touch.action){
421         if (TargeT.id && xUI.Touch.rID!=TargeT.id ){
422             this.selection(TargeT.id);
423             if(((e.ctrlKey)||(e.metaKey))||(this.spinSelect)) this.spin("update");
424             return false;
425         }else{
426             return true;
427         };
428     };
429 default    :    return true;
430 };
431     return false;
432 };
433