/** * Copyright (C) 2007 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 63.529,40 euros * 8 Allee Lenotre, La Grille Royale, 78600 Le Mesnil le Roi, France. * */ package com.aelitis.azureus.ui.swt.shells.uiswitcher; import java.util.ArrayList; import java.util.List; import org.eclipse.swt.SWT; import org.eclipse.swt.events.*; import org.eclipse.swt.graphics.*; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.*; import org.gudy.azureus2.core3.config.COConfigurationManager; import org.gudy.azureus2.core3.internat.MessageText; import org.gudy.azureus2.ui.swt.Messages; import org.gudy.azureus2.ui.swt.UISwitcherUtil; import org.gudy.azureus2.ui.swt.Utils; import org.gudy.azureus2.ui.swt.components.shell.ShellFactory; /** * @author TuxPaper * @created Feb 5, 2007 * */ public class UISwitcherWindow { private static String CFG_PREFIX = "window.uiswitcher."; private static String[] IDS = { "NewUI", "ClassicUI" }; private Shell shell; private Button btnOk; private int ui = -1; private List<Object> disposeList = new ArrayList<Object>(); public UISwitcherWindow() { this(false, true); } /** * */ public UISwitcherWindow(boolean standalone, final boolean allowCancel) { final String originalUIMode = UISwitcherUtil.calcUIMode(); try { final Button[] buttons = new Button[IDS.length]; GridData gd; int style = SWT.BORDER | SWT.TITLE | SWT.RESIZE; if (allowCancel) { style |= SWT.CLOSE; } shell = standalone ? new Shell(Display.getDefault(), style) : ShellFactory.createShell((Shell) null, style); shell.setText(MessageText.getString(CFG_PREFIX + "title")); Utils.setShellIcon(shell); shell.addDisposeListener(new DisposeListener() { public void widgetDisposed(DisposeEvent e) { Utils.disposeSWTObjects(disposeList); if (ui == 0) { // Full AZ3UI COConfigurationManager.setParameter("ui", "az3"); } else if (ui == 1) { COConfigurationManager.setParameter("ui", "az2"); } if (ui != -1) { COConfigurationManager.setParameter("ui.asked", true); UISwitcherUtil.triggerListeners(UISwitcherUtil.calcUIMode()); } } }); GridLayout layout = new GridLayout(); layout.horizontalSpacing = 0; layout.marginWidth = 5; layout.marginHeight = 0; layout.verticalSpacing = 1; shell.setLayout(layout); Label title = new Label(shell, SWT.WRAP); gd = new GridData(GridData.FILL_HORIZONTAL); gd.verticalIndent = 3; title.setLayoutData(gd); Messages.setLanguageText(title, CFG_PREFIX + "text"); Listener radioListener = new Listener() { public void handleEvent(Event event) { int idx; if (event.widget instanceof Composite) { Long l = (Long) event.widget.getData("INDEX"); idx = l.intValue(); } else { Composite c = ((Control) event.widget).getParent(); Long l = (Long) c.getData("INDEX"); idx = l.intValue(); } for (int i = 0; i < buttons.length; i++) { boolean selected = idx == i; Composite c = buttons[i].getParent(); c.setBackground( selected ? c.getDisplay().getSystemColor( SWT.COLOR_LIST_SELECTION) : null); Color fg = selected ? c.getDisplay().getSystemColor( SWT.COLOR_LIST_SELECTION_TEXT) : null; Control[] children = c.getChildren(); for (int j = 0; j < children.length; j++) { Control control = children[j]; control.setForeground(fg); } buttons[i].setSelection(selected); } } }; FontData[] fontData = shell.getFont().getFontData(); fontData[0].setHeight((int) (fontData[0].getHeight() * 1.5)); fontData[0].setStyle(SWT.BOLD); final Font headerFont = new Font(shell.getDisplay(), fontData); disposeList.add(headerFont); Composite cCenter = new Composite(shell, SWT.NONE); cCenter.setLayout(new GridLayout()); cCenter.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_CENTER)); for (int i = 0; i < IDS.length; i++) { final Composite c = new Composite(cCenter, SWT.NONE); c.setBackgroundMode(SWT.INHERIT_DEFAULT); gd = new GridData(GridData.FILL_HORIZONTAL); gd.verticalIndent = 0; c.setLayoutData(gd); GridLayout gridLayout = new GridLayout(1, false); gridLayout.horizontalSpacing = 0; gridLayout.marginWidth = 5; gridLayout.marginHeight = 3; gridLayout.verticalSpacing = 0; c.setLayout(gridLayout); c.setData("INDEX", new Long(i)); c.addListener(SWT.MouseDown, radioListener); buttons[i] = new Button(c, SWT.RADIO); buttons[i].setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL)); Messages.setLanguageText(buttons[i], CFG_PREFIX + IDS[i] + ".title"); buttons[i].setData("INDEX", new Long(i)); buttons[i].addListener(SWT.Selection, radioListener); buttons[i].setFont(headerFont); buttons[i].addTraverseListener(new TraverseListener() { public void keyTraversed(TraverseEvent e) { if (e.detail == SWT.TRAVERSE_ARROW_NEXT) { e.doit = true; e.detail = SWT.TRAVERSE_TAB_NEXT; } else if (e.detail == SWT.TRAVERSE_ARROW_PREVIOUS) { e.detail = SWT.TRAVERSE_TAB_PREVIOUS; e.doit = true; } else if (e.detail == SWT.TRAVERSE_TAB_NEXT || e.detail == SWT.TRAVERSE_TAB_PREVIOUS) { btnOk.setFocus(); e.doit = false; } else if (e.detail == SWT.TRAVERSE_RETURN) { e.doit = true; } else if (e.detail == SWT.TRAVERSE_ESCAPE) { e.doit = false; if (allowCancel) { ui = -1; shell.dispose(); } } else { e.doit = false; } } }); buttons[i].addListener(SWT.KeyDown, new Listener() { // @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event) public void handleEvent(Event event) { if (event.keyCode == SWT.ARROW_UP) { shell.getDisplay().getFocusControl().traverse( SWT.TRAVERSE_ARROW_PREVIOUS); } else if (event.keyCode == SWT.ARROW_DOWN) { shell.getDisplay().getFocusControl().traverse( SWT.TRAVERSE_ARROW_NEXT); } } }); Label info = new Label(c, SWT.WRAP); gd = new GridData(GridData.FILL_BOTH); gd.horizontalIndent = 20; gd.verticalAlignment = SWT.TOP; info.setLayoutData(gd); Messages.setLanguageText(info, CFG_PREFIX + IDS[i] + ".text"); info.addListener(SWT.MouseDown, radioListener); } Event eventSelectFirst = new Event(); eventSelectFirst.widget = buttons[0]; radioListener.handleEvent(eventSelectFirst); Composite cBottom = new Composite(shell, SWT.NONE); layout = new GridLayout(1, false); layout.marginHeight = 0; layout.marginWidth = 0; cBottom.setLayout(layout); cBottom.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_CENTER)); btnOk = new Button(cBottom, SWT.PUSH); Messages.setLanguageText(btnOk, "Button.ok"); shell.setDefaultButton(btnOk); btnOk.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { for (int i = 0; i < buttons.length; i++) { if (buttons[i].getSelection()) { ui = i; break; } } shell.dispose(); } }); gd = new GridData(GridData.HORIZONTAL_ALIGN_END); btnOk.setLayoutData(gd); shell.addTraverseListener(new TraverseListener() { public void keyTraversed(TraverseEvent e) { if (e.detail == SWT.TRAVERSE_ESCAPE) { shell.dispose(); e.doit = false; return; } e.doit = true; } }); Point point = shell.computeSize(400, SWT.DEFAULT); shell.setSize(point); Utils.centreWindow(shell); } catch (Exception e) { e.printStackTrace(); } } public void open() { shell.open(); } public static void main(String[] args) { Display display = Display.getDefault(); UISwitcherWindow window = new UISwitcherWindow(true, true); window.open(); Shell shell = window.shell; while (!shell.isDisposed()) { if (!shell.getDisplay().readAndDispatch()) { shell.getDisplay().sleep(); } } System.out.println(window.ui); } }