/** * 文 件 名: MT_DataWashingController.java * 描 述: * 版 权: Copyright (c)20010-2011 motone All Rights Reserved. * 公 司: 摩通科技 * 作 者: 曾少彬 * 版 本: 1.0 * 创建时间: 2011-4-20 * * 修改历史: * 时间 作者 版本 描述 * ------------------------------------------------------------------ * 2011-4-20 曾少彬 1.0 1.0 Version */ package com.mogoo.launcher2; import java.util.ArrayList; import java.util.List; import com.mogoo.launcher2.ItemInfo; import com.mogoo.launcher2.LauncherSettings; import com.mogoo.launcher2.config.Mogoo_GlobalConfig; import com.mogoo.launcher2.utils.Mogoo_Utilities; public class Mogoo_DataWashingController { private static Mogoo_DataWashingController mController; private int numberScreens = 0; private int numberCellsX = 0; private int numberCellsY = 0; private int numberMaxDockCount = 0; private LauncherApplication app = null; private Mogoo_DataWashingController() { } public static Mogoo_DataWashingController getInstance() { if(mController == null) { mController = new Mogoo_DataWashingController(); } return mController; } /*** * 对传入的数据进行清洗,去除重复、空白的图标,同时给多余的图标找到合适的位置 * @param screens 对于当前Launcher, 数组第一项是工具栏,第二项是搜索屏,第三、四、五、六项是图标屏 * @param app */ public void washData(Mogoo_ScreenHolder[] screens, LauncherApplication app) { this.app = app; numberScreens = Mogoo_GlobalConfig.getWorkspaceScreenCount(); numberCellsX = Mogoo_GlobalConfig.getWorkspaceLongAxisCells(false); numberCellsY = Mogoo_GlobalConfig.getWorkspaceShortAxisCells(false); numberMaxDockCount = Mogoo_GlobalConfig.getDockMaxIconCount(); if (Mogoo_GlobalConfig.isLandscape()) { numberCellsX = Mogoo_GlobalConfig.getWorkspaceLongAxisCells(true); numberCellsY = Mogoo_GlobalConfig.getWorkspaceShortAxisCells(true); } // 排序 sortItems(screens); // 重新放置图标 placeItems(screens); } /** * 重新编排cellX cellY * @param screens */ private void placeItems(Mogoo_ScreenHolder[] screens) { int[] shortcutScreen = Mogoo_GlobalConfig.getShortcutScreen(); // 第一个图标屏的索引号,当工具栏多出图标时,图标会被放到该屏 int firstShortcutScreen = 1; if(shortcutScreen!=null && shortcutScreen.length>0) firstShortcutScreen = shortcutScreen[0]; for(int screenIndex = 0; screenIndex < screens.length; screenIndex++) { List<ItemInfo> items = screens[screenIndex].items; for(int i=0;i<items.size();i++) { ItemInfo item = items.get(i); int cellX = i % numberCellsX; int cellY = i / numberCellsY; // 处理工具栏的图标,将多余的放到主屏上面 if(item.container == LauncherSettings.Favorites.CONTAINER_TOOLBAR) { // 工具栏只有一排,所以cellY都为0 item.cellY = 0; if(i < numberMaxDockCount) { item.cellX = i; moveItemInDatabase(item, screenIndex-1); } else // 如果工具栏装不下,则移动到workspace第一屏的最后一个 { insertToNextScreen(screens, item, firstShortcutScreen); moveItemInDatabase(item, firstShortcutScreen); } } else { // 重排序号 if(i< numberCellsX*numberCellsY) { item.cellX = cellX; item.cellY = cellY; } else // 追加到下一屏 { insertToNextScreen(screens, item, screenIndex+1); moveItemInDatabase(item, screenIndex+1); } } } } } // 移动数据库中的图标 private void moveItemInDatabase(ItemInfo item, int screen) { int[] point = Mogoo_Utilities.switchPoint(new int[] { item.cellX, item.cellY }); ItemInfo itemTemp2 = new ItemInfo(item); LauncherModel.moveItemInDatabase(app, itemTemp2, LauncherSettings.Favorites.CONTAINER_DESKTOP, screen, point[0], point[1]); } /** * 追加某一图标到指定屏的最后一位 * @param screens * @param item * @param screenIndex */ private void insertToNextScreen(Mogoo_ScreenHolder[] screens, ItemInfo item, int screenIndex) { if(screenIndex >= screens.length) { return; } Mogoo_ScreenHolder screen = screens[screenIndex]; // 肯定为DESKTOP屏 item.container = LauncherSettings.Favorites.CONTAINER_DESKTOP; item.screen = screenIndex; screen.items.add(item); } /** * 对桌面和工具栏图标按cellX cellY 排序 * * @param screens */ private void sortItems(Mogoo_ScreenHolder[] screens) { for(int screenIndex = 0; screenIndex < screens.length; screenIndex++) { List<ItemInfo> items = screens[screenIndex].items; int totalCells = 0; for(int i = 0; i< items.size(); i++) { totalCells += items.get(i).spanX*items.get(i).spanY; // 如果前一屏的图标放不下了,则追加到后一屏的末尾 if(totalCells > numberCellsX * numberCellsY) { ItemInfo item = items.remove(i); if(screenIndex+1 < screens.length) { screens[screenIndex+1].items.add(item); } continue; } for(int j=items.size()-1; j>i; j--) { ItemInfo itemI = items.get(i); ItemInfo itemJ = items.get(j); int indexI = (itemI.cellY-1)*numberCellsY + itemI.cellX; int indexJ = (itemJ.cellY-1)*numberCellsY + itemJ.cellX; // 把更靠前的图标放前面 if(indexI > indexJ) { items.remove(j); items.add(i, itemJ); } } } } } } class Mogoo_ScreenHolder { public List<ItemInfo> items; public Mogoo_ScreenHolder() { items = new ArrayList<ItemInfo>(); } }