Package com.aelitis.azureus.ui.swt.shells.main

Source Code of com.aelitis.azureus.ui.swt.shells.main.MainWindow

/*
* Created on May 29, 2006 2:07:38 PM
* Copyright (C) 2006 Aelitis, All Rights Reserved.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
*
* AELITIS, SAS au capital de 46,603.30 euros
* 8 Allee Lenotre, La Grille Royale, 78600 Le Mesnil le Roi, France.
*/
package com.aelitis.azureus.ui.swt.shells.main;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.*;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.*;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.widgets.*;

import org.gudy.azureus2.core3.config.COConfigurationManager;
import org.gudy.azureus2.core3.config.ParameterListener;
import org.gudy.azureus2.core3.config.impl.ConfigurationChecker;
import org.gudy.azureus2.core3.config.impl.ConfigurationDefaults;
import org.gudy.azureus2.core3.config.impl.TransferSpeedValidator;
import org.gudy.azureus2.core3.download.DownloadManager;
import org.gudy.azureus2.core3.download.DownloadManagerState;
import org.gudy.azureus2.core3.global.*;
import org.gudy.azureus2.core3.internat.MessageText;
import org.gudy.azureus2.core3.logging.*;
import org.gudy.azureus2.core3.torrent.TOTorrent;
import org.gudy.azureus2.core3.torrent.TOTorrentException;
import org.gudy.azureus2.core3.util.*;
import org.gudy.azureus2.core3.util.Constants;
import org.gudy.azureus2.plugins.PluginInterface;
import org.gudy.azureus2.plugins.PluginListener;
import org.gudy.azureus2.plugins.sharing.ShareException;
import org.gudy.azureus2.plugins.sharing.ShareManager;
import org.gudy.azureus2.pluginsimpl.local.PluginInitializer;
import org.gudy.azureus2.ui.swt.*;
import org.gudy.azureus2.ui.swt.associations.AssociationChecker;
import org.gudy.azureus2.ui.swt.config.wizard.ConfigureWizard;
import org.gudy.azureus2.ui.swt.debug.ObfusticateImage;
import org.gudy.azureus2.ui.swt.debug.ObfusticateShell;
import org.gudy.azureus2.ui.swt.debug.UIDebugGenerator;
import org.gudy.azureus2.ui.swt.donations.DonationWindow;
import org.gudy.azureus2.ui.swt.mainwindow.*;
import org.gudy.azureus2.ui.swt.minibar.AllTransfersBar;
import org.gudy.azureus2.ui.swt.minibar.MiniBarManager;
import org.gudy.azureus2.ui.swt.plugins.UISWTInstance;
import org.gudy.azureus2.ui.swt.plugins.UISWTViewEventListener;
import org.gudy.azureus2.ui.swt.pluginsimpl.UISWTInstanceImpl;
import org.gudy.azureus2.ui.swt.sharing.progress.ProgressWindow;
import org.gudy.azureus2.ui.swt.shells.CoreWaiterSWT;
import org.gudy.azureus2.ui.swt.shells.MessageBoxShell;
import org.gudy.azureus2.ui.swt.shells.MessageSlideShell;
import org.gudy.azureus2.ui.swt.speedtest.SpeedTestSelector;
import org.gudy.azureus2.ui.swt.views.IView;
import org.gudy.azureus2.ui.swt.views.utils.ManagerUtils;
import org.gudy.azureus2.ui.swt.welcome.WelcomeWindow;
import org.gudy.azureus2.ui.systray.SystemTraySWT;

import com.aelitis.azureus.activities.VuzeActivitiesManager;
import com.aelitis.azureus.core.AzureusCore;
import com.aelitis.azureus.core.AzureusCoreRunningListener;
import com.aelitis.azureus.core.cnetwork.ContentNetwork;
import com.aelitis.azureus.core.messenger.config.PlatformConfigMessenger;
import com.aelitis.azureus.core.messenger.config.PlatformConfigMessenger.PlatformLoginCompleteListener;
import com.aelitis.azureus.core.messenger.config.PlatformDevicesMessenger;
import com.aelitis.azureus.core.metasearch.MetaSearchManagerFactory;
import com.aelitis.azureus.core.torrent.PlatformTorrentUtils;
import com.aelitis.azureus.core.util.FeatureAvailability;
import com.aelitis.azureus.core.versioncheck.VersionCheckClient;
import com.aelitis.azureus.ui.IUIIntializer;
import com.aelitis.azureus.ui.UIFunctions;
import com.aelitis.azureus.ui.UIFunctionsManager;
import com.aelitis.azureus.ui.common.table.impl.TableColumnManager;
import com.aelitis.azureus.ui.common.updater.UIUpdatable;
import com.aelitis.azureus.ui.common.viewtitleinfo.ViewTitleInfo;
import com.aelitis.azureus.ui.mdi.*;
import com.aelitis.azureus.ui.skin.SkinConstants;
import com.aelitis.azureus.ui.skin.SkinPropertiesImpl;
import com.aelitis.azureus.ui.swt.*;
import com.aelitis.azureus.ui.swt.columns.utils.TableColumnCreatorV3;
import com.aelitis.azureus.ui.swt.extlistener.StimulusRPC;
import com.aelitis.azureus.ui.swt.mdi.BaseMDI;
import com.aelitis.azureus.ui.swt.mdi.MultipleDocumentInterfaceSWT;
import com.aelitis.azureus.ui.swt.mdi.TabbedMDI;
import com.aelitis.azureus.ui.swt.skin.*;
import com.aelitis.azureus.ui.swt.skin.SWTSkinButtonUtility.ButtonListenerAdapter;
import com.aelitis.azureus.ui.swt.uiupdater.UIUpdaterSWT;
import com.aelitis.azureus.ui.swt.utils.FontUtils;
import com.aelitis.azureus.ui.swt.utils.PlayNowList;
import com.aelitis.azureus.ui.swt.views.skin.*;
import com.aelitis.azureus.ui.swt.views.skin.sidebar.SideBar;
import com.aelitis.azureus.ui.swt.views.skin.sidebar.SideBarEntrySWT;
import com.aelitis.azureus.util.*;

