package test;
/**
* <p>Title: Java JNI Skin Client</p>
* <p>Description: GTK based JNI classes for advanced UI design</p>
* <p>Copyright: Copyright (c) 2003</p>
* <p>Company: </p>
* @author Vladimir Silva
* @version 1.0
*/
import java.util.StringTokenizer;
import jni.skin.slik.*;
import jni.skin.slik.evt.*;
import jni.skin.slik.widget.*;
importjni.skin.util.Debug;
public final class SkinDemo implements
WindowEventListener, ButtonEventListener,
ListEventListener, DialEventListener,
SliderEventListener, MenuEventListener
{
// for debugging...
public static final String COMPONENT_NAME = "SkinDemo";
private GtkSkin skin = null;
private int skinHandle = -1;
private String skinPath = null;
private final String appID = "SkinDemo";
// debug
private int _debugJNI = GtkSkin.GTK_FALSE;
private boolean _debugJAVA = false;
// Some widgets
WList playList = null;
WNumber numSong = null;
WNumber totSong = null;
WDial position = null;
WSlider volume = null;
WMenu popup = null;
private void Usage() {
System.out.println("Usage:\n\tjava " + this.getClass().getName() + " -skin <PATH_TO_SKIN> [-debug jni,SinDemo,GimpSkin]");
System.out.println("\t<PATH_TO_SKIN> must be a directory.\n");
}
/*
* Parse cmd line args
*/
private boolean parseArgs(String[] args )
{
if ( args.length == 0 )
return false;
for (int i = 0; i < args.length; i++) {
// System.out.println("args[" + i + "]=" + args[i]);
if ( args[i].equalsIgnoreCase("-skin") ) {
skinPath = args[++i];
}
else if (args[i].equalsIgnoreCase("-debug") )
{
StringTokenizer st = new StringTokenizer(args[++i], ",");
// parse dbg flags
while (st.hasMoreTokens() ) {
String tok = st.nextToken();
// enable JNI debug
if ( tok.equalsIgnoreCase("jni") ) {
_debugJNI = GtkSkin.GTK_TRUE;
}
else {
// enable debug
Debug.addComponent(tok);
}
}
}
else {
return false;
}
}
return true;
}
/*
* Main function
*/
public SkinDemo(String[] args) throws GtkSkinException
{
if ( ! parseArgs(args) ) {
Usage();
System.exit(1);
}
// init gtk (create skin window) + JNI debug flag (TRUE/FALSE)
skin = new GtkSkin(appID, _debugJNI);
// Init all widgets: for skin demo purposes (Widgets typically initialized when needed...)
skin.initAllWidgets();
skinHandle = skin.getSkinHandle();
// Create and register some widgets
// See the SPEC file for details
// example: [button_exit], [list_playlist], [number_song], ....
// IMPORTANT: All widgets must exist in SPEC file
// Widget data (imgs, lbls, etc. are defined in the spec file
skin.registerWidget(new WText("title"), "Title goes here!");
skin.registerWidget(new WButton("exit"));
skin.registerWidget(new WButton("iconify"));
skin.registerWidget(new WButton( "play"));
skin.registerWidget(new WButton("pause"));
skin.registerWidget(new WButton("stop"));
skin.registerWidget(new WButton("prev"));
skin.registerWidget(new WButton("next"));
// listen for btn events
WButton.addButtonEventListener(this);
// more widgets (IMPORTANT All widgets must exist in SPEC file)
playList = new WList("playlist") ; //, skin.getSkinHandle());
playList.addListEventListener(this);
skin.registerWidget(playList);
numSong = new WNumber("song");
totSong = new WNumber("song_total");
skin.registerWidget(numSong, new Integer(10));
skin.registerWidget(totSong, new Integer( 5));
// dial widget
position = new WDial("position");
position.addDialListener(this);
skin.registerWidget(position);
// slider test
volume = new WSlider("volume");
volume.addSliderListener(this);
skin.registerWidget(volume);
// popup menu
String [] menus = {
"Menu 1" + WMenu.SUBMENU_DIVIDER + "S_ubmenu-11" + WMenu.SUBMENU_DIVIDER + "Submenu-12",
"Option2" + WMenu.SUBMENU_DIVIDER + "Option21" + WMenu.SUBMENU_DIVIDER + WMenu.MENU_DIVIDER + WMenu.SUBMENU_DIVIDER + "Option31" ,
WMenu.MENU_DIVIDER,
"option3",
"option4"
};
popup = new WMenu("popup", menus, skinHandle);
popup.addMenuListener(this);
skin.registerWidget(popup, menus);
/**
* Listen for Skin Window main evts: KeyPress, Mouse motion & Mouse BTN press
*/
skin.addWindowEventListener(this);
// load & show
skin.loadSkin(skinPath);
skin.show();
}
/*
* GimpWindow events
*/
public void OnKeypress(int keyval, int state, int time) {
Debug.debug(COMPONENT_NAME,"OnKeypress key val: " + keyval + " state:" + state + " time: " + time);
}
public void OnMouseMotion(int mousex , int mousey) {
// Debug.debug(COMPONENT_NAME,"OnMouseMotion x: " + mousex + " y: " + mousey);
}
public void OnMouseButtonPressed(int btn)
{
// Fires when mouse btn clicked...
Debug.debug(COMPONENT_NAME,"OnMouseButtonPressed btn: " + btn);
// popup main menu
popup.popup();
}
/*
* Button widgets evets: GimpButtonEventListener
*/
public void OnButonClicked(String buttonKey) {
/* Fires when any BTN is clicked */
Debug.debug(COMPONENT_NAME,"OnButonClicked key: " + buttonKey);
if ( buttonKey.equalsIgnoreCase("exit") ) {
skin.close();
GtkSkin.GTKQuit();
}
if ( buttonKey.equalsIgnoreCase("iconify") ) {
skin.iconify();
}
// demo: switch skin when play is pressed
if ( buttonKey.equalsIgnoreCase("play") )
skin.openSkinEditor();
if ( buttonKey.equalsIgnoreCase("pause") ) {
float pos1 = position.valueGet();
Debug.info(COMPONENT_NAME, "SkinDemo: Dial " + position.getKey()+ " value: " + pos1);
skin.spawnChild("AChild","skindata");
}
if ( buttonKey.equalsIgnoreCase("stop") ) {
// Insert some dummy vals into list
// Note: Keys are defined in SPEC file
String[] keys = {"title", "time"};
int x = (int)(100 * Math.random());
String[] vals = {"title-" + x , "time-" + x};
playList.rowInsert("playlist", keys , vals );
}
if ( buttonKey.equalsIgnoreCase("prev") ) {
skin.openSkinFileBrowser();
}
if ( buttonKey.equalsIgnoreCase("next") ) {
// set number widget vals...
numSong.valueSet((int)(Math.random() * 99));
totSong.valueSet(numSong.valueGet() + 5 );
}
}
public void OnDialDragged(String wkey, float value) {
System.out.println("SkinDemo: Dial dragged val: " + value);
}
public void OnSliderDragged(String wkey, float value) {
System.out.println("SkinDemo: Slider dragged val:" + value);
}
/*
* list evts: GimpListEventListener
*/
public void OnListClicked(String lkey, int row, int mousebtn) {
String val = playList.rowGetText(lkey, row, 1);
Debug.info(SkinDemo.COMPONENT_NAME, "key: " + lkey + " row: " + row + " btn: " + mousebtn + " val1: " + val);
}
/**
* Fires when a menu/popup is activated
* @param label Label of the menu activated
*/
public void OnMenu(String label) {
Debug.info(COMPONENT_NAME, "OnMenuClicked Label: " + label);
}
/**
* Main Sub
* @param args args
*/
public static void main(String[] args) {
try {
SkinDemo demo = new SkinDemo(args);
}
catch (Exception ex) {
ex.printStackTrace();
}
}
}
|
Return to article.