OSDN Git Service

for Mac
[everfolder/source.git] / source / workspace / EverFolder / src / com / yuji / ef / IconFrameLayout.java
1 package com.yuji.ef;
2
3 import java.util.ArrayList;
4 import java.util.List;
5
6 import com.yuji.ef.exception.EfException;
7
8 import android.content.Context;
9 import android.graphics.PorterDuff.Mode;
10 import android.graphics.Rect;
11 import android.util.AttributeSet;
12 import android.view.MotionEvent;
13 import android.view.View;
14 import android.view.View.OnLongClickListener;
15 import android.view.animation.Animation;
16 import android.view.animation.Animation.AnimationListener;
17 import android.view.animation.AnimationUtils;
18 import android.widget.FrameLayout;
19
20 public class IconFrameLayout extends FrameLayout implements OnLongClickListener {
21         private EverFolderActivity activity = null;
22
23         private LabelIconView target = null;
24         private LabelIconView destTarget = null;
25         private LabelIconView selectedTarget = null;
26         private LabelIconView cutTarget = null;
27         private List<LabelIconView> labelIconViewList = new ArrayList<LabelIconView>();
28
29         private Animation anime;
30         private int currentX;
31         private int currentY;
32         private int offsetX;
33         private int offsetY;
34         private boolean longClickFlg = false;
35         private IconScrollView scrollView;
36         private Context context = this.getContext();
37         private boolean elabledTouchEvent = true;
38
39         public IconFrameLayout(Context context) {
40                 super(context);
41         }
42
43         public IconFrameLayout(Context context, AttributeSet attrs) {
44                 super(context, attrs);
45         }
46
47         public IconFrameLayout(Context context, AttributeSet attrs, int defStyle) {
48                 super(context, attrs, defStyle);
49         }
50
51         public void setActivity(EverFolderActivity activity) {
52                 this.activity = activity;
53         }
54
55         @Override
56         protected void onLayout(boolean changed, int left, int top, int right,
57                         int bottom) {
58                 super.onLayout(changed, left, top, right, bottom);
59
60                 int size = this.getChildCount();
61                 for (int i = 0; i < size; i++) {
62                         LabelIconView vv = (LabelIconView) this.getChildAt(i);
63                         int x2 = vv.getInitX();
64                         int y2 = vv.getInitY();
65                         // vv.init(x2, y2);
66                         vv.layout(x2, y2, x2 + vv.getWidth(), y2 + vv.getHeight());
67                 }
68         }
69
70         public LabelIconView getSelectedTarget() {
71                 return selectedTarget;
72         }
73
74         public void addView(LabelIconView child) {
75                 addView(child, true);
76         }
77
78         public void addView(LabelIconView child, boolean isAddView) {
79                 if (isAddView) {
80                         super.addView(child);
81                 }
82                 labelIconViewList.add(child);
83         }
84
85         public void removeAllViews() {
86                 super.removeAllViews();
87                 labelIconViewList.clear();
88         }
89
90         public void moveTop(LabelIconView child) {
91                 this.removeView(child);
92                 this.addView(child);
93         }
94
95         private LabelIconView getView(int x, int y, LabelIconView v,
96                         List<LabelIconView> list, boolean flag) {
97                 Rect rect = new Rect();
98
99                 if (v != null) {
100                         if (flag) {
101                                 v.getHitRect(rect);
102                                 if (rect.contains(x, y)) {
103                                         return v;
104                                 }
105                         }
106                 }
107                 for (LabelIconView view : list) {
108                         if (view != v) {
109                                 view.getHitRect(rect);
110                                 if (rect.contains(x, y)) {
111                                         return view;
112                                 }
113                         }
114                 }
115                 return null;
116         }
117
118         public void setScrollView(final IconScrollView scrollView) {
119                 this.scrollView = scrollView;
120                 this.setOnLongClickListener(this);
121                 // this.setLongClickable(true);
122
123                 anime = AnimationUtils.loadAnimation(context, R.anim.sample);
124                 anime.setAnimationListener(new AnimationListener() {
125                         public void onAnimationStart(Animation animation) {
126                         }
127
128                         public void onAnimationRepeat(Animation animation) {
129                         }
130
131                         public void onAnimationEnd(Animation animation) {
132                                 // if (isBt2Click) {
133                                 // bt2.performClick();
134                                 // isBt2Click = false;
135                                 // }
136                                 clearTarget();
137                                 setTarget(null);
138                                 destTarget = null;
139
140                                 scrollView.setScrollable(true);
141                                 scrollView.requestDisallowInterceptTouchEvent(false);
142                                 scrollView.invalidate();
143                         }
144                 });
145         }
146
147         public void refresh() {
148                 if (selectedTarget != null) {
149                         boolean flag = false;
150                         long id = selectedTarget.getNodeId();
151                         for (LabelIconView view : labelIconViewList) {
152                                 if (view.getNodeId() == id) {
153                                         setSelectedTarget(view);
154                                         setTarget(view);
155                                         setSelected(selectedTarget);
156                                         flag = true;
157                                         break;
158                                 }
159                         }
160                         if (!flag) {
161                                 // 表示されなかった(CLOSEなど)
162                                 setSelectedTarget(null);
163                                 setTarget(null);
164                         }
165                 }
166                 if (cutTarget != null) {
167                         boolean flag = false;
168                         long id = cutTarget.getNodeId();
169                         for (LabelIconView view : labelIconViewList) {
170                                 if (view.getNodeId() == id) {
171                                         cutTarget = view;
172                                         if (selectedTarget != cutTarget) {
173                                                 clearColorFilter(cutTarget);
174                                         }
175                                         flag = true;
176                                         break;
177                                 }
178                         }
179                         if (!flag) {
180                                 // 表示されなかった(CLOSEなど)
181                                 cutTarget = null;
182                         }
183                 }
184         }
185
186         public void clearTarget() {
187                 if (selectedTarget != null) {
188                         clearColorFilter(selectedTarget);
189                         setSelectedTarget(null);
190                 }
191                 setTarget(null);
192         }
193
194         public LabelIconView getCutTarget() {
195                 return cutTarget;
196         }
197
198         public void setCutTarget(LabelIconView cutTarget) {
199                 setCutTarget(cutTarget, true);
200         }
201
202         public void setCutTarget(LabelIconView cutTarget, boolean isUnselected) {
203                 if (this.cutTarget != null){
204                         setAlpha(this.cutTarget);
205                 }
206                 this.cutTarget = cutTarget;
207                 if (cutTarget != null){
208                         if (cutTarget instanceof StatusIconView){
209                                 return;
210                         }
211                 }
212                 if (isUnselected) {
213                         setSelectedTarget(null);
214                         setTarget(null);
215                 }
216         }
217
218         public void setSelectedTarget(LabelIconView selectedTarget){
219                 if (selectedTarget != null){
220                         if (selectedTarget instanceof StatusIconView){
221                                 return;
222                         }
223                 }
224                 this.selectedTarget = selectedTarget;
225         }
226         
227         public void setTarget(LabelIconView target){
228                 if (target != null){
229                         if (target instanceof StatusIconView){
230                                 return;
231                         }
232                 }
233                 this.target = target;
234         }
235         
236         private void setSelected(LabelIconView t) {
237                 t.setAlpha(255);
238                 t.setColorFilter(0x88ff0000, Mode.LIGHTEN);
239         }
240
241         private void setAlpha(LabelIconView v) {
242                 v.setAlpha(255);
243         }
244
245         private void setGrayAlpha(LabelIconView v) {
246                 v.setAlpha(128);
247         }
248
249         private void clearColorFilter(LabelIconView v) {
250                 v.clearColorFilter();
251                 if (v == cutTarget) {
252                         setGrayAlpha(v);
253                 }
254         }
255
256         @Override
257         public boolean onTouchEvent(MotionEvent event) {
258                 try {
259                         if (!isElabledTouchEvent()) {
260                                 return super.onTouchEvent(event);
261                         }
262
263                         int x = (int) event.getRawX();
264                         int y = (int) event.getRawY();
265
266                         int dx = scrollView.getLeft();
267                         int dy = scrollView.getTop();
268
269                         x -= dx;
270                         y -= dy;
271
272                         int sx = x + scrollView.getScrollX();
273                         int sy = y + scrollView.getScrollY();
274                         LabelIconView v = getView(sx, sy, target, labelIconViewList, true);
275                         LabelIconView obj = (LabelIconView) v;
276
277                         if (target == null) {
278                                 if (event.getAction() == MotionEvent.ACTION_DOWN) {
279                                         setTarget(obj);
280                                 }
281                         }
282                         if (target == null) {
283                                 return super.onTouchEvent(event);
284                         }
285
286                         // コメントにすると何が起きるか?
287                         // scrollView.requestDisallowInterceptTouchEvent(true);
288
289                         if (event.getAction() == MotionEvent.ACTION_MOVE) {
290                                 if (!longClickFlg) {
291                                         return super.onTouchEvent(event);
292                                 }
293                                 if (target == null || target instanceof StatusIconView) {
294                                         return super.onTouchEvent(event);
295                                 }
296                                 obj = target;
297
298                                 int sh = scrollView.getHeight();
299                                 int lh = this.getHeight();
300                                 int maxY = lh - sh;
301                                 int py = scrollView.getScrollY();
302                                 int sdy = 10;
303                                 int N = 100;
304                                 if (y < N) {
305                                         if (py > 0) {
306                                                 if (py < sdy) {
307                                                         sdy = py;
308                                                 }
309                                                 scrollView.smoothScrollTo(0, py - sdy);
310                                                 currentY -= sdy;
311                                         }
312                                 } else if (sh - y < N) {
313                                         if (py < maxY) {
314                                                 if (maxY - py < sdy) {
315                                                         sdy = maxY - py;
316                                                 }
317                                                 scrollView.smoothScrollTo(0, py + sdy);
318                                                 currentY += sdy;
319                                         }
320                                 }
321
322                                 int diffX = offsetX - x;
323                                 int diffY = offsetY - y;
324
325                                 currentX -= diffX;
326                                 currentY -= diffY;
327                                 obj.layout(currentX, currentY, currentX + obj.getWidth(),
328                                                 currentY + obj.getHeight());
329
330                                 offsetX = x;
331                                 offsetY = y;
332
333                                 v = getView(sx, sy, target, labelIconViewList, false);
334                                 if (destTarget == null) {
335                                         if (v != null) {
336                                                 destTarget = v;
337                                                 setGrayAlpha(destTarget);
338                                         }
339                                 } else {
340                                         if (v != destTarget) {
341                                                 setAlpha(destTarget);
342                                                 destTarget = v;
343                                                 if (destTarget != null) {
344                                                         setGrayAlpha(destTarget);
345                                                 }
346                                         }
347                                 }
348                         } else if (event.getAction() == MotionEvent.ACTION_DOWN) {
349                                 if (obj != null) {
350                                         if (obj != target) {
351                                                 clearColorFilter(target);
352                                                 setTarget(obj);
353                                         }
354                                         if (target.getSelectedView(sx - target.getLeft(), sy
355                                                         - target.getTop()) instanceof StatusIconView) {
356                                                 long id = target.getNodeId();
357                                                 setTarget(null);
358
359                                                 activity.execute(id);
360                                                 return super.onTouchEvent(event);
361                                         }
362
363                                         if (selectedTarget != null && selectedTarget == target) {
364                                                 long id = selectedTarget.getNodeId();
365                                                 boolean isDirNode = target.getStatusImageView() != null;
366                                                 
367                                                 clearColorFilter(target);
368                                                 setTarget(null);
369                                                 setSelectedTarget(null);
370                                                 activity.targetSelectedChanged(true);
371
372                                                 if (isDirNode){
373                                                         activity.execute(id);                                                   
374                                                 }
375                                                 else {
376                                                         activity.executeView(id);
377                                                 }
378                                                 
379                                                 return super.onTouchEvent(event);
380                                         }
381
382                                         // ここに移動
383                                         scrollView.requestDisallowInterceptTouchEvent(true);
384
385                                         offsetX = x;
386                                         offsetY = y;
387                                         currentX = obj.getLeft();
388                                         currentY = obj.getTop();
389
390                                         setSelected(target);
391                                         setSelectedTarget(target);
392                                         activity.targetSelectedChanged(true);
393                                         
394                                         // コメントにしたが、デグレードするかも
395                                         // scrollView.setScrollable(false);
396                                 } else {
397                                         clearColorFilter(target);
398                                         setTarget(null);
399                                         setSelectedTarget(null);
400                                         activity.targetSelectedChanged(false);
401                                 }
402                         } else if (event.getAction() == MotionEvent.ACTION_UP) {
403                                 if (!longClickFlg) {
404                                         return super.onTouchEvent(event);
405                                 }
406                                 if (target == null || target instanceof StatusIconView) {
407                                         return super.onTouchEvent(event);
408                                 }
409                                 obj = target;
410
411                                 if (destTarget == null || destTarget instanceof StatusIconView) {
412                                         obj.setAnimation(anime);
413                                         obj.startAnimation(anime);
414
415                                         int srcX = target.getInitX();
416                                         int srcY = target.getInitY();
417                                         target.layout(srcX, srcY, srcX + target.getWidth(), srcY
418                                                         + target.getHeight());
419                                         setAlpha(target);
420                                 } else {
421                                         long src = target.getNodeId();
422                                         long dst = destTarget.getNodeId();
423                                         
424                                         setCutTarget(null, false);
425                                         activity.execute(src, dst);
426
427                                         setTarget(null);
428                                         destTarget = null;
429
430                                         // T29171
431                                         clearTarget();
432
433                                         scrollView.setScrollable(true);
434                                         scrollView.requestDisallowInterceptTouchEvent(false);
435                                         scrollView.invalidate();
436                                 }
437
438                                 longClickFlg = false;
439                         }
440
441                         return super.onTouchEvent(event);
442                 } catch (Exception e) {
443                         EfException.msg(R.string.ErrorSystem, e);
444                         return false;
445                 }
446         }
447
448         @Override
449         public boolean onLongClick(View view) {
450                 if (!isElabledTouchEvent()) {
451                         return true;
452                 }
453                 if (target == null) {
454                         return false;
455                 }
456                 if (target instanceof StatusIconView) {
457                         return false;
458                 }
459
460                 LabelIconView v = (LabelIconView) target;
461                 setGrayAlpha(v);
462                 v.clearColorFilter();
463
464                 moveTop(target);
465
466                 longClickFlg = true;
467                 return true;
468         }
469
470         public boolean isElabledTouchEvent() {
471                 return elabledTouchEvent;
472         }
473
474         public void setElabledTouchEvent(boolean elabledTouchEvent) {
475                 this.elabledTouchEvent = elabledTouchEvent;
476         }
477 }