/**
* @author TuxPaper
* @created May 29, 2006
*
*
* TODO:
* - MainStatusBar and sidebar components should update when:
    if (parameterName.equals("config.style.useSIUnits") || parameterName.equals("config.style.forceSIValues")) {
      updateComponents();
    }
* - IconBarEnabler for "new" and "open"
*/
public class MainWindow
  implements IMainWindow, ObfusticateShell, MdiListener,
  AEDiagnosticsEvidenceGenerator, MdiEntryLogIdListener, UIUpdatable
{

  private static final LogIDs LOGID = LogIDs.GUI;

  protected Shell shell;

  private Display display;

  private AzureusCore core;

  private IUIIntializer uiInitializer;

  private SWTSkin skin;

  private IMainMenu menu;

  private UISWTInstanceImpl uiSWTInstanceImpl;

  private UIFunctionsImpl uiFunctions;

  private SystemTraySWT systemTraySWT;

  private static Map<String, Long> mapTrackUsage = null;

  private final static AEMonitor mapTrackUsage_mon = new AEMonitor(
      "mapTrackUsage");

  private long lCurrentTrackTime = 0;

  private long lCurrentTrackTimeIdle = 0;

  private boolean disposedOrDisposing;

  private DownloadManager[] dms_Startup;

  protected boolean isReady = false;

  private MainStatusBar statusBar;

  private String lastShellStatus = null;

  private Color colorSearchTextBG;

  private Color colorSearchTextFGdef;

  private Color colorSearchTextFG;
 
  private boolean delayedCore;

  private TrayWindow downloadBasket;

  /**
   * Old Initializer.  AzureusCore is required to be started
   *
   * @param core
   * @param display
   * @param uiInitializer
   */
  public MainWindow(AzureusCore core, Display display,
      final IUIIntializer uiInitializer) {
    delayedCore = false;
    this.core = core;
    this.display = display;
    this.uiInitializer = uiInitializer;
    AEDiagnostics.addEvidenceGenerator(this);

    disposedOrDisposing = false;

    Utils.execSWTThread(new AERunnable() {
      public void runSupport() {
        try {
          createWindow(uiInitializer);
        } catch (Throwable e) {
          Logger.log(new LogAlert(false, "Error Initialize MainWindow", e));
        }
        if (uiInitializer != null) {
          uiInitializer.abortProgress();
        }
      }
    });

    // When a download is added, check for new meta data and
    // un-"wait state" the rating
    GlobalManager gm = core.getGlobalManager();
    dms_Startup = (DownloadManager[]) gm.getDownloadManagers().toArray(
        new DownloadManager[0]);
    gm.addListener(new GlobalManagerListener() {

      public void seedingStatusChanged(boolean seeding_only_mode, boolean b) {
      }

      public void downloadManagerRemoved(DownloadManager dm) {
      }

      public void downloadManagerAdded(final DownloadManager dm) {
        downloadAdded(new DownloadManager[] {
          dm
        });
      }

      public void destroyed() {
      }

      public void destroyInitiated() {
      }

    }, false);

    gm.addDownloadWillBeRemovedListener(new GlobalManagerDownloadWillBeRemovedListener() {
      public void downloadWillBeRemoved(DownloadManager dm,
          boolean remove_torrent, boolean remove_data)

          throws GlobalManagerDownloadRemovalVetoException {
        TOTorrent torrent = dm.getTorrent();
        if (PlatformTorrentUtils.isContentDRM(torrent) && remove_data) {

          String prefix = "v3.mb.deletePurchased.";
          String title = MessageText.getString(prefix + "title");
          String text = MessageText.getString(prefix + "text", new String[] {
            dm.getDisplayName()
          });

          MessageBoxShell mb = new MessageBoxShell(title, text,
              new String[] {
                MessageText.getString(prefix + "button.delete"),
                MessageText.getString(prefix + "button.cancel")
              }, 1);
          mb.setRelatedObject(dm);

          mb.open(null);
          int result = mb.waitUntilClosed();
          if (result != 0) {
            throw new GlobalManagerDownloadRemovalVetoException("", true);
          }
        }
      }
    });

    Alerts.addListener(new Alerts.AlertListener() {

      public boolean allowPopup(Object[] relatedObjects, int configID) {
        DownloadManager dm = (DownloadManager) LogRelationUtils.queryForClass(
            relatedObjects, DownloadManager.class);

        if (dm == null) {
          return true;
        }
        if (dm.getDownloadState().getFlag(DownloadManagerState.FLAG_LOW_NOISE)) {
          return false;
        }

        HashWrapper hw;
        try {
          hw = dm.getTorrent().getHashWrapper();
          if (PlayNowList.contains(hw)) {
            return false;
          }
        } catch (TOTorrentException e) {
        }
        return true;
      }

    });
  }

  /**
   * New Initializer.  AzureusCore does not need to be started.
   * Use {@link #init(AzureusCore)} when core is available.
   *
   * Called for STARTUP_UIFIRST
   *
   * 1) Constructor
   * 2) createWindow
   * 3) init(core)
   *
   * @param display
   * @param uiInitializer
   */
  public MainWindow(final Display display, final IUIIntializer uiInitializer) {
    //System.out.println("MainWindow: constructor");
    delayedCore = true;
    this.display = display;
    this.uiInitializer = uiInitializer;
    AEDiagnostics.addEvidenceGenerator(this);

    Utils.execSWTThread(new AERunnable() {
      public void runSupport() {
        //System.out.println("createWindow");
        try {
          createWindow(uiInitializer);
        } catch (Throwable e) {
          Logger.log(new LogAlert(false, "Error Initialize MainWindow", e));
        }

        while (!display.isDisposed() && display.readAndDispatch());
      }
    });
  }

  /**
   * Called only on STARTUP_UIFIRST
   */
  public void init(final AzureusCore core) {
    //System.out.println("MainWindow: _init(core)");

    Utils.execSWTThread(new AERunnable() {
      public void runSupport() {
        //System.out.println("_init");
        _init(core);
        if (uiInitializer != null) {
          uiInitializer.abortProgress();
        }
      }
    });
    UIUpdaterSWT.getInstance().addUpdater(this);
  }

  /**
   * Called only on STARTUP_UIFIRST
   */
  public void _init(AzureusCore core) {
    //System.out.println("MainWindow: init(core)");
    this.core = core;

    disposedOrDisposing = false;

    StimulusRPC.hookListeners(core, this);

    uiSWTInstanceImpl = new UISWTInstanceImpl(core);
    uiSWTInstanceImpl.init(uiInitializer);

    postPluginSetup(core);

    // When a download is added, check for new meta data and
    // un-"wait state" the rating
    GlobalManager gm = core.getGlobalManager();
    dms_Startup = (DownloadManager[]) gm.getDownloadManagers().toArray(
        new DownloadManager[0]);
    gm.addListener(new GlobalManagerListener() {

      public void seedingStatusChanged(boolean seeding_only_mode, boolean b) {
      }

      public void downloadManagerRemoved(DownloadManager dm) {
      }

      public void downloadManagerAdded(final DownloadManager dm) {
        downloadAdded(new DownloadManager[] {
          dm
        });
      }

      public void destroyed() {
      }

      public void destroyInitiated() {
      }

    }, false);

    gm.addDownloadWillBeRemovedListener(new GlobalManagerDownloadWillBeRemovedListener() {
      public void downloadWillBeRemoved(DownloadManager dm,
          boolean remove_torrent, boolean remove_data)

          throws GlobalManagerDownloadRemovalVetoException {
        TOTorrent torrent = dm.getTorrent();
        if (PlatformTorrentUtils.isContentDRM(torrent) && remove_data) {

          String prefix = "v3.mb.deletePurchased.";
          String title = MessageText.getString(prefix + "title");
          String text = MessageText.getString(prefix + "text", new String[] {
            dm.getDisplayName()
          });

          MessageBoxShell mb = new MessageBoxShell(title, text,
              new String[] {
                MessageText.getString(prefix + "button.delete"),
                MessageText.getString(prefix + "button.cancel")
              }, 1);
          mb.setRelatedObject(dm);

          mb.open(null);
          int result = mb.waitUntilClosed();
          if (result != 0) {
            throw new GlobalManagerDownloadRemovalVetoException("", true);
          }
        }
      }
    });

    Alerts.addListener(new Alerts.AlertListener() {

      public boolean allowPopup(Object[] relatedObjects, int configID) {
        DownloadManager dm = (DownloadManager) LogRelationUtils.queryForClass(
            relatedObjects, DownloadManager.class);

        if (dm == null) {
          return true;
        }
        if (dm.getDownloadState().getFlag(DownloadManagerState.FLAG_LOW_NOISE)) {
          return false;
        }

        HashWrapper hw;
        try {
          hw = dm.getTorrent().getHashWrapper();
          if (PlayNowList.contains(hw)) {
            return false;
          }
        } catch (TOTorrentException e) {
        }
        return true;
      }

    });

    core.triggerLifeCycleComponentCreated(uiFunctions);

    processStartupDMS();
  }

  private void postPluginSetup(AzureusCore core) {
    // we pass core in just as reminder that this function needs core
    if (core == null) {
      return;
    }

    if (!Utils.isAZ2UI()) {
      VuzeActivitiesManager.initialize(core);
    }

    if (!Constants.isSafeMode) {
      if (core.getTrackerHost().getTorrents().length > 0) {
        Utils.execSWTThreadLater(0, new Runnable() {
          public void run() {
            uiFunctions.openView(UIFunctions.VIEW_MYTRACKER, null);
          }
        });
      }

      // share manager init is async so we need to deal with this
      PluginInterface default_pi = PluginInitializer.getDefaultInterface();
      try {
        final ShareManager share_manager = default_pi.getShareManager();

        default_pi.addListener(new PluginListener() {
          public void initializationComplete() {
          }

          public void closedownInitiated() {
            int share_count = share_manager.getShares().length;
            COConfigurationManager.setParameter("GUI_SWT_share_count_at_close",
                share_count);
          }

          public void closedownComplete() {
          }
        });

        if (share_manager.getShares().length > 0
            || COConfigurationManager.getIntParameter("GUI_SWT_share_count_at_close") > 0) {

          Utils.execSWTThreadLater(0, new Runnable() {
            public void run() {
              uiFunctions.openView(UIFunctions.VIEW_MYSHARES, null);
            }
          });
        }
      } catch (ShareException e) {
        Debug.out(e);
      }
     
     
      if (COConfigurationManager.getBooleanParameter("Open Transfer Bar On Start")) {
        uiFunctions.showGlobalTransferBar();
      }

      COConfigurationManager.addAndFireParameterListener("IconBar.enabled",
          new ParameterListener() {
            public void parameterChanged(String parameterName) {
              setVisible(WINDOW_ELEMENT_TOOLBAR, COConfigurationManager.getBooleanParameter(parameterName));
            }
          });
    }

    //  share progress window
    new ProgressWindow( display );
  }

  private void processStartupDMS() {
    // must be in a new thread because we don't want to block
    // initilization or any other add listeners
    AEThread2 thread = new AEThread2("v3.mw.dmAdded", true) {
      public void run() {
        long startTime = SystemTime.getCurrentTime();
        if (dms_Startup == null || dms_Startup.length == 0) {
          dms_Startup = null;
          return;
        }

        downloadAdded(dms_Startup);

        dms_Startup = null;

        System.out.println("psDMS " + (SystemTime.getCurrentTime() - startTime)
            + "ms");
      }
    };
    thread.setPriority(Thread.MIN_PRIORITY);
    thread.start();
  }

  private void downloadAdded(final DownloadManager[] dms) {
    boolean oneIsNotPlatformAndPersistent = false;
    for (final DownloadManager dm : dms) {
      if (dm == null) {
        continue;
      }

      DownloadManagerState dmState = dm.getDownloadState();

      final TOTorrent torrent = dm.getTorrent();
      if (torrent == null) {
        continue;
      }

      String title = PlatformTorrentUtils.getContentTitle(torrent);
      if (title != null && title.length() > 0
          && dmState.getDisplayName() == null) {
        dmState.setDisplayName(title);
      }

      if (ConfigurationChecker.isNewVersion() && dm.getAssumedComplete()) {
        String lastVersion = COConfigurationManager.getStringParameter("Last Version");
        if (org.gudy.azureus2.core3.util.Constants.compareVersions(lastVersion,
            "3.1.1.1") <= 0) {
          long completedTime = dmState.getLongParameter(DownloadManagerState.PARAM_DOWNLOAD_COMPLETED_TIME);
          if (completedTime < SystemTime.getOffsetTime(-(1000 * 60))) {
            PlatformTorrentUtils.setHasBeenOpened(dm, true);
          }
        }
      }

      boolean isContent = PlatformTorrentUtils.isContent(torrent, true)
          || PlatformTorrentUtils.getContentNetworkID(torrent) == ContentNetwork.CONTENT_NETWORK_VHDNL;

      if (!oneIsNotPlatformAndPersistent && !isContent
          && !dmState.getFlag(DownloadManagerState.FLAG_LOW_NOISE) && dm.isPersistent()) {
        oneIsNotPlatformAndPersistent = true;
      }

      if (isContent) {
        long now = SystemTime.getCurrentTime();

        long expiresOn = PlatformTorrentUtils.getExpiresOn(torrent);
        if (expiresOn > now) {
          SimpleTimer.addEvent("dm Expirey", expiresOn,
              new TimerEventPerformer() {
                public void perform(TimerEvent event) {
                  dm.getDownloadState().setFlag(
                      DownloadManagerState.FLAG_LOW_NOISE, true);
                  ManagerUtils.asyncStopDelete(dm, DownloadManager.STATE_STOPPED,
                      true, true, null);
                }
              });
        }
      } // isContent
    }

    if (oneIsNotPlatformAndPersistent && dms_Startup == null) {
      DonationWindow.checkForDonationPopup();
    }
  }

  /**
   * @param uiInitializer
   *
   * called in both delayedCore and !delayedCore
   */
  protected void createWindow(IUIIntializer uiInitializer) {
    //System.out.println("MainWindow: createWindow)");

    long startTime = SystemTime.getCurrentTime();

    uiFunctions = new UIFunctionsImpl(this);
    UIFunctionsManager.setUIFunctions(uiFunctions);

    Utils.disposeComposite(shell);

    increaseProgress(uiInitializer, "splash.initializeGui");

    System.out.println("UIFunctions/ImageLoad took "
        + (SystemTime.getCurrentTime() - startTime) + "ms");
    startTime = SystemTime.getCurrentTime();

    shell = new Shell(display, SWT.SHELL_TRIM);

    if (Constants.isWindows) {
      try {
        Class<?> ehancerClass = Class.forName("org.gudy.azureus2.ui.swt.win32.Win32UIEnhancer");
        Method method = ehancerClass.getMethod("initMainShell",
            new Class[] {
              Shell.class
            });
        method.invoke(null, new Object[] {
          shell
        });
      } catch (Exception e) {
        Debug.outNoStack(Debug.getCompressedStackTrace(e, 0, 30), true);
      }
    }

    try {
      shell.setData("class", this);
      shell.setText("Vuze");
      Utils.setShellIcon(shell);
      Utils.linkShellMetricsToConfig(shell, "window");
      //Shell activeShell = display.getActiveShell();
      //shell.setVisible(true);
      //shell.moveBelow(activeShell);

      System.out.println("new shell took "
          + (SystemTime.getCurrentTime() - startTime) + "ms");
      startTime = SystemTime.getCurrentTime();

      PlatformConfigMessenger.addPlatformLoginCompleteListener(new PlatformLoginCompleteListener() {
        public void platformLoginComplete() {
          Utils.execSWTThread(new AERunnable() {
            public void runSupport() {
              setupUsageTracker();
            }
          });
        }
      });
     
      try {
        PlatformDevicesMessenger.setupDeviceSender();
      } catch (Exception e) {
        Debug.out("failed to setup device sender ", e);
      }

      increaseProgress(uiInitializer, "v3.splash.initSkin");

      skin = SWTSkinFactory.getInstance();
      if (Utils.isAZ2UI()) {
        SWTSkinProperties skinProperties = skin.getSkinProperties();
        String skinPath = SkinPropertiesImpl.PATH_SKIN_DEFS + "skin3_classic";
        ResourceBundle rb = ResourceBundle.getBundle(skinPath);
        skinProperties.addResourceBundle(rb, skinPath);
        String[] ids = {
          "image.toolbar.2nd.m-bg",
          "image.toolbar.2nd.r-bg",
          "image.toolbar.2nd.l-bg",
          "image.toolbar.2nd-view.l-bg",
          "image.toolbar.2nd-view.r-bg",
          "image.toolbar.start",
          "image.toolbar.stop",
          "image.toolbar.remove",
          "image.toolbar.up",
          "image.toolbar.down",
        };
        for (String id : ids) {
          String s = skinProperties.getStringValue(id);
          if (s != null) {
            skinProperties.addProperty(id, s.replaceAll("/tb/", "/tb/c/"));
          }
        }
      }

      /*
       * KN: passing the skin to the uifunctions so it can be used by UIFunctionsSWT.createMenu()
       */
      uiFunctions.setSkin(skin);

      System.out.println("new shell setup took "
          + (SystemTime.getCurrentTime() - startTime) + "ms");
      startTime = SystemTime.getCurrentTime();

      initSkinListeners();

      increaseProgress(uiInitializer, "v3.splash.initSkin");
      // 0ms
      //System.out.println("skinlisteners init took " + (SystemTime.getCurrentTime() - startTime) + "ms");
      //startTime = SystemTime.getCurrentTime();

      String startID = Utils.isAZ2UI() ? "classic.shell" : "main.shell";
      skin.initialize(shell, startID, uiInitializer);

      increaseProgress(uiInitializer, "v3.splash.initSkin");
      System.out.println("skin init took "
          + (SystemTime.getCurrentTime() - startTime) + "ms");
      startTime = SystemTime.getCurrentTime();

      if (Utils.isAZ2UI()) {
        menu = new org.gudy.azureus2.ui.swt.mainwindow.MainMenu(shell);
      } else {
        menu = new MainMenu(skin, shell);
      }
      shell.setData("MainMenu", menu);

      System.out.println("MainMenu init took "
          + (SystemTime.getCurrentTime() - startTime) + "ms");
      startTime = SystemTime.getCurrentTime();

      if (Constants.isOSX) {
        if (Utils.isCarbon) {
          try {
 
            Class<?> ehancerClass = Class.forName("org.gudy.azureus2.ui.swt.osx.CarbonUIEnhancer");
 
            Method method = ehancerClass.getMethod("registerToolbarToggle",
                new Class[] {
                  Shell.class
                });
            method.invoke(null, new Object[] {
              shell
            });
 
          } catch (Exception e) {
            Debug.printStackTrace(e);
          }
        } else if (Utils.isCocoa) {
          try {

            Class<?> ehancerClass = Class.forName("org.gudy.azureus2.ui.swt.osx.CocoaUIEnhancer");

            Method mGetInstance = ehancerClass.getMethod("getInstance",
                new Class[0]);
            Object claObj = mGetInstance.invoke(null, new Object[0]);

            Method mregTBToggle = claObj.getClass().getMethod(
                "registerToolbarToggle", new Class[] {
                  Shell.class
                });
            if (mregTBToggle != null) {
              mregTBToggle.invoke(claObj, new Object[] {
                shell
              });
            }

          } catch (Throwable e) {

            Debug.printStackTrace(e);
          }

        }

        Listener toggleListener = new Listener() {
          public void handleEvent(Event event) {
            ToolBarView tb = (ToolBarView) SkinViewManager.getByClass(ToolBarView.class);
            if (tb != null) {
              tb.flipShowText();
            }
          }
        };
        shell.addListener(SWT.Expand, toggleListener);
        shell.addListener(SWT.Collapse, toggleListener);

        System.out.println("createWindow init took "
            + (SystemTime.getCurrentTime() - startTime) + "ms");
        startTime = SystemTime.getCurrentTime();
      }


      increaseProgress(uiInitializer, "v3.splash.initSkin");

      skin.layout();

      // 0ms
      //System.out.println("skin layout took " + (SystemTime.getCurrentTime() - startTime) + "ms");
      //startTime = SystemTime.getCurrentTime();

      try {
        Utils.createTorrentDropTarget(shell, false);
      } catch (Throwable e) {
        Logger.log(new LogEvent(LOGID, "Drag and Drop not available", e));
      }

      shell.addDisposeListener(new DisposeListener() {
        public void widgetDisposed(DisposeEvent e) {
          dispose(false, false);
        }
      });

      shell.addShellListener(new ShellAdapter() {
        public void shellClosed(ShellEvent event) {
          if (disposedOrDisposing) {
            return;
          }
          if (systemTraySWT != null
              && COConfigurationManager.getBooleanParameter("Enable System Tray")
              && COConfigurationManager.getBooleanParameter("Close To Tray")) {

            minimizeToTray(event);
          } else {
            event.doit = dispose(false, false);
          }
        }

        public void shellActivated(ShellEvent e) {
          Shell shellAppModal = Utils.findFirstShellWithStyle(SWT.APPLICATION_MODAL);
          if (shellAppModal != null) {
            shellAppModal.forceActive();
          } else {
            shell.forceActive();
          }
        }

        public void shellIconified(ShellEvent event) {
          if (disposedOrDisposing) {
            return;
          }
          if (systemTraySWT != null
              && COConfigurationManager.getBooleanParameter("Enable System Tray")
              && COConfigurationManager.getBooleanParameter("Minimize To Tray")) {

            minimizeToTray(event);
          }
        }

        public void shellDeiconified(ShellEvent e) {
          if (Constants.isOSX
              && COConfigurationManager.getBooleanParameter("Password enabled")) {
            shell.setVisible(false);
            if (PasswordWindow.showPasswordWindow(display)) {
              shell.setVisible(true);
            }
          }
        }
      });
     
      display.addFilter(SWT.KeyDown, new Listener() {
        public void handleEvent(Event event) {
          // Another window has control, skip filter
          Control focus_control = display.getFocusControl();
          if (focus_control != null && focus_control.getShell() != shell)
            return;

          int key = event.character;
          if ((event.stateMask & SWT.MOD1) != 0 && event.character <= 26
              && event.character > 0)
            key += 'a' - 1;

          if (key == 'l' && (event.stateMask & SWT.MOD1) != 0) {
            // Ctrl-L: Open URL
            if (core == null) {
              return;
            }
            GlobalManager gm = core.getGlobalManager();
            if (gm != null) {
              OpenTorrentWindow.invokeURLPopup(shell, gm);
              event.doit = false;
            }
          }
        }
      });

      increaseProgress(uiInitializer, "v3.splash.initSkin");
      System.out.println("pre skin widgets init took "
          + (SystemTime.getCurrentTime() - startTime) + "ms");
      startTime = SystemTime.getCurrentTime();

      if (core != null) {
        StimulusRPC.hookListeners(core, this);
      }

      increaseProgress(uiInitializer, "v3.splash.initSkin");
      // 0ms
      //System.out.println("hooks init took " + (SystemTime.getCurrentTime() - startTime) + "ms");
      //startTime = SystemTime.getCurrentTime();

      initMDI();
      System.out.println("skin widgets (1/2) init took "
          + (SystemTime.getCurrentTime() - startTime) + "ms");
      startTime = SystemTime.getCurrentTime();
      initWidgets2();

      increaseProgress(uiInitializer, "v3.splash.initSkin");
      System.out.println("skin widgets (2/2) init took "
          + (SystemTime.getCurrentTime() - startTime) + "ms");
      startTime = SystemTime.getCurrentTime();

      System.out.println("pre SWTInstance init took "
          + (SystemTime.getCurrentTime() - startTime) + "ms");
      increaseProgress(uiInitializer, "v3.splash.hookPluginUI");
      startTime = SystemTime.getCurrentTime();

      TableColumnCreatorV3.initCoreColumns();

      System.out.println("Init Core Columns took "
          + (SystemTime.getCurrentTime() - startTime) + "ms");
      increaseProgress(uiInitializer, "v3.splash.hookPluginUI");
      startTime = SystemTime.getCurrentTime();

      if (core != null) {
        // attach the UI to plugins
        // Must be done before initializing views, since plugins may register
        // table columns and other objects
        uiSWTInstanceImpl = new UISWTInstanceImpl(core);
        uiSWTInstanceImpl.init(uiInitializer);
        //uiSWTInstanceImpl.addView(UISWTInstance.VIEW_MYTORRENTS,
        //    "PieceGraphView", new PieceGraphView());
      }

      System.out.println("SWTInstance init took "
          + (SystemTime.getCurrentTime() - startTime) + "ms");
      increaseProgress(uiInitializer, "splash.initializeGui");
      startTime = SystemTime.getCurrentTime();

    } catch (Throwable t) {
      Debug.out(t);
    } finally {

      String configID = SkinConstants.VIEWID_PLUGINBAR + ".visible";
      if (false == ConfigurationDefaults.getInstance().doesParameterDefaultExist(
          configID)) {
        COConfigurationManager.setBooleanDefault(configID, true);
      }
      setVisible(WINDOW_ELEMENT_TOPBAR,
          COConfigurationManager.getBooleanParameter(configID)
              && COConfigurationManager.getIntParameter("User Mode") > 1);

      setVisible(WINDOW_ELEMENT_TOOLBAR,
          COConfigurationManager.getBooleanParameter("IconBar.enabled"));

      shell.layout(true, true);

      System.out.println("shell.layout took "
          + (SystemTime.getCurrentTime() - startTime) + "ms");
      startTime = SystemTime.getCurrentTime();

      showMainWindow();

      //================

      increaseProgress(uiInitializer, "splash.initializeGui");

      System.out.println("shell.open took "
          + (SystemTime.getCurrentTime() - startTime) + "ms");
      startTime = SystemTime.getCurrentTime();

      processStartupDMS();

      System.out.println("processStartupDMS took "
          + (SystemTime.getCurrentTime() - startTime) + "ms");
      startTime = SystemTime.getCurrentTime();

      if (core != null) {
        postPluginSetup(core);
      }

      System.out.println("vuzeactivities init took "
          + (SystemTime.getCurrentTime() - startTime) + "ms");
      startTime = SystemTime.getCurrentTime();

      NavigationHelper.addListener(new NavigationHelper.navigationListener() {
        public void processCommand(final int type, final String[] args) {
          Utils.execSWTThread(new AERunnable() {
            public void runSupport() {

              UIFunctions uif = UIFunctionsManager.getUIFunctions();

              if (type == NavigationHelper.COMMAND_SWITCH_TO_TAB) {
                MultipleDocumentInterface mdi = UIFunctionsManager.getUIFunctions().getMDI();
                if (mdi == null) {
                  return;
                }
                ContentNetworkUtils.setSourceRef(args[0], "menu", false);
                mdi.showEntryByID(args[0]);

                if (uif != null) {

                  uif.bringToFront();
                }
              } else if (type == NavigationHelper.COMMAND_CONDITION_CHECK) {
              }
            }
          });
        }
      });
    }
  }

  /**
   * @param uiInitializer
   * @param taskKey TODO
   *
   * @since 3.0.4.3
   */
  private void increaseProgress(IUIIntializer uiInitializer, String taskKey) {
    if (uiInitializer != null) {
      uiInitializer.increaseProgress();
      if (taskKey != null) {
        uiInitializer.reportCurrentTask(MessageText.getString(taskKey));
      }
    }
    // XXX Disabled because plugin update window will pop up and take control
    //      of the dispatch loop..
    if (false && Utils.isThisThreadSWT()) {
      // clean the dispatch loop so the splash screen gets updated
      int i = 1000;
      while (display.readAndDispatch() && i > 0) {
        i--;
      }
      //if (i < 999) {
      //  System.out.println("dispatched " + (1000 - i));
      //}
    }
  }

  @SuppressWarnings("deprecation")
  public boolean dispose(final boolean for_restart,
      final boolean close_already_in_progress) {
    if (disposedOrDisposing) {
      return true;
    }
    return Utils.execSWTThreadWithBool("v3.MainWindow.dispose",
        new AERunnableBoolean() {
          public boolean runSupport() {
            return _dispose(for_restart, close_already_in_progress);
          }
        });
  }

  public boolean _dispose(final boolean bForRestart, boolean bCloseAlreadyInProgress) {
    if (disposedOrDisposing) {
      return true;
    }

    isReady = false;

    disposedOrDisposing = true;
    if (core != null
        && !UIExitUtilsSWT.canClose(core.getGlobalManager(), bForRestart)) {
      disposedOrDisposing = false;
      return false;
    }

    UIExitUtilsSWT.uiShutdown();

    if (systemTraySWT != null) {
      systemTraySWT.dispose();
    }

    /**
     * Explicitly force the transfer bar location to be saved (if appropriate and open).
     *
     * We can't rely that the normal mechanism for doing this won't fail (which it usually does)
     * when the GUI is being disposed of.
     */
    try {
      AllTransfersBar transfer_bar = AllTransfersBar.getBarIfOpen(core.getGlobalManager());
      if (transfer_bar != null) {
        transfer_bar.forceSaveLocation();
      }
    } catch (Exception ignore) {
    }

    mapTrackUsage_mon.enter();
    try {
      if (mapTrackUsage != null) {
        String id = getUsageActiveTabID();
        if (id != null) {
          if (lastShellStatus == null) {
            lastShellStatus = id;
          }
          updateMapTrackUsage(lastShellStatus);
        }

        Map<String, Object> map = new HashMap<String, Object>();
        map.put("version",
            org.gudy.azureus2.core3.util.Constants.AZUREUS_VERSION);
        map.put("statsmap", mapTrackUsage);

        FileUtil.writeResilientFile(new File(SystemProperties.getUserPath(),
            "timingstats.dat"), map);
      }
    } finally {
      mapTrackUsage_mon.exit();
    }

    if (!SWTThread.getInstance().isTerminated()) {
      Utils.getOffOfSWTThread(new AERunnable() {
        public void runSupport() {
          if (!SWTThread.getInstance().isTerminated()) {
            SWTThread.getInstance().getInitializer().stopIt(bForRestart, false);
          }
        }
      });
    }

    return true;
  }

  private String getUsageActiveTabID() {
    try {
      MultipleDocumentInterface mdi = UIFunctionsManager.getUIFunctions().getMDI();
      if (mdi != null) {
        MdiEntry curEntry = mdi.getCurrentEntry();
        if (curEntry == null) {
          return "none";
        } else {
          String id = curEntry.getLogID();
          return id == null ? "null" : id;
        }
      }
    } catch (Exception e) {
      String name = e.getClass().getName();
      int i = name.indexOf('.');
      if (i > 0) {
        return name.substring(i);
      }
      return name;
    }
    return "unknown";
  }

  /**
   *
   */
  private void setupUsageTracker() {
    mapTrackUsage_mon.enter();
    try {
      File f = new File(SystemProperties.getUserPath(), "timingstats.dat");

      if (COConfigurationManager.getBooleanParameter("Send Version Info")
          && PlatformConfigMessenger.allowSendStats()) {

        mapTrackUsage = new HashMap<String, Long>();

        if (f.exists()) {
          Map<?, ?> oldMapTrackUsage = FileUtil.readResilientFile(f);
          String version = MapUtils.getMapString(oldMapTrackUsage, "version",
              null);
          Map<?, ?> map = MapUtils.getMapMap(oldMapTrackUsage, "statsmap", null);
          if (version != null && map != null) {
            PlatformConfigMessenger.sendUsageStats(map, f.lastModified(),
                version, null);
          }
        }

        SimpleTimer.addPeriodicEvent("UsageTracker", 1000,
            new TimerEventPerformer() {
              long lLastMouseMove = SystemTime.getCurrentTime();

              Point ptLastMousePos = new Point(0, 0);

              public void perform(TimerEvent event) {
                Utils.execSWTThread(new AERunnable() {
                  public void runSupport() {
                    if (shell == null || shell.isDisposed()
                        || shell.getDisplay().getActiveShell() == null) {
                      // so when we become active again, we count a few
                      // seconds (if the mouse moves)
                      if (ptLastMousePos.x > 0) {
                        ptLastMousePos.x = 0;
                        ptLastMousePos.y = 0;
                        lLastMouseMove = 0;
                      }
                      return;
                    }

                    Point pt = shell.getDisplay().getCursorLocation();
                    if (pt.equals(ptLastMousePos)) {
                      return;
                    }
                    ptLastMousePos = pt;

                    long now = SystemTime.getCurrentTime();
                    if (lLastMouseMove > 0) {
                      long diff = now - lLastMouseMove;
                      if (diff < 10000) {
                        lCurrentTrackTime += diff;
                      } else {
                        lCurrentTrackTimeIdle += diff;
                      }
                    }

                    lLastMouseMove = now;
                  }
                });
              }
            });

        Listener lActivateDeactivate = new Listener() {
          long start;

          public void handleEvent(Event event) {
            if (event.type == SWT.Activate) {
              lCurrentTrackTimeIdle = 0;
              if (start > 0 && lastShellStatus != null) {
                lCurrentTrackTime = SystemTime.getCurrentTime() - start;
                updateMapTrackUsage(lastShellStatus);
              }
              lastShellStatus = null;
            } else {
              updateMapTrackUsage(getUsageActiveTabID());
              if (shell.getMinimized()) {
                lastShellStatus = "idle-minimized";
              } else if (!shell.isVisible()) {
                lastShellStatus = "idle-invisible";
              } else {
                lastShellStatus = "idle-nofocus";
              }
              start = SystemTime.getCurrentTime();
            }
          }
        };
        shell.addListener(SWT.Activate, lActivateDeactivate);
        shell.addListener(SWT.Deactivate, lActivateDeactivate);

      } else {
        mapTrackUsage = null;
        // No use keeping old usage stats if we are told no one wants them
        try {
          if (f.exists()) {
            f.delete();
          }
        } catch (Exception e) {
        }
      }
    } catch (Exception e) {
      Debug.out(e);
    } finally {
      mapTrackUsage_mon.exit();
    }
  }

  private void showMainWindow() {
    COConfigurationManager.addAndFireParameterListener("Show Download Basket", new ParameterListener() {
      public void parameterChanged(String parameterName) {
        configureDownloadBasket();
      }
    });

    boolean isOSX = org.gudy.azureus2.core3.util.Constants.isOSX;
    boolean bEnableTray = COConfigurationManager.getBooleanParameter("Enable System Tray");
    boolean bPassworded = COConfigurationManager.getBooleanParameter("Password enabled");
    boolean bStartMinimize = bEnableTray
        && (bPassworded || COConfigurationManager.getBooleanParameter("Start Minimized"));

    SWTSkinObject soMain = skin.getSkinObject("main");
    if (soMain != null) {
      soMain.getControl().setVisible(true);
    }

    shell.addListener(SWT.Show, new Listener() {
      public void handleEvent(Event event) {
        System.out.println("---------SHOWN AT " + SystemTime.getCurrentTime()
            + ";" + (SystemTime.getCurrentTime() - Initializer.startTime)
            + "ms");
      }
    });

    if (!bStartMinimize) {
      shell.open();
      if (!isOSX) {
        shell.forceActive();
      }
    } else if (Utils.isCarbon) {
      shell.setVisible(true);
      shell.setMinimized(true);
    }
   

    if (delayedCore) {
      // max 5 seconds of dispatching.  We don't display.sleep here because
      // we only want to clear the backlog of SWT events, and sleep would
      // add new ones
      try {
        long endSWTDispatchOn = SystemTime.getOffsetTime(5000);
        while (SystemTime.getCurrentTime() < endSWTDispatchOn
            && !display.isDisposed() && display.readAndDispatch());
      } catch (Exception e) {
        Debug.out(e);
      }

      System.out.println("---------DONE DISPATCH AT "
          + SystemTime.getCurrentTime() + ";"
          + (SystemTime.getCurrentTime() - Initializer.startTime) + "ms");
      if (display.isDisposed()) {
        return;
      }
    }

    if (bEnableTray) {

      try {
        systemTraySWT = new SystemTraySWT();

      } catch (Throwable e) {

        e.printStackTrace();
        Logger.log(new LogEvent(LOGID, LogEvent.LT_ERROR,
            "Upgrade to SWT3.0M8 or later for system tray support."));
      }

      if (bStartMinimize) {
        minimizeToTray(null);
      }
      //Only show the password if not started minimized
      //Correct bug #878227
      else {
        if (bPassworded) {
          minimizeToTray(null);
          setVisible(true); // invokes password
        }
      }
    }

    // do this before other checks as these are blocking dialogs to force order

    if (uiInitializer != null) {

      uiInitializer.initializationComplete();
    }
     
    boolean  run_speed_test = false;

    if (!Utils.isAZ2UI() && !COConfigurationManager.getBooleanParameter("SpeedTest Completed")){
     
     
      if ( ConfigurationChecker.isNewInstall()){
       
        run_speed_test = true;
       
      }else if ( FeatureAvailability.triggerSpeedTestV1()){
       
        long  upload_limit  = COConfigurationManager.getLongParameter("Max Upload Speed KBs" );
        boolean  auto_up      = COConfigurationManager.getBooleanParameter( TransferSpeedValidator.AUTO_UPLOAD_ENABLED_CONFIGKEY );
       
        if ( auto_up ){
         
          if ( upload_limit <= 18 ){
           
            run_speed_test = true;
          }
        }else{
         
          boolean up_seed_limit  = COConfigurationManager.getBooleanParameter("enable.seedingonly.upload.rate" );
       
          if ( upload_limit == 0 && !up_seed_limit ){
           
            run_speed_test = true;
          }
        }
      }
    }
   
   
    if ( run_speed_test ){

      SpeedTestSelector.runMLABTest(false,
        new AERunnable()
        {
          public void
          runSupport()
          {
            WelcomeView.setWaitLoadingURL(false);
          }
        });
    }else{
     
      WelcomeView.setWaitLoadingURL(false);
    }

    if (Utils.isAZ2UI()) {
      if (!COConfigurationManager.getBooleanParameter("Wizard Completed")) {
 
        CoreWaiterSWT.waitForCoreRunning(new AzureusCoreRunningListener() {
          public void azureusCoreRunning(AzureusCore core) {
            new ConfigureWizard(false, ConfigureWizard.WIZARD_MODE_FULL);
          }
        });
      }

      checkForWhatsNewWindow();
    }

    AssociationChecker.checkAssociations();

    // Donation stuff
    Map<?, ?> map = VersionCheckClient.getSingleton().getMostRecentVersionCheckData();
    DonationWindow.setInitialAskHours(MapUtils.getMapInt(map,
        "donations.askhrs", DonationWindow.getInitialAskHours()));

    if (core != null) {
      core.triggerLifeCycleComponentCreated(uiFunctions);
    }

    Utils.execSWTThreadLater(0, new AERunnable() {
      public void runSupport() {
        fixupActionBarSize();
        SWTSkinObject soPlusHeader = skin.getSkinObject("plus-header");
        if (soPlusHeader != null) {
          soPlusHeader.addListener(new SWTSkinObjectListener() {
            public Object eventOccured(SWTSkinObject skinObject, int eventType,
                Object params) {
              if (eventType == SWTSkinObjectListener.EVENT_HIDE
                  || eventType == SWTSkinObjectListener.EVENT_SHOW) {
                fixupActionBarSize();
              }
              return null;
            }
          });
        }
      }
    });

    System.out.println("---------READY AT " + SystemTime.getCurrentTime() + ";"
        + (SystemTime.getCurrentTime() - Initializer.startTime) + "ms");
    isReady = true;
    //SESecurityManagerImpl.getSingleton().exitVM(0);
  }

  private void configureDownloadBasket() {
    if (COConfigurationManager.getBooleanParameter("Show Download Basket")) {
      if (downloadBasket == null) {
        downloadBasket = new TrayWindow();
        downloadBasket.setVisible(true);
      }
    } else if (downloadBasket != null) {
      downloadBasket.setVisible(false);
      downloadBasket = null;
    }
  }

  private void checkForWhatsNewWindow() {
    final String CONFIG_LASTSHOWN = "welcome.version.lastshown";

    // Config used to store int, such as 2500.  Now, it stores a string
    // getIntParameter will return default value if parameter is string (user
    // downgraded)
    // getStringParameter will bork if parameter isn't really a string

    try {
      String lastShown = "";
      boolean bIsStringParam = true;
      try {
        lastShown = COConfigurationManager.getStringParameter(CONFIG_LASTSHOWN,
            "");
      } catch (Exception e) {
        bIsStringParam = false;
      }

      if (lastShown.length() == 0) {
        // check if we have an old style version
        int latestDisplayed = COConfigurationManager.getIntParameter(
            CONFIG_LASTSHOWN, 0);
        if (latestDisplayed > 0) {
          bIsStringParam = false;
          String s = "" + latestDisplayed;
          for (int i = 0; i < s.length(); i++) {
            if (i != 0) {
              lastShown += ".";
            }
            lastShown += s.charAt(i);
          }
        }
      }

      if (Constants.compareVersions(lastShown, Constants.getBaseVersion()) < 0) {
        new WelcomeWindow(shell);
        if (!bIsStringParam) {
          // setting parameter to a different value type makes az unhappy
          COConfigurationManager.removeParameter(CONFIG_LASTSHOWN);
        }
        COConfigurationManager.setParameter(CONFIG_LASTSHOWN,
            Constants.getBaseVersion());
        COConfigurationManager.save();
      }
    } catch (Exception e) {
      Debug.out(e);
    }
  }


  public void setVisible(final boolean visible) {
    setVisible(visible, true);
  }

  public void setVisible(final boolean visible, final boolean tryTricks) {
    Utils.execSWTThread(new AERunnable() {
      public void runSupport() {
        boolean currentlyVisible = shell.getVisible() && !shell.getMinimized();
        if (visible && !currentlyVisible) {
          if (COConfigurationManager.getBooleanParameter("Password enabled")) {
            if (!PasswordWindow.showPasswordWindow(display)) {
              shell.setVisible(false);
              return;
            }
          }
        }
       
        if (!isReady) {
          return;
        }

        ArrayList<Shell> wasVisibleList = null;
        boolean bHideAndShow = false;
        // temp disabled
        //tryTricks && visible && Constants.isWindows && display.getActiveShell() != shell;
        if (bHideAndShow) {
          wasVisibleList = new ArrayList<Shell>();
          // We don't want the window to just flash and not open, so:
          // -Minimize main shell
          // -Set all shells invisible
          try {
            shell.setMinimized(true);
            Shell[] shells = shell.getDisplay().getShells();
            for (int i = 0; i < shells.length; i++) {
              if (shells[i].isVisible()) {
                wasVisibleList.add(shells[i]);
                shells[i].setVisible(false);
              }
            }
          } catch (Exception e) {
          }
        }

        if (visible) {
          if (shell.getMinimized()) {
            shell.setMinimized(false);
          }
          if (!currentlyVisible
              && COConfigurationManager.getBooleanParameter("window.maximized")) {
            shell.setMaximized(true);
          }
        } else {
          // XXX hack for release.. should not access param outside Utils.linkShellMetrics
          COConfigurationManager.setParameter("window.maximized",
              shell.getMaximized());
        }

        shell.setVisible(visible);
        if (visible) {
          shell.forceActive();

          if (bHideAndShow) {
            try {
              Shell[] shells = shell.getDisplay().getShells();
              for (int i = 0; i < shells.length; i++) {
                if (shells[i] != shell) {
                  if (wasVisibleList.contains(shells[i])) {
                    shells[i].setVisible(visible);
                  }
                  shells[i].setFocus();
                }
              }
            } catch (Exception e) {
            }
          }
        }

      }
    });
  }

  private void minimizeToTray(ShellEvent event) {
    //Added this test so that we can call this method with null parameter.
    if (event != null) {
      event.doit = false;
    }

    // XXX hack for release.. should not access param outside Utils.linkShellMetrics
    COConfigurationManager.setParameter("window.maximized",
        shell.getMaximized());
    shell.setVisible(false);
    MiniBarManager.getManager().setAllVisible(true);
  }

  /**
   * Associates every view ID that we use to a class, and creates the class
   * on first EVENT_SHOW.
   */
  private void initSkinListeners() {
    UISkinnableManagerSWT skinnableManagerSWT = UISkinnableManagerSWT.getInstance();
    skinnableManagerSWT.addSkinnableListener(MessageBoxShell.class.toString(),
        new UISkinnableSWTListener() {
          public void skinBeforeComponents(Composite composite,
              Object skinnableObject, Object[] relatedObjects) {

            MessageBoxShell shell = (MessageBoxShell) skinnableObject;

            TOTorrent torrent = null;
            DownloadManager dm = (DownloadManager) LogRelationUtils.queryForClass(
                relatedObjects, DownloadManager.class);
            if (dm != null) {
              torrent = dm.getTorrent();
            } else {
              torrent = (TOTorrent) LogRelationUtils.queryForClass(
                  relatedObjects, TOTorrent.class);
            }

            if (torrent != null && shell.getLeftImage() == null) {
              byte[] contentThumbnail = PlatformTorrentUtils.getContentThumbnail(torrent);
              if (contentThumbnail != null) {
                try {
                  ByteArrayInputStream bis = new ByteArrayInputStream(
                      contentThumbnail);
                  final Image img = new Image(Display.getDefault(), bis);

                  shell.setLeftImage(img);

                  composite.addDisposeListener(new DisposeListener() {
                    public void widgetDisposed(DisposeEvent e) {
                      if (!img.isDisposed()) {
                        img.dispose();
                      }
                    }
                  });
                } catch (Exception e) {

                }
              }
            }
          }

          public void skinAfterComponents(Composite composite,
              Object skinnableObject, Object[] relatedObjects) {
          }
        });

    skinnableManagerSWT.addSkinnableListener(
        MessageSlideShell.class.toString(), new UISkinnableSWTListener() {

          public void skinBeforeComponents(Composite composite,
              Object skinnableObject, Object[] relatedObjects) {
            if (skinnableObject instanceof MessageSlideShell) {
              final Image image = new Image(composite.getDisplay(), 250, 300);

              TOTorrent torrent = null;
              DownloadManager dm = (DownloadManager) LogRelationUtils.queryForClass(
                  relatedObjects, DownloadManager.class);
              if (dm != null) {
                torrent = dm.getTorrent();
              } else {
                torrent = (TOTorrent) LogRelationUtils.queryForClass(
                    relatedObjects, TOTorrent.class);
              }

              MessageSlideShell shell = (MessageSlideShell) skinnableObject;

              byte[] contentThumbnail = PlatformTorrentUtils.getContentThumbnail(torrent);
              GC gc = new GC(image);
              try {
                gc.setBackground(gc.getDevice().getSystemColor(
                    SWT.COLOR_WIDGET_BACKGROUND));
                gc.fillRectangle(image.getBounds());

                if (contentThumbnail != null) {

                  try {
                    ByteArrayInputStream bis = new ByteArrayInputStream(
                        contentThumbnail);
                    final Image img = new Image(Display.getDefault(), bis);
                    Rectangle imgBounds = img.getBounds();
                    double pct = 35.0 / imgBounds.height;
                    int w = (int) (imgBounds.width * pct);

                    try {
                      gc.setAdvanced(true);
                      gc.setInterpolation(SWT.HIGH);
                    } catch (Exception e) {
                      // not important if we can't set advanced
                    }

                    gc.drawImage(img, 0, 0, imgBounds.width, imgBounds.height,
                        0, 265, w, 35);
                    img.dispose();
                  } catch (Exception e) {

                  }

                }
              } finally {
                gc.dispose();
              }
              shell.setImgPopup(image);

              composite.addListener(SWT.Dispose, new Listener() {
                public void handleEvent(Event event) {
                  if (!image.isDisposed()) {
                    image.dispose();
                  }
                }
              });
            }
          }

          public void skinAfterComponents(Composite composite,
              Object skinnableObject, Object[] relatedObjects) {
            if (true) {
              return; // temp disable
            }
            Color bg = skin.getSkinProperties().getColor("color.mainshell");
            if (bg != null) {
              composite.setBackground(bg);
            }
            Color fg = skin.getSkinProperties().getColor("color.section.header");
            if (fg != null) {
              setChildrenFG(composite, fg);
            }
            composite.setBackgroundMode(SWT.INHERIT_DEFAULT);
          }
        });
  }

  private void setChildrenFG(Control parent, Color color) {
    parent.setForeground(color);
    if (parent instanceof Composite) {
      Control[] children = ((Composite) parent).getChildren();
      for (int i = 0; i < children.length; i++) {
        Control control = children[i];
        if (!(control instanceof Button)
            || (((Button) control).getStyle() & SWT.CHECK) > 0) {
          setChildrenFG(control, color);
        }
      }
    }
  }

  private void initMDI() {
    Class<?> classMDI = Utils.isAZ2UI() ? TabbedMDI.class : SideBar.class;

    try {
      SWTSkinObject skinObject = skin.getSkinObject(SkinConstants.VIEWID_MDI);
      if (null != skinObject) {
        BaseMDI mdi = (BaseMDI) classMDI.newInstance();
        mdi.setMainSkinObject(skinObject);
        skinObject.addListener(mdi);
        MainMDISetup.setupSideBar(mdi, this);
      }
    } catch (Throwable t) {
      Debug.out(t);
    }
  }

  private void initWidgets2() {
    SWTSkinObject skinObject = skin.getSkinObject("statusbar");
    if (skinObject != null) {
      final Composite cArea = (Composite) skinObject.getControl();

      statusBar = new MainStatusBar();
      Composite composite = statusBar.initStatusBar(cArea);

      composite.setLayoutData(Utils.getFilledFormData());
    }

    skinObject = skin.getSkinObject("search-text");
    if (skinObject != null) {
      attachSearchBox(skinObject);
    }

    skinObject = skin.getSkinObject(SkinConstants.VIEWID_PLUGINBAR);
    if (skinObject != null) {
      Menu topbarMenu = new Menu(shell, SWT.POP_UP);

      if (COConfigurationManager.getIntParameter("User Mode") > 1) {
        MainMenu.createViewMenuItem(skin, topbarMenu,
            "v3.MainWindow.menu.view." + SkinConstants.VIEWID_PLUGINBAR,
            SkinConstants.VIEWID_PLUGINBAR + ".visible",
            SkinConstants.VIEWID_PLUGINBAR, true, -1);
      }

      final MenuItem itemShowText = new MenuItem(topbarMenu, SWT.CHECK);
      Messages.setLanguageText(itemShowText,
          "v3.MainWindow.menu.showActionBarText");
      itemShowText.addSelectionListener(new SelectionAdapter() {
        // @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
        public void widgetSelected(SelectionEvent e) {
          ToolBarView tb = (ToolBarView) SkinViewManager.getByClass(ToolBarView.class);
          if (tb != null) {
            tb.flipShowText();
          }
        }
      });

      new MenuItem(topbarMenu, SWT.SEPARATOR);
     
      final MenuItem itemExport = new MenuItem(topbarMenu, SWT.PUSH);
      Messages.setLanguageText(itemExport,
          "search.export.all");
      itemExport.addSelectionListener(new SelectionAdapter() {
        public void widgetSelected(SelectionEvent e) {
          final Shell shell = Utils.findAnyShell();
         
          shell.getDisplay().asyncExec(
            new AERunnable()
            {
              public void
              runSupport()
              {
                FileDialog dialog =
                  new FileDialog( shell, SWT.SYSTEM_MODAL | SWT.SAVE );
               
                dialog.setFilterPath( TorrentOpener.getFilterPathData() );
                           
                dialog.setText(MessageText.getString("metasearch.export.select.template.file"));
               
                dialog.setFilterExtensions(new String[] {
                    "*.vuze",
                    "*.vuz",
                    org.gudy.azureus2.core3.util.Constants.FILE_WILDCARD
                  });
                dialog.setFilterNames(new String[] {
                    "*.vuze",
                    "*.vuz",
                    org.gudy.azureus2.core3.util.Constants.FILE_WILDCARD
                  });
               
                String path = TorrentOpener.setFilterPathData( dialog.open());
     
                if ( path != null ){
                 
                  String lc = path.toLowerCase();
                 
                  if ( !lc.endsWith( ".vuze" ) && !lc.endsWith( ".vuz" )){
                   
                    path += ".vuze";
                  }
                 
                  try{
                    MetaSearchManagerFactory.getSingleton().getMetaSearch().exportEnginesnew File( path ));
                   
                  }catch( Throwable e ){
                   
                    Debug.out( e );
                  }
                }
              }
            })
        }
      });
     
      topbarMenu.addMenuListener(new MenuListener() {
        public void menuShown(MenuEvent e) {
          ToolBarView tb = (ToolBarView) SkinViewManager.getByClass(ToolBarView.class);
          if (tb != null) {
            itemShowText.setSelection(tb.getShowText());
          }
        }

        public void menuHidden(MenuEvent e) {
        }
      });

      addMenuAndNonTextChildren((Composite) skinObject.getControl(), topbarMenu);

      skinObject = skin.getSkinObject("tabbar");
      if (skinObject != null) {
        addMenuAndNonTextChildren((Composite) skinObject.getControl(),
            topbarMenu);
      }
    }
  }

  private void addMenuAndNonTextChildren(Composite parent, Menu menu) {
    parent.setMenu(menu);

    Control[] children = parent.getChildren();
    for (int i = 0; i < children.length; i++) {
      Control control = children[i];
      if (control instanceof Composite) {
        Composite c = (Composite) control;
        addMenuAndNonTextChildren(c, menu);
      } else if (!(control instanceof Text)) {
        control.setMenu(menu);
      }
    }
  }

  /**
   * @param skinObject
   */
  private void attachSearchBox(SWTSkinObject skinObject) {
    Composite cArea = (Composite) skinObject.getControl();

    shell.addListener(SWT.Resize, new Listener() {
      public void handleEvent(Event event) {
        fixupActionBarSize();
      }
    });

    final Text text = new Text(cArea, SWT.NONE);
    FormData filledFormData = Utils.getFilledFormData();
    text.setLayoutData(filledFormData);

    text.setData("ObfusticateImage", new ObfusticateImage() {
      public Image obfusticatedImage(Image image) {
        Point location = Utils.getLocationRelativeToShell(text);
        Point size = text.getSize();
        UIDebugGenerator.obfusticateArea(display, image, new Rectangle(
            location.x, location.y, size.x, size.y));
        return image;
      }
    });
   
    text.addListener(SWT.Resize, new Listener() {
      Font lastFont = null;

      public void handleEvent(Event event) {
        Text text = (Text) event.widget;

        int h = text.getClientArea().height - 2;
        Font font = FontUtils.getFontWithHeight(text.getFont(), null, h);
        if (font != null) {
          text.setFont(font);

          Utils.disposeSWTObjects(new Object[] {
            lastFont
          });

          text.addDisposeListener(new DisposeListener() {
            public void widgetDisposed(DisposeEvent e) {
              Text text = (Text) e.widget;
              text.setFont(null);
              Utils.disposeSWTObjects(new Object[] {
                lastFont
              });
            }
          });
        }
      }
    });
    text.setTextLimit(254);
   
    if (Constants.isWindows) {
      text.addListener(SWT.MouseDown, new Listener() {
        public void handleEvent(Event event) {
          if (event.count == 3) {
            text.selectAll();
          }
        }
      });
    }

    final String sDefault = MessageText.getString("v3.MainWindow.search.defaultText");

    SWTSkinProperties properties = skinObject.getProperties();
    colorSearchTextBG = properties.getColor("color.search.text.bg");
    colorSearchTextFG = properties.getColor("color.search.text.fg");
    colorSearchTextFGdef = properties.getColor("color.search.text.fg.default");

    if (colorSearchTextFGdef != null) {
      text.setForeground(colorSearchTextFGdef);
    }
    if (colorSearchTextBG != null) {
      text.setBackground(colorSearchTextBG);
    }
    text.addMouseListener(new MouseListener() {

      public void mouseUp(MouseEvent e) {
        Text text = (Text) e.widget;
        if (text.getText().equals(sDefault)) {
          if (colorSearchTextFG != null) {
            text.setForeground(colorSearchTextFG);
          }
          text.setText("");
        }
      }

      public void mouseDown(MouseEvent e) {
      }

      public void mouseDoubleClick(MouseEvent e) {
      }
    });

    text.addKeyListener(new KeyListener() {
      public void keyPressed(KeyEvent e) {
        if (e.stateMask == SWT.MOD1) {

          int key = e.character;
          if (key <= 26 && key > 0) {
            key += 'a' - 1;
          }

          if (key == 'a') {
            text.selectAll();
          }
        }

      }

      public void keyReleased(KeyEvent arg0) {
        // TODO Auto-generated method stub

      }
    });

    text.addListener(SWT.KeyDown, new Listener() {

      public void handleEvent(Event event) {
        if (text.getText().equals(sDefault)) {
          if (colorSearchTextFG != null) {
            text.setForeground(colorSearchTextFG);
          }
          if (event.character != '\0') {
            text.setText("");
          }
          return;
        }

        Text text = (Text) event.widget;
        if (event.keyCode == SWT.ESC) {
          text.setText("");
          return;
        }
        if (event.character == SWT.CR) {
          doSearch(text.getText());
        }
      }
    });

    // must be done after layout
    text.setText(sDefault);
    //text.selectAll();

    SWTSkinObject searchGo = skin.getSkinObject("search-go");
    if (searchGo != null) {
      SWTSkinButtonUtility btnGo = new SWTSkinButtonUtility(searchGo);
      btnGo.addSelectionListener(new ButtonListenerAdapter() {
        public void pressed(SWTSkinButtonUtility buttonUtility,
            SWTSkinObject skinObject, int stateMask) {
          String sSearchText = text.getText().trim();
          doSearch(sSearchText);
        }
      });
    }

    SWTSkinObject so = skin.getSkinObject("sidebar-list");
    if (so != null
        && so.getProperties().getBooleanValue(
            so.getConfigID() + ".resizeSearch", false)) {
      Listener l = new Listener() {
        public void handleEvent(Event event) {
          SWTSkinObject soSearchArea = skin.getSkinObject("topbar-area-search");
          if (soSearchArea != null) {
            Control c = soSearchArea.getControl();
            Rectangle bounds = ((Control) event.widget).getBounds();
            FormData fd = (FormData) c.getLayoutData();
            int newWidth = bounds.width - 1 - c.getBounds().x;
            if (bounds.width < 125) {
              return;
            }
            fd.width = newWidth;
            Utils.relayout(c);
          }
        }
      };
      so.getControl().addListener(SWT.Resize, l);
    }

    so = skin.getSkinObject("search-dropdown");
    if (so != null) {
      SWTSkinButtonUtility btnSearchDD = new SWTSkinButtonUtility(so);
      btnSearchDD.addSelectionListener(new ButtonListenerAdapter() {
        public void pressed(SWTSkinButtonUtility buttonUtility,
            SWTSkinObject skinObject, int stateMask) {
          String sSearchText = text.getText().trim();
          doSearch(sSearchText);
        }
      });
    }
  }

  /**
   *
   *
   * @since 4.0.0.1
   */
  protected void fixupActionBarSize() {
    final int MAXWIDTH = 320;
    Rectangle clientArea = shell.getClientArea();
    SWTSkinObject soSearch = skin.getSkinObject("topbar-area-search");
    if (soSearch == null) {
      return;
    }
    FormData fd = (FormData) soSearch.getControl().getLayoutData();
    if (fd == null || fd.width <= 0) {
      return;
    }
    if (clientArea.width > 1124 && fd.width == MAXWIDTH) {
      return;
    }
    SWTSkinObject soTabBar = skin.getSkinObject(SkinConstants.VIEWID_TAB_BAR);
    if (soTabBar == null) {
      return;
    }
    Point size = soTabBar.getControl().computeSize(SWT.DEFAULT, SWT.DEFAULT);
    int oldWidth = fd.width;
    fd.width = clientArea.width - (size.x - oldWidth) - 5;
    if (fd.width < 100) {
      fd.width = 100;
    } else if (fd.width > MAXWIDTH) {
      fd.width = MAXWIDTH;
    }

    if (oldWidth != fd.width) {
      ((Composite) soTabBar.getControl()).layout(true, true);
    }
  }

  /**
   * @param searchText
   */
  //TODO : Tux Move to utils? Could you also add a "mode" or something that would be added to the url
  // eg: &subscribe_mode=true
  public static void doSearch(final String sSearchText) {
    Utils.execSWTThread(new AERunnable() {
      public void runSupport() {
        doSearch(sSearchText, false);
      }
    });
  }

  public static void doSearch(String sSearchText, boolean toSubscribe) {
    String sDefault = MessageText.getString("v3.MainWindow.search.defaultText");
    if (sSearchText.equals(sDefault) || sSearchText.length() == 0) {
      return;
    }

    SearchResultsTabArea.SearchQuery sq = new SearchResultsTabArea.SearchQuery(
        sSearchText, toSubscribe);

    MultipleDocumentInterface mdi = UIFunctionsManager.getUIFunctions().getMDI();
    String id = "Search";
    MdiEntry existingEntry = mdi.getEntry(id);
    if (existingEntry != null && existingEntry.isAdded()) {
      SearchResultsTabArea searchClass = (SearchResultsTabArea) SkinViewManager.getByClass(SearchResultsTabArea.class);
      if (searchClass != null) {
        searchClass.anotherSearch(sSearchText, toSubscribe);
      }
      mdi.showEntry(existingEntry);
      return;
    }

    final MdiEntry entry = mdi.createEntryFromSkinRef(
        MultipleDocumentInterface.SIDEBAR_HEADER_VUZE, id,
        "main.area.searchresultstab", sSearchText, null, sq, true, null);
    if (entry != null) {
      entry.setImageLeftID("image.sidebar.search");
      entry.setDatasource(sq);
      entry.setViewTitleInfo(new ViewTitleInfo() {
        public Object getTitleInfoProperty(int propertyID) {
          if (propertyID == TITLE_TEXT) {
            SearchResultsTabArea searchClass = (SearchResultsTabArea) SkinViewManager.getByClass(SearchResultsTabArea.class);
            if (searchClass != null && searchClass.sq != null) {
              return searchClass.sq.term;
            }
          }
          return null;
        }
      });
    }
    mdi.showEntryByID(id);
  }

  /**
   *
   */
  private void updateMapTrackUsage(String sTabID) {
    //System.out.println("UPDATE: " + sTabID);
    if (mapTrackUsage != null) {
      mapTrackUsage_mon.enter();
      try {
        if (lCurrentTrackTime > 0) {
          Long currentLength = mapTrackUsage.get(sTabID);
          long newLength;
          if (currentLength == null) {
            newLength = lCurrentTrackTime;
          } else {
            newLength = currentLength.longValue() + lCurrentTrackTime;
          }
          if (newLength > 1000) {
            mapTrackUsage.put(sTabID, new Long(newLength / 1000));
            //System.out.println("UPDATE: " + sTabID + ";" + newLength);
          }
        }

        if (lCurrentTrackTimeIdle > 0) {
          String id = "idle-" + sTabID;
          Long currentLengthIdle = mapTrackUsage.get(id);
          long newLengthIdle = currentLengthIdle == null
              ? lCurrentTrackTimeIdle : currentLengthIdle.longValue()
                  + lCurrentTrackTimeIdle;
          if (newLengthIdle > 1000) {
            mapTrackUsage.put(id, new Long(newLengthIdle / 1000));
            //System.out.println("UPDATE: " + id + ";" + newLengthIdle);
          }
        }
      } finally {
        mapTrackUsage_mon.exit();
      }
    }

    lCurrentTrackTime = 0;
    lCurrentTrackTimeIdle = 0;
  }

  public static void addUsageStat(String id, long value) {
    if (id == null) {
      return;
    }
    if (id.length() > 150) {
      id = id.substring(0, 150);
    }
    if (mapTrackUsage != null) {
      mapTrackUsage_mon.enter();
      try {
        Long currentLength = (Long) mapTrackUsage.get(id);
        long newLength;
        if (currentLength == null) {
          newLength = value;
        } else {
          newLength = currentLength.longValue() + value;
        }
        if (newLength > 1000) {
          mapTrackUsage.put(id, new Long(newLength / 1000));
        }
      } finally {
        mapTrackUsage_mon.exit();
      }
    }
  }

  public UISWTInstance getUISWTInstanceImpl() {
    return uiSWTInstanceImpl;
  }

  /**
   * @param url
   * @param target
   */
  public void showURL(final String url, String target) {

    if ("_blank".equalsIgnoreCase(target)) {
      Utils.launch(url);
      return;
    }

    if (target.startsWith("tab-")) {
      target = target.substring(4);
    }

    MultipleDocumentInterface mdi = UIFunctionsManager.getUIFunctions().getMDI();

    if (MultipleDocumentInterface.SIDEBAR_SECTION_PLUS.equals(target)) {
      SBC_PlusFTUX.setSourceRef(url.substring(1));
      mdi.showEntryByID(target);
      return;
    }
   
    // Note; We don't setSourceRef on ContentNetwork here like we do
    // everywhere else because the source ref should already be set
    // by the caller
    if (mdi == null || !mdi.showEntryByID(target)) {
      Utils.launch(url);
      return;
    }

    MdiEntry entry = mdi.getEntry(target);
    entry.addListener(new MdiEntryOpenListener() {

      public void mdiEntryOpen(MdiEntry entry) {
        entry.removeListener(this);

        setVisible(true);

        if (!(entry instanceof SideBarEntrySWT)) {
          return;
        }
        SideBarEntrySWT entrySWT = (SideBarEntrySWT) entry;

        SWTSkinObjectBrowser soBrowser = SWTSkinUtils.findBrowserSO(entrySWT.getSkinObject());

        if (soBrowser != null) {
          //((SWTSkinObjectBrowser) skinObject).getBrowser().setVisible(false);
          if (url == null || url.length() == 0) {
            soBrowser.restart();
          } else {
            String fullURL = url;
            if (UrlFilter.getInstance().urlCanRPC(url)) {
              // 4010 Tux: This shouldn't be.. either determine ContentNetwork from
              //           url or target, or do something..
              fullURL = ConstantsVuze.getDefaultContentNetwork().appendURLSuffix(
                  url, false, true);
            }

            soBrowser.setURL(fullURL);
          }
        }
      }
    });
  }

  protected MainStatusBar getMainStatusBar() {
    return statusBar;
  }

  public boolean isVisible(int windowElement) {
    if (windowElement == IMainWindow.WINDOW_ELEMENT_TOOLBAR) {
      SWTSkinObject skinObject = skin.getSkinObject("tabbar");
      if (skinObject != null) {
        return skinObject.isVisible();
      }
    } else if (windowElement == IMainWindow.WINDOW_ELEMENT_TOPBAR) {
      SWTSkinObject skinObject = skin.getSkinObject(SkinConstants.VIEWID_PLUGINBAR);
      if (skinObject != null) {
        return skinObject.isVisible();
      }
    } else if (windowElement == IMainWindow.WINDOW_ELEMENT_STATUSBAR) {
      //TODO:
    } else if (windowElement == IMainWindow.WINDOW_ELEMENT_MENU) {
      //TODO:
    }

    return false;
  }

  public void setVisible(int windowElement, boolean value) {
    if (windowElement == IMainWindow.WINDOW_ELEMENT_TOOLBAR) {
      SWTSkinUtils.setVisibility(skin, "IconBar.enabled",
          SkinConstants.VIEWID_TAB_BAR, value, true, true);
    } else if (windowElement == IMainWindow.WINDOW_ELEMENT_TOPBAR) {

      SWTSkinUtils.setVisibility(skin, SkinConstants.VIEWID_PLUGINBAR
          + ".visible", SkinConstants.VIEWID_PLUGINBAR, value, true, true);

    } else if (windowElement == IMainWindow.WINDOW_ELEMENT_STATUSBAR) {
      //TODO:
    } else if (windowElement == IMainWindow.WINDOW_ELEMENT_MENU) {
      //TODO:
    }

  }

  public Rectangle getMetrics(int windowElement) {
    if (windowElement == IMainWindow.WINDOW_ELEMENT_TOOLBAR) {
    } else if (windowElement == IMainWindow.WINDOW_ELEMENT_TOPBAR) {

      SWTSkinObject skinObject = skin.getSkinObject(SkinConstants.VIEWID_PLUGINBAR);
      if (skinObject != null) {
        return skinObject.getControl().getBounds();
      }

    } else if (windowElement == IMainWindow.WINDOW_ELEMENT_STATUSBAR) {

      return statusBar.getBounds();

    } else if (windowElement == IMainWindow.WINDOW_CLIENT_AREA) {

      return shell.getClientArea();

    } else if (windowElement == IMainWindow.WINDOW_CONTENT_DISPLAY_AREA) {

      Rectangle r = getMetrics(IMainWindow.WINDOW_CLIENT_AREA);
      r.height -= getMetrics(IMainWindow.WINDOW_ELEMENT_TOPBAR).height;
      r.height -= getMetrics(IMainWindow.WINDOW_ELEMENT_TOOLBAR).height;
      r.height -= getMetrics(IMainWindow.WINDOW_ELEMENT_STATUSBAR).height;
      return r;

    }

    return new Rectangle(0, 0, 0, 0);
  }

  public SWTSkin getSkin() {
    return skin;
  }

  public boolean isReady() {
    return isReady;
  }

  public Image generateObfusticatedImage() {
    // 3.2 TODO: Obfusticate! (esp advanced view)

    Rectangle shellBounds = shell.getBounds();
    Rectangle shellClientArea = shell.getClientArea();
    Image fullImage = new Image(display, shellBounds.width, shellBounds.height);
    Image subImage = new Image(display, shellClientArea.width, shellClientArea.height);

    GC gc = new GC(display);
    try {
      gc.copyArea(fullImage, shellBounds.x, shellBounds.y);
    } finally {
      gc.dispose();
    }
    GC gcShell = new GC(shell);
    try {
      gcShell.copyArea(subImage, 0, 0);
    } finally {
      gcShell.dispose();
    }
    GC gcFullImage = new GC(fullImage);
    try {
      Point location = shell.toDisplay(0, 0);
      gcFullImage.drawImage(subImage, location.x - shellBounds.x, location.y
          - shellBounds.y);
    } finally {
      gcFullImage.dispose();
    }
    subImage.dispose();

    Control[] children = shell.getChildren();
    for (int i = 0; i < children.length; i++) {
      Control control = children[i];
      SWTSkinObject so = (SWTSkinObject) control.getData("SkinObject");
      if (so instanceof ObfusticateImage) {
        ObfusticateImage oi = (ObfusticateImage) so;
        oi.obfusticatedImage(fullImage);
      }
    }

    return fullImage;
  }

  /**
   * @param cla
   * @param data
   *
   * @since 3.1.1.1
   */
  public void openView(final String parentID, final Class<?> cla, String id,
      final Object data, final boolean closeable) {
    final MultipleDocumentInterfaceSWT mdi = UIFunctionsManagerSWT.getUIFunctionsSWT().getMDISWT();
    if (mdi == null) {
      return;
    }

    if (id == null) {
      id = cla.getName();
      int i = id.lastIndexOf('.');
      if (i > 0) {
        id = id.substring(i + 1);
      }
    }

    IView viewFromID = mdi.getIViewFromID(id);
    if (viewFromID != null) {
      mdi.showEntryByID(id);
    }

    final String _id = id;
    Utils.execSWTThreadLater(0, new AERunnable() {

      public void runSupport() {
        if (mdi.showEntryByID(_id)) {
          return;
        }
        if (UISWTViewEventListener.class.isAssignableFrom(cla)) {
          UISWTViewEventListener l = null;
          try {
            Constructor<?> constructor = cla.getConstructor(new Class[] {
              data.getClass()
            });
            l = (UISWTViewEventListener) constructor.newInstance(new Object[] {
              data
            });
          } catch (Exception e) {
          }
          try {
            if (l == null) {
              l = (UISWTViewEventListener) cla.newInstance();
            }
            mdi.createEntryFromEventListener(parentID, l, _id, closeable,
                data);
          } catch (Exception e) {
            Debug.out(e);
          }
        } else {
          mdi.createEntryFromIViewClass(parentID, _id, null, cla,
              null, null, data, null, true);
        }
        mdi.showEntryByID(_id);
      }
    });

  }

  // @see com.aelitis.azureus.ui.swt.views.skin.sidebar.SideBarListener#sidebarItemSelected(com.aelitis.azureus.ui.swt.views.skin.sidebar.SideBarInfoSWT, com.aelitis.azureus.ui.swt.views.skin.sidebar.SideBarInfoSWT)
  public void mdiEntrySelected(MdiEntry newEntry,
      MdiEntry oldEntry) {
    if (newEntry == null) {
      return;
    }

    COConfigurationManager.setParameter("v3.StartTab",
        newEntry.getId());

    if (mapTrackUsage != null && oldEntry != null) {
      oldEntry.removeListener((MdiEntryLogIdListener) this);

      String id2 = null;
      MultipleDocumentInterface mdi = UIFunctionsManager.getUIFunctions().getMDI();
      if (mdi != null) {
        id2 = oldEntry.getLogID();
      }
      if (id2 == null) {
        id2 = oldEntry.getId();
      }

      updateMapTrackUsage(id2);
    }

    if (mapTrackUsage != null) {
      newEntry.addListener((MdiEntryLogIdListener) this);
    }
  }

  // @see com.aelitis.azureus.ui.swt.views.skin.sidebar.MdiLogIdListener#sidebarLogIdChanged(com.aelitis.azureus.ui.swt.views.skin.sidebar.SideBarEntrySWT, java.lang.String, java.lang.String)
  public void mdiEntryLogIdChanged(MdiEntry sideBarEntrySWT, String oldID,
      String newID) {
    if (oldID == null) {
      oldID = "null";
    }
    updateMapTrackUsage(oldID);
  }

  // @see org.gudy.azureus2.core3.util.AEDiagnosticsEvidenceGenerator#generate(org.gudy.azureus2.core3.util.IndentWriter)
  public void generate(IndentWriter writer) {
    writer.println("SWT UI");

    try {
      writer.indent();

      TableColumnManager.getInstance().generateDiagnostics(writer);
    } finally {

      writer.exdent();
    }
  }

  protected void setSelectedLanguageItem() {
    Messages.updateLanguageForControl(shell);

    if (systemTraySWT != null) {
      systemTraySWT.updateLanguage();
    }

    if (statusBar != null) {
      statusBar.refreshStatusText();
    }

    // download basket

    skin.triggerLanguageChange();

    if (statusBar != null) {
      statusBar.updateStatusText();
    }

    if (menu != null) {
      MenuFactory.updateMenuText(menu.getMenu(IMenuConstants.MENU_ID_MENU_BAR));
    }
  }

  protected IMainMenu getMainMenu() {
    return menu;
  }

  public void updateUI() {
    //if (shell != null) {
    //  Utils.setShellIcon(shell);
    //}
  }

  public String getUpdateUIName() {
    return "MainWindow";
  }

}
TOP

Related Classes of com.aelitis.azureus.ui.swt.shells.main.MainWindow

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.