/* * XCTrack - XContest Live Tracking client for J2ME devices * Copyright (C) 2009 Petr Chromec <petr@xcontest.org> * * 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 3 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, see <http://www.gnu.org/licenses/>. * */ package org.xcontest.xctrack.settings; import javax.microedition.lcdui.ChoiceGroup; import javax.microedition.lcdui.Command; import javax.microedition.lcdui.CommandListener; import javax.microedition.lcdui.Displayable; import javax.microedition.lcdui.Form; import javax.microedition.lcdui.Item; import javax.microedition.lcdui.ItemStateListener; import javax.microedition.lcdui.TextField; import org.xcontest.live.LoginDomain; import org.xcontest.live.TrackType; import org.xcontest.xctrack.App; import org.xcontest.xctrack.Util; import org.xcontest.xctrack.config.Config; public class ProfilePage implements ItemStateListener, CommandListener { Form _form; ChoiceGroup _choiceIsRegistered; Command _cmdSave; Command _cmdCancel; TextField _username; TextField _password; // ChoiceGroup _domain; TextField _firstname; TextField _surname; TextField _nickname; TextField _profileName; TextField _tracklogInterval; TextField _messageInterval; ChoiceGroup _trackType; LoginDomain[] _allDomains; TrackType[] _allTrackTypes; Profile[] _profiles; int _profileIdx; public ProfilePage(Profile[] profiles, int editIdx) { _profileIdx = editIdx; _profiles = profiles; createForm(); if (editIdx >= 0) set(profiles[editIdx]); else clear(); } private void createForm() { _choiceIsRegistered = new ChoiceGroup("Login",ChoiceGroup.EXCLUSIVE); _choiceIsRegistered.append("Anonymous", null); _choiceIsRegistered.append("XContest registered user", null); _choiceIsRegistered.setSelectedIndex(0,true); _profileName = new TextField("Profile","",64,TextField.ANY); _allDomains = LoginDomain.getAll(); _allTrackTypes = TrackType.getAll(); /* _domain = new ChoiceGroup("Domain",ChoiceGroup.POPUP); for (int i = 0; i < _allDomains.length; i ++) _domain.append(_allDomains[i].getName(), null); */ _username = new TextField("Username","",64,TextField.ANY); _password = new TextField("Password","",64,TextField.ANY | TextField.PASSWORD); _firstname = new TextField("Firstname","",64,TextField.ANY); _surname = new TextField("Surname","",64,TextField.ANY); _nickname = new TextField("Nickname","",64,TextField.ANY); _trackType = new ChoiceGroup("Track type",ChoiceGroup.POPUP); for (int i = 0; i < _allTrackTypes.length; i ++) _trackType.append(_allTrackTypes[i].getName(), null); _tracklogInterval = new TextField("Tracklog points interval (sec)","",8,TextField.DECIMAL); _messageInterval = new TextField("Position message interval (sec)","",8,TextField.NUMERIC); _cmdSave = new Command("Save",Command.OK, 1); _cmdCancel = new Command("Cancel",Command.BACK, 2); if (_profileIdx >= 0) _form = new Form("Settings / Profiles / " + _profiles[_profileIdx].getProfileName()); else _form = new Form("Settings / Profiles / New"); _form.setItemStateListener(this); _form.setCommandListener(this); _form.addCommand(_cmdSave); _form.addCommand(_cmdCancel); _form.append(_profileName); _form.append(_choiceIsRegistered); _form.append(_trackType); update(); } public void show() { App.showScreen(_form); } private void update() { boolean reg = _choiceIsRegistered.getSelectedIndex() == 1; while (_form.size() > 3) _form.delete(_form.size()-1); if (reg) { _form.append(_username); _form.append(_password); } else { _form.append(_firstname); _form.append(_surname); _form.append(_nickname); } _form.append("Transfer/performance properties"); _form.append(_tracklogInterval); _form.append(_messageInterval); } public void itemStateChanged(Item item) { if (item == _choiceIsRegistered) { update(); } } private String formatDouble(double d) { if (Math.floor(d) == d) return ""+(int)d; else return ""+d; } private void clear() { _choiceIsRegistered.setSelectedIndex(0, true); _username.setString(""); _password.setString(""); // _domain.setSelectedIndex(0, true); _firstname.setString(""); _surname.setString(""); _nickname.setString(""); _profileName.setString("My Profile"); _trackType.setSelectedIndex(_allTrackTypes.length-1, true); _tracklogInterval.setString(formatDouble(Profile.DEFAULT_TRACKLOG_INTERVAL)); _messageInterval.setString(""+(int)Profile.DEFAULT_MESSAGE_INTERVAL); } private void set(Profile p) { _choiceIsRegistered.setSelectedIndex(p.isAnonymous() ? 0 : 1, true); _username.setString(p.getUsername()); _password.setString(p.getPassword()); /* LoginDomain[] all = LoginDomain.getAll(); int domIdx = 0; for (int i = 0; i < all.length; i ++) { if (all[i].getValue().equals(p.getDomain())) { domIdx = i; break; } } _domain.setSelectedIndex(domIdx, true); */ _firstname.setString(p.getFirstname()); _surname.setString(p.getSurname()); _nickname.setString(p.getNickname()); _profileName.setString(p.getProfileName()); String tt = p.getTrackType(); for (int i = 0; i < _allTrackTypes.length; i ++) { if (i == _allTrackTypes.length-1 || tt.equals(_allTrackTypes[i].getValue())) { _trackType.setSelectedIndex(i, true); break; } } _tracklogInterval.setString(formatDouble(p.getTracklogInterval())); _messageInterval.setString(""+(int)p.getMessageInterval()); update(); } private Profile get() { Profile p = new Profile(); boolean isRegistered = _choiceIsRegistered.getSelectedIndex() != 0; if (isRegistered) { // p.setDomain(_allDomains[_domain.getSelectedIndex()].getValue()); p.setDomain(_allDomains[0].getValue()); p.setUsername(_username.getString()); p.setPassword(_password.getString()); } else { p.setFirstname(_firstname.getString()); p.setSurname(_surname.getString()); p.setNickname(_nickname.getString()); } p.setProfileName(_profileName.getString()); p.setTrackType(_allTrackTypes[_trackType.getSelectedIndex()].getValue()); p.setTracklogInterval(Double.parseDouble(_tracklogInterval.getString())); p.setMessageInterval(Double.parseDouble(_messageInterval.getString())); p.setAnonymous(!isRegistered); return p; } public void commandAction(Command cmd, Displayable disp) { if (cmd == _cmdSave) { Profile p = get(); // error checking if (p.getProfileName().equals("")) { Util.showError("Please enter profile name."); return; } for (int i = 0; i < _profiles.length; i ++) { if (i != _profileIdx && _profiles[i].getProfileName().equals(p.getProfileName())) { Util.showError("Profile with name '"+p.getProfileName()+"' already exists.\nPlease enter different name."); return; } } if (p.isAnonymous() && p.getNickname().equals("")) { Util.showError("Nickname is required for anonymous tracking.\nPlease enter your nickname."); return; } if (!p.isAnonymous() && p.getUsername().equals("")) { Util.showError("Username is required for registered user.\nPlease enter your username"); return; } if (!p.isAnonymous() && p.getPassword().equals("")) { Util.showError("Password is required for registered user.\nPlease enter your password"); return; } if (Config.isDebugMode()) { if (p.getTracklogInterval() < 0.001) { Util.showError("Tracklog points interval set too low - set to at least 0.001 (1000 points per second)"); return; } } else { if (p.getTracklogInterval() < 0.1) { Util.showError("Tracklog points interval set too low - set to at least 0.1 (10 points per second)"); return; } } if (p.getMessageInterval() < p.getTracklogInterval()) { Util.showError("Position message too low - set to value at least equal to tracklog points interval"); return; } // this ensures we can make it into 64kb position message if (p.getMessageInterval() > 500*p.getTracklogInterval()) { Util.showError("Position message send interval too high - maximum allowed value is 500times the tracklog points interval"); return; } if (_profileIdx < 0) { Profile[] newProfiles = new Profile[_profiles.length+1]; for (int i = 0; i < _profiles.length; i ++) newProfiles[i] = _profiles[i]; newProfiles[_profiles.length] = get(); _profiles = newProfiles; } else { _profiles[_profileIdx] = get(); } Config.setProfiles(_profiles); Config.writeAll(); App.hideScreen(_form); } else if (cmd == _cmdCancel) { App.hideScreen(_form); } } }