Package org.eclipse.swt.widgets

Source Code of org.eclipse.swt.widgets.Tree2

/**
* Created on May 12, 2010
*
* Copyright 2008 Vuze, Inc.  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; version 2 of the License only.
*
* 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
*/

package org.eclipse.swt.widgets;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

import org.gudy.azureus2.core3.util.Constants;

/**
* Windows specific hack to remove expando<P>
*
* This class can be safely excluded from non-Windows builds
*
* @author TuxPaper
* @created May 12, 2010
*
*/
public class Tree2
  extends Tree
{
  static final Map<Integer, Integer> mapStyleToWidgetStyle = new HashMap<Integer, Integer>(
      0);

  public Tree2(Composite parent, int style) {
    super(parent, style);
  }

  protected void checkSubclass() {
    // skip check
  }

  // @see org.eclipse.swt.widgets.Tree#createHandle()
  void createHandle() {
    // lucky for us, other platforms have a super.createHandle too
    super.createHandle();
    //if (explorerTheme) {
    //  int bits2 = (int)/*64*/OS.SendMessage (handle, OS.TVM_GETEXTENDEDSTYLE, 0, 0);
    //  bits2 &= ~OS.TVS_EX_FADEINOUTEXPANDOS;
    //  OS.SendMessage (handle, OS.TVM_SETEXTENDEDSTYLE, 0, bits2);
    //}

    try {
      Class<?> claOS = Class.forName("org.eclipse.swt.internal.win32.OS");

      int TVM_GETEXTENDEDSTYLE = ((Number) claOS.getField(
          "TVM_GETEXTENDEDSTYLE").get(null)).intValue();
      int TVM_SETEXTENDEDSTYLE = ((Number) claOS.getField(
          "TVM_SETEXTENDEDSTYLE").get(null)).intValue();
      int TVS_EX_FADEINOUTEXPANDOS = ((Number) claOS.getField(
          "TVS_EX_FADEINOUTEXPANDOS").get(null)).intValue();

      Field fldHandle = this.getClass().getField("handle");
      Class<?> handleType = fldHandle.getType();
      if (handleType == int.class) {
        Method methSendMessage = claOS.getMethod("SendMessage", int.class,
            int.class, int.class, int.class);
        Number nbits2 = (Number) methSendMessage.invoke(null,
            fldHandle.get(this), TVM_GETEXTENDEDSTYLE, 0, 0);
        int bits2 = nbits2.intValue() & (~TVS_EX_FADEINOUTEXPANDOS);

        methSendMessage.invoke(null, ((Number) fldHandle.get(this)).intValue(),
            TVM_SETEXTENDEDSTYLE, 0, bits2);
      } else {
        Method methSendMessage = claOS.getMethod("SendMessage", long.class,
            int.class, long.class, long.class);

        Number nbits2 = (Number) methSendMessage.invoke(null,
            fldHandle.get(this), TVM_GETEXTENDEDSTYLE, 0, 0);
        long bits2 = nbits2.longValue() & (~TVS_EX_FADEINOUTEXPANDOS);

        methSendMessage.invoke(null,
            ((Number) fldHandle.get(this)).longValue(), TVM_SETEXTENDEDSTYLE,
            0, bits2);
      }

    } catch (Throwable t) {
      t.printStackTrace();
    }
  }

  int widgetStyle() {
    /* I was going to go with this code, but OSX doesn't ahve widgetStyle,
        so compliling breaks on super call
    int oldStyle = super.widgetStyle();
    try {
      Class<?> claOS = Class.forName("org.eclipse.swt.internal.win32.OS");
      // & ~(OS.TVS_LINESATROOT | OS.TVS_HASBUTTONS)
      if (claOS != null) {
        int TVS_LINESATROOT = ((Number)claOS.getField("TVS_LINESATROOT").get(null)).intValue();
        int TVS_HASBUTTONS = ((Number)claOS.getField("TVS_HASBUTTONS").get(null)).intValue();
        oldStyle &= ~(TVS_HASBUTTONS | TVS_LINESATROOT);
      }
    } catch (Throwable e) {
    }
    return oldStyle;
    */

    if (!Constants.isWindows) {
      return 0;
    }

    try {
      Integer widgetStyle = mapStyleToWidgetStyle.get(style);
      if (widgetStyle != null) {
        return widgetStyle.intValue();
      }

      Tree tree = new Tree(parent, style);
      Method method = Tree.class.getDeclaredMethod("widgetStyle");
      method.setAccessible(true);
      int oldStyle = ((Number) method.invoke(tree)).intValue();
      tree.dispose();

      Class<?> claOS = Class.forName("org.eclipse.swt.internal.win32.OS");
      // & ~(OS.TVS_LINESATROOT | OS.TVS_HASBUTTONS)
      if (claOS != null) {
        int TVS_LINESATROOT = ((Number) claOS.getField("TVS_LINESATROOT").get(
            null)).intValue();
        int TVS_HASBUTTONS = ((Number) claOS.getField("TVS_HASBUTTONS").get(
            null)).intValue();
        oldStyle &= ~(TVS_HASBUTTONS | TVS_LINESATROOT);
      }
      mapStyleToWidgetStyle.put(style, oldStyle);
      return oldStyle;
    } catch (Throwable e) {
      e.printStackTrace();
    }

    return 0;
  }
}
TOP

Related Classes of org.eclipse.swt.widgets.Tree2

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.