16e80583aSopenharmony_ci/**
26e80583aSopenharmony_ci * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
36e80583aSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
46e80583aSopenharmony_ci * you may not use this file except in compliance with the License.
56e80583aSopenharmony_ci * You may obtain a copy of the License at
66e80583aSopenharmony_ci *
76e80583aSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
86e80583aSopenharmony_ci *
96e80583aSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
106e80583aSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
116e80583aSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
126e80583aSopenharmony_ci * See the License for the specific language governing permissions and
136e80583aSopenharmony_ci * limitations under the License.
146e80583aSopenharmony_ci */
156e80583aSopenharmony_ci
166e80583aSopenharmony_ciimport { Log } from '../utils/Log';
176e80583aSopenharmony_ciimport { DragArea } from '../interface/DragArea';
186e80583aSopenharmony_ciimport { CommonConstants } from '../constants/CommonConstants';
196e80583aSopenharmony_ciimport type { LauncherDragItemInfo } from '../bean/LauncherDragItemInfo';
206e80583aSopenharmony_ci
216e80583aSopenharmony_ciconst TAG = 'BaseDragHandler';
226e80583aSopenharmony_ci
236e80583aSopenharmony_ci/**
246e80583aSopenharmony_ci * Drag processing base class, drag processing is mainly responsible for the processing of the following tasks:
256e80583aSopenharmony_ci * 1.Efficient event distribution based on drag area.
266e80583aSopenharmony_ci * 2.Initialize drag function related parameters.
276e80583aSopenharmony_ci * 3.Adjust and refresh the desktop layout according to the drag results.
286e80583aSopenharmony_ci */
296e80583aSopenharmony_ciexport abstract class BaseDragHandler {
306e80583aSopenharmony_ci  protected mIsInEffectArea = false;
316e80583aSopenharmony_ci  protected mDragEffectArea: DragArea | undefined;
326e80583aSopenharmony_ci  private mDragStateListener = null;
336e80583aSopenharmony_ci  private mSelectItemIndex: number = CommonConstants.INVALID_VALUE;
346e80583aSopenharmony_ci
356e80583aSopenharmony_ci  constructor() {
366e80583aSopenharmony_ci    this.setIsLongPress(false);
376e80583aSopenharmony_ci  }
386e80583aSopenharmony_ci
396e80583aSopenharmony_ci  /**
406e80583aSopenharmony_ci   * Get the data object corresponding to the drag operation.
416e80583aSopenharmony_ci   */
426e80583aSopenharmony_ci  protected abstract getDragRelativeData(): any;
436e80583aSopenharmony_ci
446e80583aSopenharmony_ci  /**
456e80583aSopenharmony_ci   * Get the position of the drag target.
466e80583aSopenharmony_ci   */
476e80583aSopenharmony_ci  protected abstract getItemIndex(x: number, y: number): number;
486e80583aSopenharmony_ci
496e80583aSopenharmony_ci  /**
506e80583aSopenharmony_ci   * Get the object at the target location.
516e80583aSopenharmony_ci   */
526e80583aSopenharmony_ci  protected abstract getItemByIndex(index: number): any;
536e80583aSopenharmony_ci
546e80583aSopenharmony_ci  /**
556e80583aSopenharmony_ci   * Set the drag effective area.
566e80583aSopenharmony_ci   */
576e80583aSopenharmony_ci  setDragEffectArea(effectArea: DragArea): void {
586e80583aSopenharmony_ci    this.mDragEffectArea = effectArea;
596e80583aSopenharmony_ci  }
606e80583aSopenharmony_ci
616e80583aSopenharmony_ci  /**
626e80583aSopenharmony_ci   * Get valid area.
636e80583aSopenharmony_ci   */
646e80583aSopenharmony_ci  protected getDragEffectArea(): DragArea | undefined {
656e80583aSopenharmony_ci    return this.mDragEffectArea;
666e80583aSopenharmony_ci  }
676e80583aSopenharmony_ci
686e80583aSopenharmony_ci  /**
696e80583aSopenharmony_ci   * Set up drag listeners.
706e80583aSopenharmony_ci   */
716e80583aSopenharmony_ci  setDragStateListener(dragStateListener): void {
726e80583aSopenharmony_ci    this.mDragStateListener = dragStateListener;
736e80583aSopenharmony_ci  }
746e80583aSopenharmony_ci
756e80583aSopenharmony_ci  /**
766e80583aSopenharmony_ci   * Set drag and drop item information.
776e80583aSopenharmony_ci   *
786e80583aSopenharmony_ci   * @param dragItemInfo
796e80583aSopenharmony_ci   */
806e80583aSopenharmony_ci  protected setDragItemInfo(dragItemInfo: LauncherDragItemInfo): void {
816e80583aSopenharmony_ci    Log.showDebug(TAG, `setDragItemInfo dragItemInfo: ${JSON.stringify(dragItemInfo)}`);
826e80583aSopenharmony_ci    AppStorage.setOrCreate<LauncherDragItemInfo>('dragItemInfo', dragItemInfo);
836e80583aSopenharmony_ci  }
846e80583aSopenharmony_ci
856e80583aSopenharmony_ci  /**
866e80583aSopenharmony_ci   * Get drag item information.
876e80583aSopenharmony_ci   *
886e80583aSopenharmony_ci   * @return dragItemInfo
896e80583aSopenharmony_ci   */
906e80583aSopenharmony_ci  protected getDragItemInfo() {
916e80583aSopenharmony_ci    const dragItemInfo: LauncherDragItemInfo = AppStorage.get<LauncherDragItemInfo>('dragItemInfo');
926e80583aSopenharmony_ci    // avoid dragItemInfo from AppStorage is undefined
936e80583aSopenharmony_ci    return dragItemInfo;
946e80583aSopenharmony_ci  }
956e80583aSopenharmony_ci
966e80583aSopenharmony_ci  /**
976e80583aSopenharmony_ci   * Get IsLongPress parameter.
986e80583aSopenharmony_ci   *
996e80583aSopenharmony_ci   * @return isLongPress
1006e80583aSopenharmony_ci   */
1016e80583aSopenharmony_ci  protected getIsLongPress(): boolean {
1026e80583aSopenharmony_ci    const isLongPress: boolean = AppStorage.get('isLongPress');
1036e80583aSopenharmony_ci    return isLongPress;
1046e80583aSopenharmony_ci  }
1056e80583aSopenharmony_ci
1066e80583aSopenharmony_ci  /**
1076e80583aSopenharmony_ci   * Set the IsLongPress parameter.
1086e80583aSopenharmony_ci   */
1096e80583aSopenharmony_ci  protected setIsLongPress(isLongPress): void {
1106e80583aSopenharmony_ci    Log.showDebug(TAG, `setIsLongPress isLongPress: ${isLongPress}`);
1116e80583aSopenharmony_ci    AppStorage.setOrCreate('isLongPress', isLongPress);
1126e80583aSopenharmony_ci  }
1136e80583aSopenharmony_ci
1146e80583aSopenharmony_ci  protected isDragEffectArea(x: number, y: number): boolean {
1156e80583aSopenharmony_ci    if (this.mDragEffectArea) {
1166e80583aSopenharmony_ci      if (x >= this.mDragEffectArea.left && x <= this.mDragEffectArea.right
1176e80583aSopenharmony_ci      && y >= this.mDragEffectArea.top && y <= this.mDragEffectArea.bottom) {
1186e80583aSopenharmony_ci        return true;
1196e80583aSopenharmony_ci      }
1206e80583aSopenharmony_ci    }
1216e80583aSopenharmony_ci    return false;
1226e80583aSopenharmony_ci  }
1236e80583aSopenharmony_ci}
124