mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-17 03:08:02 +00:00
Huge cleanup of gui and desktop code
- Remove lots of unused classes and methods - Remove code related to transitioning deck format - Refactor some interface structures - General cleanup (imports, indentation etc.) thanks to Eclipse - Some very minor bugfixes
This commit is contained in:
28
.gitattributes
vendored
28
.gitattributes
vendored
@@ -786,18 +786,11 @@ forge-gui-desktop/src/main/config/forge.sh -text
|
||||
forge-gui-desktop/src/main/config/forge_checks.xml -text
|
||||
forge-gui-desktop/src/main/config/support/dmg-license.py -text
|
||||
forge-gui-desktop/src/main/config/support/template.applescript -text
|
||||
forge-gui-desktop/src/main/html/connectionTest.html -text
|
||||
forge-gui-desktop/src/main/html/css/core.css -text
|
||||
forge-gui-desktop/src/main/html/js/jquery/jquery-1.9.1.js -text
|
||||
forge-gui-desktop/src/main/html/js/jquery/jquery-1.9.1.min.js -text
|
||||
forge-gui-desktop/src/main/html/js/observable.js -text
|
||||
forge-gui-desktop/src/main/html/js/socket.js -text
|
||||
forge-gui-desktop/src/main/java/forge/GuiDesktop.java -text
|
||||
forge-gui-desktop/src/main/java/forge/ImageCache.java -text
|
||||
forge-gui-desktop/src/main/java/forge/ImageLoader.java -text
|
||||
forge-gui-desktop/src/main/java/forge/Singletons.java -text
|
||||
forge-gui-desktop/src/main/java/forge/control/FControl.java -text
|
||||
forge-gui-desktop/src/main/java/forge/control/GuiTimer.java -text
|
||||
forge-gui-desktop/src/main/java/forge/control/KeyboardShortcuts.java -text
|
||||
forge-gui-desktop/src/main/java/forge/control/RestartUtil.java -text
|
||||
forge-gui-desktop/src/main/java/forge/control/package-info.java -text
|
||||
@@ -818,7 +811,6 @@ forge-gui-desktop/src/main/java/forge/gui/CardListViewer.java -text
|
||||
forge-gui-desktop/src/main/java/forge/gui/CardPicturePanel.java -text
|
||||
forge-gui-desktop/src/main/java/forge/gui/DualListBox.java -text
|
||||
forge-gui-desktop/src/main/java/forge/gui/FNetOverlay.java -text
|
||||
forge-gui-desktop/src/main/java/forge/gui/ForgeAction.java -text
|
||||
forge-gui-desktop/src/main/java/forge/gui/GuiChoose.java -text
|
||||
forge-gui-desktop/src/main/java/forge/gui/GuiDialog.java -text
|
||||
forge-gui-desktop/src/main/java/forge/gui/GuiProgressBarWindow.java -text
|
||||
@@ -838,7 +830,6 @@ forge-gui-desktop/src/main/java/forge/gui/framework/DragTab.java -text
|
||||
forge-gui-desktop/src/main/java/forge/gui/framework/EDocID.java -text
|
||||
forge-gui-desktop/src/main/java/forge/gui/framework/FScreen.java -text
|
||||
forge-gui-desktop/src/main/java/forge/gui/framework/ICDoc.java -text
|
||||
forge-gui-desktop/src/main/java/forge/gui/framework/IDocIdList.java -text
|
||||
forge-gui-desktop/src/main/java/forge/gui/framework/ILocalRepaint.java -text
|
||||
forge-gui-desktop/src/main/java/forge/gui/framework/IVDoc.java -text
|
||||
forge-gui-desktop/src/main/java/forge/gui/framework/IVTopLevelUI.java -text
|
||||
@@ -874,7 +865,6 @@ forge-gui-desktop/src/main/java/forge/itemmanager/filters/DeckFormatFilter.java
|
||||
forge-gui-desktop/src/main/java/forge/itemmanager/filters/DeckQuestWorldFilter.java -text
|
||||
forge-gui-desktop/src/main/java/forge/itemmanager/filters/DeckSearchFilter.java -text
|
||||
forge-gui-desktop/src/main/java/forge/itemmanager/filters/DeckSetFilter.java -text
|
||||
forge-gui-desktop/src/main/java/forge/itemmanager/filters/DeckStatTypeFilter.java -text
|
||||
forge-gui-desktop/src/main/java/forge/itemmanager/filters/FormatFilter.java -text
|
||||
forge-gui-desktop/src/main/java/forge/itemmanager/filters/ItemFilter.java -text
|
||||
forge-gui-desktop/src/main/java/forge/itemmanager/filters/ListLabelFilter.java -text
|
||||
@@ -938,7 +928,6 @@ forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VStatistics.java
|
||||
forge-gui-desktop/src/main/java/forge/screens/home/CHomeUI.java -text
|
||||
forge-gui-desktop/src/main/java/forge/screens/home/CLobby.java -text
|
||||
forge-gui-desktop/src/main/java/forge/screens/home/EMenuGroup.java -text
|
||||
forge-gui-desktop/src/main/java/forge/screens/home/EMenuItem.java -text
|
||||
forge-gui-desktop/src/main/java/forge/screens/home/IVSubmenu.java -text
|
||||
forge-gui-desktop/src/main/java/forge/screens/home/LblGroup.java -text
|
||||
forge-gui-desktop/src/main/java/forge/screens/home/LblHeader.java -text
|
||||
@@ -973,7 +962,6 @@ forge-gui-desktop/src/main/java/forge/screens/home/quest/DialogChooseSets.java -
|
||||
forge-gui-desktop/src/main/java/forge/screens/home/quest/PnlDraftEvent.java -text
|
||||
forge-gui-desktop/src/main/java/forge/screens/home/quest/PnlEvent.java -text
|
||||
forge-gui-desktop/src/main/java/forge/screens/home/quest/QuestFileLister.java -text
|
||||
forge-gui-desktop/src/main/java/forge/screens/home/quest/QuestPreferencesHandler.java -text
|
||||
forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuChallenges.java -text
|
||||
forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuDuels.java -text
|
||||
forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestData.java -text
|
||||
@@ -1104,13 +1092,11 @@ forge-gui-desktop/src/main/java/forge/toolbox/ToolTipListener.java -text
|
||||
forge-gui-desktop/src/main/java/forge/toolbox/imaging/FImagePanel.java -text
|
||||
forge-gui-desktop/src/main/java/forge/toolbox/imaging/FImageUtil.java -text
|
||||
forge-gui-desktop/src/main/java/forge/toolbox/package-info.java -text
|
||||
forge-gui-desktop/src/main/java/forge/toolbox/special/CardViewer.java -text
|
||||
forge-gui-desktop/src/main/java/forge/toolbox/special/CardZoomer.java -text
|
||||
forge-gui-desktop/src/main/java/forge/toolbox/special/PhaseIndicator.java -text
|
||||
forge-gui-desktop/src/main/java/forge/toolbox/special/PhaseLabel.java -text
|
||||
forge-gui-desktop/src/main/java/forge/toolbox/special/PlayerDetailsPanel.java -text
|
||||
forge-gui-desktop/src/main/java/forge/toolbox/special/package-info.java -text
|
||||
forge-gui-desktop/src/main/java/forge/util/AwtUtil.java -text
|
||||
forge-gui-desktop/src/main/java/forge/view/FDialog.java -text
|
||||
forge-gui-desktop/src/main/java/forge/view/FFrame.java -text
|
||||
forge-gui-desktop/src/main/java/forge/view/FNavigationBar.java -text
|
||||
@@ -1128,7 +1114,6 @@ forge-gui-desktop/src/main/java/forge/view/arcane/FloatingCardArea.java -text
|
||||
forge-gui-desktop/src/main/java/forge/view/arcane/HandArea.java -text
|
||||
forge-gui-desktop/src/main/java/forge/view/arcane/PlayArea.java -text
|
||||
forge-gui-desktop/src/main/java/forge/view/arcane/ScaledImagePanel.java -text
|
||||
forge-gui-desktop/src/main/java/forge/view/arcane/ViewPanel.java -text
|
||||
forge-gui-desktop/src/main/java/forge/view/arcane/package-info.java -text
|
||||
forge-gui-desktop/src/main/java/forge/view/arcane/util/Animation.java -text
|
||||
forge-gui-desktop/src/main/java/forge/view/arcane/util/CardPanelMouseAdapter.java -text
|
||||
@@ -1136,7 +1121,6 @@ forge-gui-desktop/src/main/java/forge/view/arcane/util/CardPanelMouseListener.ja
|
||||
forge-gui-desktop/src/main/java/forge/view/arcane/util/OutlinedLabel.java -text
|
||||
forge-gui-desktop/src/main/java/forge/view/arcane/util/package-info.java -text
|
||||
forge-gui-desktop/src/main/java/forge/view/package-info.java -text
|
||||
forge-gui-desktop/src/site/apt/index.apt -text
|
||||
forge-gui-desktop/src/test/java/forge/BoosterDraft1Test.java -text
|
||||
forge-gui-desktop/src/test/java/forge/BoosterDraftTest.java -text
|
||||
forge-gui-desktop/src/test/java/forge/GuiDownloadPicturesLQTest.java -text
|
||||
@@ -1228,7 +1212,6 @@ forge-gui-mobile/src/forge/animation/ForgeAnimation.java -text
|
||||
forge-gui-mobile/src/forge/animation/ForgeTransition.java -text
|
||||
forge-gui-mobile/src/forge/animation/GifAnimation.java -text
|
||||
forge-gui-mobile/src/forge/animation/GifDecoder.java -text
|
||||
forge-gui-mobile/src/forge/animation/GuiTimer.java -text
|
||||
forge-gui-mobile/src/forge/assets/AssetsDownloader.java -text
|
||||
forge-gui-mobile/src/forge/assets/BitmapFontWriter.java -text
|
||||
forge-gui-mobile/src/forge/assets/FBufferedImage.java -text
|
||||
@@ -17609,7 +17592,6 @@ forge-gui/src/main/java/forge/deck/DeckgenUtil.java -text
|
||||
forge-gui/src/main/java/forge/deck/NetDeckCategory.java -text
|
||||
forge-gui/src/main/java/forge/deck/RandomDeckGenerator.java -text
|
||||
forge-gui/src/main/java/forge/deck/io/DeckPreferences.java -text
|
||||
forge-gui/src/main/java/forge/deck/io/OldDeckParser.java -text
|
||||
forge-gui/src/main/java/forge/download/GuiDownloadPicturesLQ.java -text
|
||||
forge-gui/src/main/java/forge/download/GuiDownloadPrices.java -text
|
||||
forge-gui/src/main/java/forge/download/GuiDownloadQuestImages.java -text
|
||||
@@ -17631,17 +17613,17 @@ forge-gui/src/main/java/forge/gauntlet/GauntletWinLoseController.java -text
|
||||
forge-gui/src/main/java/forge/interfaces/IButton.java -text
|
||||
forge-gui/src/main/java/forge/interfaces/ICheckBox.java -text
|
||||
forge-gui/src/main/java/forge/interfaces/IComboBox.java -text
|
||||
forge-gui/src/main/java/forge/interfaces/IComponent.java -text
|
||||
forge-gui/src/main/java/forge/interfaces/IDevModeCheats.java -text
|
||||
forge-gui/src/main/java/forge/interfaces/IDeviceAdapter.java -text
|
||||
forge-gui/src/main/java/forge/interfaces/IGameController.java -text
|
||||
forge-gui/src/main/java/forge/interfaces/IGuiBase.java -text
|
||||
forge-gui/src/main/java/forge/interfaces/IGuiGame.java -text
|
||||
forge-gui/src/main/java/forge/interfaces/IGuiTimer.java -text
|
||||
forge-gui/src/main/java/forge/interfaces/ILobby.java -text
|
||||
forge-gui/src/main/java/forge/interfaces/ILobbyListener.java -text
|
||||
forge-gui/src/main/java/forge/interfaces/IMayViewCards.java -text
|
||||
forge-gui/src/main/java/forge/interfaces/IPlayerChangeListener.java -text
|
||||
forge-gui/src/main/java/forge/interfaces/IProgressBar.java -text
|
||||
forge-gui/src/main/java/forge/interfaces/ITextComponent.java -text
|
||||
forge-gui/src/main/java/forge/interfaces/ITextField.java -text
|
||||
forge-gui/src/main/java/forge/interfaces/IUpdateable.java -text
|
||||
forge-gui/src/main/java/forge/interfaces/IWinLoseView.java -text
|
||||
@@ -17682,8 +17664,6 @@ forge-gui/src/main/java/forge/match/HostedMatch.java -text
|
||||
forge-gui/src/main/java/forge/match/LobbySlot.java -text
|
||||
forge-gui/src/main/java/forge/match/LobbySlotType.java -text
|
||||
forge-gui/src/main/java/forge/match/LocalLobby.java -text
|
||||
forge-gui/src/main/java/forge/match/MatchButtonType.java -text
|
||||
forge-gui/src/main/java/forge/match/MatchConstants.java -text
|
||||
forge-gui/src/main/java/forge/match/NextGameDecision.java -text
|
||||
forge-gui/src/main/java/forge/match/input/Input.java -text
|
||||
forge-gui/src/main/java/forge/match/input/InputAttack.java -text
|
||||
@@ -17712,10 +17692,8 @@ forge-gui/src/main/java/forge/model/CardBlock.java -text
|
||||
forge-gui/src/main/java/forge/model/CardCollections.java -text
|
||||
forge-gui/src/main/java/forge/model/FModel.java svneol=native#text/plain
|
||||
forge-gui/src/main/java/forge/model/MetaSet.java -text
|
||||
forge-gui/src/main/java/forge/model/MultipleForgeJarsFoundError.java -text
|
||||
forge-gui/src/main/java/forge/model/UnOpenedMeta.java -text
|
||||
forge-gui/src/main/java/forge/model/package-info.java svneol=native#text/plain
|
||||
forge-gui/src/main/java/forge/net/GameProtocol.java -text
|
||||
forge-gui/src/main/java/forge/net/GameProtocolHandler.java -text
|
||||
forge-gui/src/main/java/forge/net/GameProtocolSender.java -text
|
||||
forge-gui/src/main/java/forge/net/IRemote.java -text
|
||||
@@ -17769,8 +17747,6 @@ forge-gui/src/main/java/forge/player/TargetSelection.java -text
|
||||
forge-gui/src/main/java/forge/player/package-info.java -text
|
||||
forge-gui/src/main/java/forge/properties/ForgeConstants.java -text
|
||||
forge-gui/src/main/java/forge/properties/ForgePreferences.java svneol=native#text/plain
|
||||
forge-gui/src/main/java/forge/properties/Preferences.java svneol=native#text/plain
|
||||
forge-gui/src/main/java/forge/properties/SavePreferencesListener.java svneol=native#text/plain
|
||||
forge-gui/src/main/java/forge/properties/package-info.java svneol=native#text/plain
|
||||
forge-gui/src/main/java/forge/quest/BoosterUtils.java svneol=native#text/plain
|
||||
forge-gui/src/main/java/forge/quest/IQuestRewardCard.java -text
|
||||
|
||||
@@ -6,35 +6,31 @@
|
||||
* 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 forge.util.storage;
|
||||
|
||||
import com.google.common.base.Predicate;
|
||||
import forge.util.IHasName;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
/**
|
||||
* TODO: Write javadoc for this type.
|
||||
*
|
||||
* @param <T> the generic type
|
||||
*/
|
||||
import com.google.common.base.Predicate;
|
||||
|
||||
import forge.util.IHasName;
|
||||
|
||||
public interface IStorage<T> extends Iterable<T>, IHasName {
|
||||
T get(final String name);
|
||||
T find(final Predicate<T> condition);
|
||||
T get(String name);
|
||||
T find(Predicate<T> condition);
|
||||
Collection<String> getItemNames();
|
||||
boolean contains(final String name);
|
||||
boolean contains(String name);
|
||||
int size();
|
||||
void add(final T deck);
|
||||
void delete(final String deckName);
|
||||
void add(T item);
|
||||
void delete(String deckName);
|
||||
IStorage<IStorage<T>> getFolders();
|
||||
IStorage<T> tryGetFolder(String path);
|
||||
IStorage<T> getFolderOrCreate(String path);
|
||||
|
||||
@@ -1,100 +0,0 @@
|
||||
<html>
|
||||
<head>
|
||||
<title>Tail-based by Web Sockets</title>
|
||||
|
||||
|
||||
<link href="css/core.css" media="all" rel="stylesheet" type="text/css" />
|
||||
<script type="text/javascript" src="js/jquery/jquery-1.9.1.min.js"></script>
|
||||
<script type="text/javascript" src="js/observable.js"></script>
|
||||
<script type="text/javascript" src="js/socket.js"></script>
|
||||
<script type='text/javascript' src="js/main.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div class="wrap">
|
||||
<div class="title">
|
||||
<span>Your server: <b>ws://</b></span>
|
||||
<input id="ws_uri" type="text" value="localhost:81/" name="uri"/>
|
||||
<button id="connect" name="connect" class="cn">Connect</button>
|
||||
<button id="disconn" name="disconn" class="dc" disabled="disabled">Disconnect</button>
|
||||
</div>
|
||||
<ul class="messages" id='messages'></ul>
|
||||
<div class="packets" id='input'>
|
||||
<span>Raw text to send:</span>
|
||||
<input type="text" name="packet" value="" />
|
||||
<button id="send" class="send">Send</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script type="text/javascript">
|
||||
if (!window.WebSocket)
|
||||
alert("WebSocket not supported by this browser");
|
||||
|
||||
var server = Socket();
|
||||
var listener = {
|
||||
onOpen : function() {
|
||||
$('#input').slideDown();
|
||||
},
|
||||
|
||||
onMessage : function(m) {
|
||||
if (m.data) {
|
||||
addLi("incoming", m.data);
|
||||
}
|
||||
},
|
||||
|
||||
onClose : function(m) {
|
||||
addLi("error", "Connection was closed (" + m.code + "): " + m.reason);
|
||||
onDisconnectClicked();
|
||||
$('#input').fadeOut();
|
||||
}
|
||||
};
|
||||
server.addObserver(listener);
|
||||
|
||||
function addLi(className, text) {
|
||||
var spanText = document.createElement('li');
|
||||
spanText.className = className;
|
||||
spanText.innerHTML = text;
|
||||
var messageBox = $('#messages')[0];
|
||||
messageBox.appendChild(spanText);
|
||||
messageBox.scrollTop = messageBox.scrollHeight - messageBox.clientHeight;
|
||||
}
|
||||
|
||||
function onConnectClicked() {
|
||||
var uri = $("#ws_uri").val()
|
||||
addLi("connecting", "Connecting to ws://" + uri + " ..." )
|
||||
server.connect(uri);
|
||||
$('#connect').attr("disabled", "disabled")
|
||||
$('#disconn').removeAttr("disabled")
|
||||
|
||||
}
|
||||
|
||||
function onDisconnectClicked() {
|
||||
server.close();
|
||||
$('#disconn').attr("disabled", "disabled")
|
||||
$('#connect').removeAttr("disabled")
|
||||
|
||||
}
|
||||
|
||||
function onSendClicked() {
|
||||
var toSend = $("#input input").val();
|
||||
$("#input input").val("");
|
||||
addLi("outcoming", toSend);
|
||||
server.send(toSend)
|
||||
}
|
||||
|
||||
function onInputKey(event) {
|
||||
if( event.keyCode == 13 )
|
||||
onSendClicked();
|
||||
}
|
||||
|
||||
function onReady() {
|
||||
$('#connect').on("click", onConnectClicked);
|
||||
$('#disconn').on("click", onDisconnectClicked);
|
||||
$('#send').on("click", onSendClicked);
|
||||
$("#input input").on("keypress", onInputKey);
|
||||
}
|
||||
|
||||
$(onReady)
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,23 +0,0 @@
|
||||
ul, ol { margin: 0; }
|
||||
|
||||
div { border: 0px solid black; }
|
||||
div.wrap { width: 640px; margin: 100px auto;}
|
||||
|
||||
.title { height: 24px; background-color: #ddd; padding: 4px; border: 1px solid black; border-bottom: 0px }
|
||||
.title input {width: 300px; }
|
||||
.title span { display: inline-block; width: 120px; text-align: right; }
|
||||
|
||||
.messages { height: 30ex; overflow: auto; background-color: #fff; padding: 4px; border: 1px solid black; list-style: none; }
|
||||
.messages .incoming { color: #006; }
|
||||
.messages .incoming:before { content: "<< "}
|
||||
.messages .outcoming { color: #060; }
|
||||
.messages .outcoming:before { content: ">> "}
|
||||
.messages .error { color: #600; }
|
||||
.messages li:nth-child(2n) { background-color: #f7f7f7; }
|
||||
|
||||
.packets { padding: 4px; background-color: #ddd; border: 1px solid black; border-top: 0px; display: none; }
|
||||
.packets span { display: inline-block; width: 120px; text-align: right; }
|
||||
.packets input {width: 400px; }
|
||||
.packets button { width: 100px; }
|
||||
|
||||
span.alert { font-style: italic; }
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
@@ -1,23 +0,0 @@
|
||||
var Observable = function(eventNames) {
|
||||
var _t = {};
|
||||
var observers = {};
|
||||
|
||||
_t.addObserver = function(obj) {
|
||||
for(var i = 0; i < eventNames.length; i++) {
|
||||
var evName = eventNames[i]
|
||||
var method = obj["on" + evName];
|
||||
if( typeof(method) === 'function') {
|
||||
var handlers = observers[evName]
|
||||
if( 'undefined' === typeof(handler))
|
||||
handlers = observers[evName] = [];
|
||||
handlers.push(obj);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
_t.fireEvent = function() { // usually invoked as .apply(EventName, args)
|
||||
var q = observers[this]
|
||||
if ( q ) for( var i = 0; i < q.length; i++ ) q[i]['on'+ this].apply(q[i], arguments);
|
||||
}
|
||||
return _t;
|
||||
}
|
||||
@@ -1,27 +0,0 @@
|
||||
|
||||
// There should be some kind of fallback to Flash-powered sockets (IE 9-, Opera with sockets switched off)
|
||||
var Socket = function() {
|
||||
var _t = Observable(["Open", "Message", "Close", "Error"]);
|
||||
|
||||
function onOpen() { _t.fireEvent.apply("Open", arguments); }
|
||||
function onClose() { _t.fireEvent.apply("Close", arguments); }
|
||||
function onError() { _t.fireEvent.apply("Error", arguments); }
|
||||
function onMessage() { _t.fireEvent.apply("Message", arguments); }
|
||||
|
||||
var ws;
|
||||
_t.connect = function(location) {
|
||||
ws = new WebSocket("ws://" + location);
|
||||
ws.onopen = onOpen;
|
||||
ws.onmessage = onMessage;
|
||||
ws.onclose = onClose;
|
||||
ws.onerror = onError;
|
||||
}
|
||||
|
||||
// _t.getWs = function() { return ws; }
|
||||
_t.isOpen = function() { return ws && ws.readyState == ws.OPEN; }
|
||||
_t.close = function() { ws && ws.close(); }
|
||||
_t.send = function(text) { text != null && text.length > 0 && ws && ws.send(text); };
|
||||
|
||||
return _t;
|
||||
};
|
||||
|
||||
@@ -23,7 +23,6 @@ import com.google.common.base.Function;
|
||||
|
||||
import forge.assets.FSkinProp;
|
||||
import forge.assets.ISkinImage;
|
||||
import forge.control.GuiTimer;
|
||||
import forge.download.GuiDownloadService;
|
||||
import forge.download.GuiDownloader;
|
||||
import forge.error.BugReportDialog;
|
||||
@@ -33,7 +32,6 @@ import forge.gui.GuiChoose;
|
||||
import forge.gui.framework.FScreen;
|
||||
import forge.interfaces.IGuiBase;
|
||||
import forge.interfaces.IGuiGame;
|
||||
import forge.interfaces.IGuiTimer;
|
||||
import forge.item.PaperCard;
|
||||
import forge.match.HostedMatch;
|
||||
import forge.model.FModel;
|
||||
@@ -70,7 +68,7 @@ public class GuiDesktop implements IGuiBase {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void invokeInEdtLater(Runnable proc) {
|
||||
public void invokeInEdtLater(final Runnable proc) {
|
||||
SwingUtilities.invokeLater(proc);
|
||||
}
|
||||
|
||||
@@ -99,28 +97,23 @@ public class GuiDesktop implements IGuiBase {
|
||||
}
|
||||
|
||||
@Override
|
||||
public IGuiTimer createGuiTimer(Runnable proc, int interval) {
|
||||
return new GuiTimer(proc, interval);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ISkinImage getSkinIcon(FSkinProp skinProp) {
|
||||
public ISkinImage getSkinIcon(final FSkinProp skinProp) {
|
||||
if (skinProp == null) { return null; }
|
||||
return FSkin.getIcon(skinProp);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ISkinImage getUnskinnedIcon(String path) {
|
||||
public ISkinImage getUnskinnedIcon(final String path) {
|
||||
return new FSkin.UnskinnedIcon(path);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ISkinImage getCardArt(PaperCard card) {
|
||||
public ISkinImage getCardArt(final PaperCard card) {
|
||||
return null; //TODO
|
||||
}
|
||||
|
||||
@Override
|
||||
public ISkinImage createLayeredImage(FSkinProp background, String overlayFilename, float opacity) {
|
||||
public ISkinImage createLayeredImage(final FSkinProp background, final String overlayFilename, final float opacity) {
|
||||
final BufferedImage image = new BufferedImage(background.getWidth(), background.getHeight(), BufferedImage.TYPE_INT_ARGB);
|
||||
final Graphics2D g = image.createGraphics();
|
||||
final FSkin.SkinImage backgroundImage = FSkin.getImage(background);
|
||||
@@ -134,17 +127,17 @@ public class GuiDesktop implements IGuiBase {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void showImageDialog(ISkinImage image, String message, String title) {
|
||||
public void showImageDialog(final ISkinImage image, final String message, final String title) {
|
||||
FOptionPane.showMessageDialog(message, title, (SkinImage)image);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int showOptionDialog(String message, String title, FSkinProp icon, String[] options, int defaultOption) {
|
||||
public int showOptionDialog(final String message, final String title, final FSkinProp icon, final String[] options, final int defaultOption) {
|
||||
return FOptionPane.showOptionDialog(message, title, icon == null ? null : FSkin.getImage(icon), options, defaultOption);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String showInputDialog(String message, String title, FSkinProp icon, String initialInput, String[] inputOptions) {
|
||||
public String showInputDialog(final String message, final String title, final FSkinProp icon, final String initialInput, final String[] inputOptions) {
|
||||
return FOptionPane.showInputDialog(message, title, icon == null ? null : FSkin.getImage(icon), initialInput, inputOptions);
|
||||
}
|
||||
|
||||
@@ -192,7 +185,7 @@ public class GuiDesktop implements IGuiBase {
|
||||
}
|
||||
|
||||
@Override
|
||||
public String showFileDialog(String title, String defaultDir) {
|
||||
public String showFileDialog(final String title, final String defaultDir) {
|
||||
final JFileChooser fc = new JFileChooser(defaultDir);
|
||||
final int rc = fc.showDialog(null, title);
|
||||
if (rc != JFileChooser.APPROVE_OPTION) {
|
||||
@@ -202,46 +195,46 @@ public class GuiDesktop implements IGuiBase {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void showBugReportDialog(String title, String text, boolean showExitAppBtn) {
|
||||
public void showBugReportDialog(final String title, final String text, final boolean showExitAppBtn) {
|
||||
BugReportDialog.show(title, text, showExitAppBtn);
|
||||
}
|
||||
|
||||
@Override
|
||||
public File getSaveFile(File defaultFile) {
|
||||
JFileChooser fc = new JFileChooser();
|
||||
public File getSaveFile(final File defaultFile) {
|
||||
final JFileChooser fc = new JFileChooser();
|
||||
fc.setSelectedFile(defaultFile);
|
||||
fc.showSaveDialog(null);
|
||||
return fc.getSelectedFile();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void download(GuiDownloadService service, Callback<Boolean> callback) {
|
||||
new GuiDownloader(service, callback);
|
||||
public void download(final GuiDownloadService service, final Callback<Boolean> callback) {
|
||||
new GuiDownloader(service, callback).show();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void copyToClipboard(String text) {
|
||||
StringSelection ss = new StringSelection(text);
|
||||
public void copyToClipboard(final String text) {
|
||||
final StringSelection ss = new StringSelection(text);
|
||||
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(ss, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void browseToUrl(String url) throws IOException, URISyntaxException {
|
||||
public void browseToUrl(final String url) throws IOException, URISyntaxException {
|
||||
Desktop.getDesktop().browse(new URI(url));
|
||||
}
|
||||
|
||||
@Override
|
||||
public IAudioClip createAudioClip(String filename) {
|
||||
public IAudioClip createAudioClip(final String filename) {
|
||||
return AudioClip.fileExists(filename) ? new AudioClip(filename) : null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IAudioMusic createAudioMusic(String filename) {
|
||||
public IAudioMusic createAudioMusic(final String filename) {
|
||||
return new AudioMusic(filename);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void startAltSoundSystem(String filename, boolean isSynchronized) {
|
||||
public void startAltSoundSystem(final String filename, final boolean isSynchronized) {
|
||||
new AltSoundSystem(filename, isSynchronized).start();
|
||||
}
|
||||
|
||||
@@ -263,6 +256,7 @@ public class GuiDesktop implements IGuiBase {
|
||||
Singletons.getView().getFrame().validate();
|
||||
}
|
||||
|
||||
@Override
|
||||
public IGuiGame getNewGuiGame() {
|
||||
return new CMatchUI();
|
||||
}
|
||||
|
||||
@@ -6,12 +6,12 @@
|
||||
* 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/>.
|
||||
*/
|
||||
@@ -43,7 +43,6 @@ import forge.ImageCache;
|
||||
import forge.LobbyPlayer;
|
||||
import forge.Singletons;
|
||||
import forge.assets.FSkinProp;
|
||||
import forge.gui.GuiDialog;
|
||||
import forge.gui.SOverlayUtils;
|
||||
import forge.gui.framework.FScreen;
|
||||
import forge.gui.framework.InvalidLayoutFileException;
|
||||
@@ -62,6 +61,7 @@ import forge.quest.io.QuestDataIO;
|
||||
import forge.screens.deckeditor.CDeckEditorUI;
|
||||
import forge.toolbox.FOptionPane;
|
||||
import forge.toolbox.FSkin;
|
||||
import forge.util.gui.SOptionPane;
|
||||
import forge.view.FFrame;
|
||||
import forge.view.FView;
|
||||
|
||||
@@ -81,7 +81,7 @@ public enum FControl implements KeyEventDispatcher {
|
||||
private FScreen currentScreen;
|
||||
private boolean altKeyLastDown;
|
||||
private CloseAction closeAction;
|
||||
private List<HostedMatch> currentMatches = Lists.newArrayList();
|
||||
private final List<HostedMatch> currentMatches = Lists.newArrayList();
|
||||
|
||||
public static enum CloseAction {
|
||||
NONE,
|
||||
@@ -126,8 +126,8 @@ public enum FControl implements KeyEventDispatcher {
|
||||
public void windowClosing(final WindowEvent e) {
|
||||
switch (closeAction) {
|
||||
case NONE: //prompt user for close action if not previously specified
|
||||
String[] options = {"Close Screen", "Exit Forge", "Cancel"};
|
||||
int reply = FOptionPane.showOptionDialog(
|
||||
final String[] options = {"Close Screen", "Exit Forge", "Cancel"};
|
||||
final int reply = FOptionPane.showOptionDialog(
|
||||
"Forge now supports navigation tabs which allow closing and switching between different screens with ease. "
|
||||
+ "As a result, you no longer need to use the X button in the upper right to close the current screen and go back."
|
||||
+ "\n\n"
|
||||
@@ -300,8 +300,8 @@ public enum FControl implements KeyEventDispatcher {
|
||||
screen.getController().register();
|
||||
try {
|
||||
SLayoutIO.loadLayout(null);
|
||||
} catch (InvalidLayoutFileException ex) {
|
||||
GuiDialog.message("Your " + screen.getTabCaption() + " layout file could not be read. It will be deleted after you press OK.\nThe game will proceed with default layout.");
|
||||
} catch (final InvalidLayoutFileException ex) {
|
||||
SOptionPane.showMessageDialog(String.format("Your %s layout file could not be read. It will be deleted after you press OK.\nThe game will proceed with default layout.", screen.getTabCaption()), "Warning!");
|
||||
if (screen.deleteLayoutFile()) {
|
||||
SLayoutIO.loadLayout(null); //try again
|
||||
}
|
||||
@@ -325,7 +325,7 @@ public enum FControl implements KeyEventDispatcher {
|
||||
return FModel.getPreferences().getPrefBoolean(FPref.UI_MATCH_IMAGE_VISIBLE);
|
||||
}
|
||||
|
||||
public boolean ensureScreenActive(FScreen screen) {
|
||||
public boolean ensureScreenActive(final FScreen screen) {
|
||||
if (currentScreen == screen) { return true; }
|
||||
|
||||
return setCurrentScreen(screen);
|
||||
@@ -360,7 +360,7 @@ public enum FControl implements KeyEventDispatcher {
|
||||
* @see java.awt.KeyEventDispatcher#dispatchKeyEvent(java.awt.event.KeyEvent)
|
||||
*/
|
||||
@Override
|
||||
public boolean dispatchKeyEvent(KeyEvent e) {
|
||||
public boolean dispatchKeyEvent(final KeyEvent e) {
|
||||
// Show Forge menu if Alt key pressed without modifiers and released without pressing any other keys in between
|
||||
if (e.getKeyCode() == KeyEvent.VK_ALT) {
|
||||
if (e.getID() == KeyEvent.KEY_RELEASED) {
|
||||
|
||||
@@ -1,25 +0,0 @@
|
||||
package forge.control;
|
||||
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
|
||||
import javax.swing.Timer;
|
||||
|
||||
import forge.interfaces.IGuiTimer;
|
||||
|
||||
@SuppressWarnings("serial")
|
||||
public class GuiTimer extends Timer implements IGuiTimer {
|
||||
public GuiTimer(final Runnable proc0, int interval0) {
|
||||
super(interval0, new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
proc0.run();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setInterval(int interval0) {
|
||||
setDelay(interval0);
|
||||
}
|
||||
}
|
||||
@@ -1,21 +1,22 @@
|
||||
package forge.deckchooser;
|
||||
|
||||
import forge.deck.DeckType;
|
||||
import forge.gui.MouseUtil;
|
||||
import forge.toolbox.FComboBoxWrapper;
|
||||
import forge.toolbox.FSkin;
|
||||
import forge.toolbox.FComboBox.TextAlignment;
|
||||
|
||||
import javax.swing.*;
|
||||
|
||||
import java.awt.Cursor;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import javax.swing.DefaultComboBoxModel;
|
||||
|
||||
import com.google.common.collect.Lists;
|
||||
|
||||
import forge.deck.DeckType;
|
||||
import forge.gui.MouseUtil;
|
||||
import forge.toolbox.FComboBox.TextAlignment;
|
||||
import forge.toolbox.FComboBoxWrapper;
|
||||
import forge.toolbox.FSkin;
|
||||
|
||||
public class DecksComboBox extends FComboBoxWrapper<DeckType> {
|
||||
private List<IDecksComboBoxListener> _listeners = new ArrayList<>();
|
||||
private final List<IDecksComboBoxListener> _listeners = Lists.newArrayList();
|
||||
private DeckType selectedDeckType = null;
|
||||
|
||||
public DecksComboBox() {
|
||||
@@ -24,19 +25,18 @@ public class DecksComboBox extends FComboBoxWrapper<DeckType> {
|
||||
addActionListener(getDeckTypeComboListener());
|
||||
}
|
||||
|
||||
public void refresh(DeckType deckType) {
|
||||
public void refresh(final DeckType deckType) {
|
||||
setModel(new DefaultComboBoxModel<DeckType>(DeckType.values()));
|
||||
setSelectedItem(deckType);
|
||||
}
|
||||
|
||||
private ActionListener getDeckTypeComboListener() {
|
||||
return new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
Object selectedItem = getSelectedItem();
|
||||
@Override public void actionPerformed(final ActionEvent e) {
|
||||
final Object selectedItem = getSelectedItem();
|
||||
if (selectedItem instanceof DeckType) {
|
||||
MouseUtil.setCursor(Cursor.WAIT_CURSOR);
|
||||
DeckType newDeckType = (DeckType)selectedItem;
|
||||
final DeckType newDeckType = (DeckType)selectedItem;
|
||||
if (newDeckType != selectedDeckType) {
|
||||
selectedDeckType = newDeckType;
|
||||
notifyDeckTypeSelected(newDeckType);
|
||||
@@ -47,17 +47,13 @@ public class DecksComboBox extends FComboBoxWrapper<DeckType> {
|
||||
};
|
||||
}
|
||||
|
||||
public synchronized void addListener(IDecksComboBoxListener obj) {
|
||||
public synchronized void addListener(final IDecksComboBoxListener obj) {
|
||||
_listeners.add(obj);
|
||||
}
|
||||
|
||||
public synchronized void removeListener(IDecksComboBoxListener obj) {
|
||||
_listeners.remove(obj);
|
||||
}
|
||||
|
||||
private synchronized void notifyDeckTypeSelected(DeckType deckType) {
|
||||
private synchronized void notifyDeckTypeSelected(final DeckType deckType) {
|
||||
if (deckType != null) {
|
||||
for (IDecksComboBoxListener listener : _listeners) {
|
||||
for (final IDecksComboBoxListener listener : _listeners) {
|
||||
listener.deckTypeSelected(new DecksComboBoxEvent(this, deckType));
|
||||
}
|
||||
}
|
||||
@@ -67,13 +63,13 @@ public class DecksComboBox extends FComboBoxWrapper<DeckType> {
|
||||
return selectedDeckType;
|
||||
}
|
||||
|
||||
public void setDeckType(DeckType valueOf) {
|
||||
public void setDeckType(final DeckType valueOf) {
|
||||
selectedDeckType = valueOf;
|
||||
setSelectedItem(selectedDeckType);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setText(String text0) {
|
||||
public void setText(final String text0) {
|
||||
selectedDeckType = null; //ensure selecting current deck type again raises event
|
||||
super.setText(text0);
|
||||
}
|
||||
|
||||
@@ -6,34 +6,41 @@
|
||||
* 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 forge.download;
|
||||
|
||||
import java.net.Proxy;
|
||||
|
||||
import forge.UiCommand;
|
||||
import forge.assets.FSkinProp;
|
||||
import forge.gui.SOverlayUtils;
|
||||
import forge.toolbox.*;
|
||||
import forge.util.Callback;
|
||||
import net.miginfocom.swing.MigLayout;
|
||||
|
||||
import javax.swing.*;
|
||||
import javax.swing.AbstractButton;
|
||||
import javax.swing.DefaultBoundedRangeModel;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.SwingConstants;
|
||||
import javax.swing.event.ChangeEvent;
|
||||
import javax.swing.event.ChangeListener;
|
||||
|
||||
import net.miginfocom.swing.MigLayout;
|
||||
import forge.UiCommand;
|
||||
import forge.assets.FSkinProp;
|
||||
import forge.gui.SOverlayUtils;
|
||||
import forge.toolbox.FButton;
|
||||
import forge.toolbox.FLabel;
|
||||
import forge.toolbox.FOverlay;
|
||||
import forge.toolbox.FPanel;
|
||||
import forge.toolbox.FProgressBar;
|
||||
import forge.toolbox.FRadioButton;
|
||||
import forge.toolbox.FSkin;
|
||||
import forge.toolbox.FTextField;
|
||||
import forge.toolbox.JXButtonPanel;
|
||||
import forge.util.Callback;
|
||||
|
||||
@SuppressWarnings("serial")
|
||||
public class GuiDownloader extends DefaultBoundedRangeModel {
|
||||
public static final Proxy.Type[] TYPES = Proxy.Type.values();
|
||||
|
||||
// Swing components
|
||||
private final FPanel pnlDialog = new FPanel(new MigLayout("insets 0, gap 0, wrap, ax center, ay center"));
|
||||
private final FProgressBar progressBar = new FProgressBar();
|
||||
@@ -42,8 +49,7 @@ public class GuiDownloader extends DefaultBoundedRangeModel {
|
||||
private final FTextField txtPort = new FTextField.Builder().ghostText("Proxy Port").build();
|
||||
|
||||
private final UiCommand cmdClose = new UiCommand() {
|
||||
@Override
|
||||
public void run() {
|
||||
@Override public void run() {
|
||||
service.setCancel(true);
|
||||
|
||||
// Kill overlay
|
||||
@@ -65,15 +71,15 @@ public class GuiDownloader extends DefaultBoundedRangeModel {
|
||||
private final GuiDownloadService service;
|
||||
private final Callback<Boolean> callback;
|
||||
|
||||
public GuiDownloader(GuiDownloadService service0) {
|
||||
public GuiDownloader(final GuiDownloadService service0) {
|
||||
this(service0, null);
|
||||
}
|
||||
public GuiDownloader(GuiDownloadService service0, Callback<Boolean> callback0) {
|
||||
public GuiDownloader(final GuiDownloadService service0, final Callback<Boolean> callback0) {
|
||||
service = service0;
|
||||
callback = callback0;
|
||||
|
||||
String radConstraints = "w 100%!, h 30px!, gap 2% 0 0 10px";
|
||||
JXButtonPanel grpPanel = new JXButtonPanel();
|
||||
final String radConstraints = "w 100%!, h 30px!, gap 2% 0 0 10px";
|
||||
final JXButtonPanel grpPanel = new JXButtonPanel();
|
||||
grpPanel.add(radProxyNone, radConstraints);
|
||||
grpPanel.add(radProxyHTTP, radConstraints);
|
||||
grpPanel.add(radProxySocks, radConstraints);
|
||||
@@ -98,7 +104,9 @@ public class GuiDownloader extends DefaultBoundedRangeModel {
|
||||
pnlDialog.add(progressBar, "w 95%!, h 40px!, gap 2% 0 20px 0");
|
||||
pnlDialog.add(btnStart, "w 200px!, h 40px!, gap 0 0 20px 0, ax center");
|
||||
pnlDialog.add(btnClose, "w 20px!, h 20px!, pos 370px 10px");
|
||||
}
|
||||
|
||||
public void show() {
|
||||
final JPanel pnl = FOverlay.SINGLETON_INSTANCE.getPanel();
|
||||
pnl.removeAll();
|
||||
pnl.setLayout(new MigLayout("insets 0, gap 0, wrap, ax center, ay center"));
|
||||
@@ -106,8 +114,7 @@ public class GuiDownloader extends DefaultBoundedRangeModel {
|
||||
SOverlayUtils.showOverlay();
|
||||
|
||||
service.initialize(txtAddress, txtPort, progressBar, btnStart, cmdClose, null, new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
@Override public void run() {
|
||||
fireStateChanged();
|
||||
}
|
||||
});
|
||||
|
||||
@@ -6,12 +6,12 @@
|
||||
* 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/>.
|
||||
*/
|
||||
@@ -43,7 +43,7 @@ import forge.view.FDialog;
|
||||
/**
|
||||
* A simple class that shows a list of cards in a dialog with preview in its
|
||||
* right part.
|
||||
*
|
||||
*
|
||||
* @author Forge
|
||||
* @version $Id: ListChooser.java 9708 2011-08-09 19:34:12Z jendave $
|
||||
*/
|
||||
@@ -60,7 +60,7 @@ public class CardListViewer extends FDialog {
|
||||
|
||||
/**
|
||||
* Instantiates a new card list viewer.
|
||||
*
|
||||
*
|
||||
* @param title
|
||||
* the title
|
||||
* @param list
|
||||
@@ -72,7 +72,7 @@ public class CardListViewer extends FDialog {
|
||||
|
||||
/**
|
||||
* Instantiates a new card list viewer.
|
||||
*
|
||||
*
|
||||
* @param title
|
||||
* the title
|
||||
* @param message
|
||||
@@ -86,7 +86,7 @@ public class CardListViewer extends FDialog {
|
||||
|
||||
/**
|
||||
* Instantiates a new card list viewer.
|
||||
*
|
||||
*
|
||||
* @param title
|
||||
* the title
|
||||
* @param message
|
||||
@@ -104,16 +104,16 @@ public class CardListViewer extends FDialog {
|
||||
this.picture.setOpaque(false);
|
||||
|
||||
this.setTitle(title);
|
||||
|
||||
|
||||
if (FModel.getPreferences().getPrefBoolean(FPref.UI_LARGE_CARD_VIEWERS)) {
|
||||
this.setSize(1200, 825);
|
||||
} else {
|
||||
this.setSize(720, 374);
|
||||
}
|
||||
|
||||
|
||||
this.addWindowFocusListener(new CardListFocuser());
|
||||
|
||||
FButton btnOK = new FButton("OK");
|
||||
final FButton btnOK = new FButton("OK");
|
||||
btnOK.addActionListener(new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(final ActionEvent e) {
|
||||
|
||||
@@ -83,11 +83,11 @@ public final class CardPicturePanel extends JPanel {
|
||||
return null;
|
||||
}
|
||||
|
||||
private AutoSizeImageMode getAutoSizeImageMode() {
|
||||
private static AutoSizeImageMode getAutoSizeImageMode() {
|
||||
return (isUIScaleLarger() ? AutoSizeImageMode.PANEL : AutoSizeImageMode.SOURCE);
|
||||
}
|
||||
|
||||
private boolean isUIScaleLarger() {
|
||||
private static boolean isUIScaleLarger() {
|
||||
return FModel.getPreferences().getPrefBoolean(FPref.UI_SCALE_LARGER);
|
||||
}
|
||||
|
||||
|
||||
@@ -114,7 +114,7 @@ public enum FNetOverlay {
|
||||
|
||||
FScrollPane _operationLogScroller = new FScrollPane(txtLog, false);
|
||||
_operationLogScroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
|
||||
new SmartScroller(_operationLogScroller);
|
||||
new SmartScroller(_operationLogScroller).attach();
|
||||
window.add(_operationLogScroller, "pushx, hmin 24, pushy, growy, growx, gap 2px 2px 2px 0, sx 2");
|
||||
|
||||
//txtInput.setBorder(new FSkin.LineSkinBorder(FSkin.getColor(FSkin.Colors.CLR_BORDERS)));
|
||||
|
||||
@@ -1,37 +0,0 @@
|
||||
/*
|
||||
* Forge: Play Magic: the Gathering.
|
||||
* Copyright (C) 2011 Forge Team
|
||||
*
|
||||
* 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 forge.gui;
|
||||
|
||||
import javax.swing.*;
|
||||
|
||||
import forge.match.MatchConstants;
|
||||
|
||||
@SuppressWarnings("serial")
|
||||
public abstract class ForgeAction extends AbstractAction {
|
||||
public ForgeAction(MatchConstants property) {
|
||||
super(property.button);
|
||||
this.putValue("buttonText", property.button);
|
||||
this.putValue("menuText", property.menu);
|
||||
}
|
||||
|
||||
public <T extends AbstractButton> T setupButton(final T button) {
|
||||
button.setAction(this);
|
||||
button.setText((String) this.getValue(button instanceof JMenuItem ? "menuText" : "buttonText"));
|
||||
return button;
|
||||
}
|
||||
}
|
||||
@@ -4,7 +4,6 @@ import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.Callable;
|
||||
import java.util.concurrent.FutureTask;
|
||||
@@ -17,7 +16,6 @@ import javax.swing.event.ListSelectionListener;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import com.google.common.base.Function;
|
||||
import com.google.common.collect.Iterables;
|
||||
|
||||
import forge.FThreads;
|
||||
import forge.game.card.Card;
|
||||
@@ -32,7 +30,7 @@ public class GuiChoose {
|
||||
|
||||
/**
|
||||
* Convenience for getChoices(message, 0, 1, choices).
|
||||
*
|
||||
*
|
||||
* @param <T>
|
||||
* is automatically inferred.
|
||||
* @param message
|
||||
@@ -60,70 +58,16 @@ public class GuiChoose {
|
||||
return choice.isEmpty() ? null : choice.get(0);
|
||||
} // getChoiceOptional(String,T...)
|
||||
|
||||
// returned Object will never be null
|
||||
/**
|
||||
* <p>
|
||||
* getChoice.
|
||||
* </p>
|
||||
*
|
||||
* @param <T>
|
||||
* a T object.
|
||||
* @param message
|
||||
* a {@link java.lang.String} object.
|
||||
* @param choices
|
||||
* a T object.
|
||||
* @return a T object.
|
||||
*/
|
||||
public static <T> T one(final String message, final T[] choices) {
|
||||
final List<T> choice = GuiChoose.getChoices(message, 1, 1, choices);
|
||||
assert choice.size() == 1;
|
||||
return choice.get(0);
|
||||
}
|
||||
|
||||
public static <T> T one(final String message, final Collection<T> choices) {
|
||||
if (choices == null || choices.isEmpty())
|
||||
return null;
|
||||
if( choices.size() == 1)
|
||||
return Iterables.getFirst(choices, null);
|
||||
|
||||
final List<T> choice = GuiChoose.getChoices(message, 1, 1, choices);
|
||||
assert choice.size() == 1;
|
||||
return choice.get(0);
|
||||
}
|
||||
|
||||
public static <T> List<T> noneOrMany(final String message, final Collection<T> choices) {
|
||||
return GuiChoose.getChoices(message, 0, choices.size(), choices, null, null);
|
||||
}
|
||||
|
||||
// Nothing to choose here. Code uses this to just reveal one or more items
|
||||
public static <T> void reveal(final String message, final T item) {
|
||||
List<T> items = new ArrayList<T>();
|
||||
items.add(item);
|
||||
reveal(message, items);
|
||||
}
|
||||
public static <T> void reveal(final String message, final T[] items) {
|
||||
GuiChoose.getChoices(message, -1, -1, items);
|
||||
}
|
||||
public static <T> void reveal(final String message, final Collection<T> items) {
|
||||
GuiChoose.getChoices(message, -1, -1, items);
|
||||
}
|
||||
|
||||
// Get Integer in range
|
||||
public static Integer getInteger(final String message) {
|
||||
return getInteger(message, 0, Integer.MAX_VALUE);
|
||||
}
|
||||
public static Integer getInteger(final String message, int min) {
|
||||
return getInteger(message, min, Integer.MAX_VALUE);
|
||||
}
|
||||
public static Integer getInteger(final String message, int min, int max) {
|
||||
public static Integer getInteger(final String message, final int min, final int max) {
|
||||
if (max <= min) { return min; } //just return min if max <= min
|
||||
|
||||
//force cutting off after 100 numbers at most
|
||||
if (max == Integer.MAX_VALUE) {
|
||||
return getInteger(message, min, max, min + 99);
|
||||
}
|
||||
int count = max - min + 1;
|
||||
if (count > 100) {
|
||||
final int count = max - min + 1;
|
||||
if (count > 100) {
|
||||
return getInteger(message, min, max, min + 99);
|
||||
}
|
||||
|
||||
@@ -133,20 +77,20 @@ public class GuiChoose {
|
||||
}
|
||||
return GuiChoose.oneOrNone(message, choices);
|
||||
}
|
||||
public static Integer getInteger(final String message, int min, int max, int cutoff) {
|
||||
public static Integer getInteger(final String message, final int min, final int max, final int cutoff) {
|
||||
if (max <= min || cutoff < min) { return min; } //just return min if max <= min or cutoff < min
|
||||
|
||||
if (cutoff >= max) { //fallback to regular integer prompt if cutoff at or after max
|
||||
return getInteger(message, min, max);
|
||||
}
|
||||
|
||||
List<Object> choices = new ArrayList<Object>();
|
||||
final List<Object> choices = new ArrayList<Object>();
|
||||
for (int i = min; i <= cutoff; i++) {
|
||||
choices.add(Integer.valueOf(i));
|
||||
}
|
||||
choices.add("Other...");
|
||||
|
||||
Object choice = GuiChoose.oneOrNone(message, choices);
|
||||
final Object choice = GuiChoose.oneOrNone(message, choices);
|
||||
if (choice instanceof Integer || choice == null) {
|
||||
return (Integer)choice;
|
||||
}
|
||||
@@ -167,11 +111,11 @@ public class GuiChoose {
|
||||
prompt += ":";
|
||||
|
||||
while (true) {
|
||||
String str = FOptionPane.showInputDialog(prompt, message);
|
||||
final String str = FOptionPane.showInputDialog(prompt, message);
|
||||
if (str == null) { return null; } // that is 'cancel'
|
||||
|
||||
if (StringUtils.isNumeric(str)) {
|
||||
Integer val = Integer.valueOf(str);
|
||||
final Integer val = Integer.valueOf(str);
|
||||
if (val >= min && val <= max) {
|
||||
return val;
|
||||
}
|
||||
@@ -202,7 +146,7 @@ public class GuiChoose {
|
||||
final Callable<List<T>> showChoice = new Callable<List<T>>() {
|
||||
@Override
|
||||
public List<T> call() {
|
||||
ListChooser<T> c = new ListChooser<T>(message, min, max, choices, display);
|
||||
final ListChooser<T> c = new ListChooser<T>(message, min, max, choices, display);
|
||||
final JList<T> list = c.getLstChoices();
|
||||
if (matchUI != null) {
|
||||
list.addListSelectionListener(new ListSelectionListener() {
|
||||
@@ -246,11 +190,11 @@ public class GuiChoose {
|
||||
}
|
||||
};
|
||||
|
||||
FutureTask<List<T>> future = new FutureTask<List<T>>(showChoice);
|
||||
final FutureTask<List<T>> future = new FutureTask<List<T>>(showChoice);
|
||||
FThreads.invokeInEdtAndWait(future);
|
||||
try {
|
||||
return future.get();
|
||||
} catch (Exception e) { // should be no exception here
|
||||
} catch (final Exception e) { // should be no exception here
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
@@ -266,18 +210,14 @@ public class GuiChoose {
|
||||
final List<T> sourceChoices, final List<T> destChoices) {
|
||||
return order(title, top, remainingObjectsMin, remainingObjectsMax, sourceChoices, destChoices, null, false, null);
|
||||
}
|
||||
public static <T> List<T> order(final String title, final String top, final int remainingObjectsMin, final int remainingObjectsMax,
|
||||
final List<T> sourceChoices, final List<T> destChoices, final CardView referenceCard, final boolean sideboardingMode) {
|
||||
return order(title, top, remainingObjectsMin, remainingObjectsMax, sourceChoices, destChoices, referenceCard, sideboardingMode, null);
|
||||
}
|
||||
public static <T> List<T> order(final String title, final String top, final int remainingObjectsMin, final int remainingObjectsMax,
|
||||
final List<T> sourceChoices, final List<T> destChoices, final CardView referenceCard, final boolean sideboardingMode, final CMatchUI matchUI) {
|
||||
// An input box for handling the order of choices.
|
||||
|
||||
Callable<List<T>> callable = new Callable<List<T>>() {
|
||||
final Callable<List<T>> callable = new Callable<List<T>>() {
|
||||
@Override
|
||||
public List<T> call() throws Exception {
|
||||
DualListBox<T> dual = new DualListBox<T>(remainingObjectsMin, remainingObjectsMax, sourceChoices, destChoices, matchUI);
|
||||
final DualListBox<T> dual = new DualListBox<T>(remainingObjectsMin, remainingObjectsMax, sourceChoices, destChoices, matchUI);
|
||||
dual.setSecondColumnLabelText(top);
|
||||
|
||||
dual.setSideboardMode(sideboardingMode);
|
||||
@@ -291,7 +231,7 @@ public class GuiChoose {
|
||||
}
|
||||
dual.setVisible(true);
|
||||
|
||||
List<T> objects = dual.getOrderedList();
|
||||
final List<T> objects = dual.getOrderedList();
|
||||
|
||||
dual.dispose();
|
||||
if (matchUI != null) {
|
||||
@@ -301,70 +241,15 @@ public class GuiChoose {
|
||||
}
|
||||
};
|
||||
|
||||
FutureTask<List<T>> ft = new FutureTask<List<T>>(callable);
|
||||
final FutureTask<List<T>> ft = new FutureTask<List<T>>(callable);
|
||||
FThreads.invokeInEdtAndWait(ft);
|
||||
try {
|
||||
return ft.get();
|
||||
} catch (Exception e) { // we have waited enough
|
||||
} catch (final Exception e) { // we have waited enough
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
// If comparer is NULL, T has to be comparable. Otherwise you'll get an exception from inside the Arrays.sort() routine
|
||||
public static <T> T sortedOneOrNone(final String message, final T[] choices, Comparator<T> comparer) {
|
||||
if ((choices == null) || (choices.length == 0)) {
|
||||
return null;
|
||||
}
|
||||
final List<T> choice = GuiChoose.sortedGetChoices(message, 0, 1, choices, comparer);
|
||||
return choice.isEmpty() ? null : choice.get(0);
|
||||
} // getChoiceOptional(String,T...)
|
||||
|
||||
// If comparer is NULL, T has to be comparable. Otherwise you'll get an exception from inside the Arrays.sort() routine
|
||||
public static <T> T sortedOneOrNone(final String message, final List<T> choices, Comparator<T> comparer) {
|
||||
if ((choices == null) || choices.isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
final List<T> choice = GuiChoose.sortedGetChoices(message, 0, 1, choices, comparer);
|
||||
return choice.isEmpty() ? null : choice.get(0);
|
||||
} // getChoiceOptional(String,T...)
|
||||
|
||||
|
||||
// If comparer is NULL, T has to be comparable. Otherwise you'll get an exception from inside the Arrays.sort() routine
|
||||
public static <T> T sortedOne(final String message, final T[] choices, Comparator<T> comparer) {
|
||||
final List<T> choice = GuiChoose.sortedGetChoices(message, 1, 1, choices, comparer);
|
||||
assert choice.size() == 1;
|
||||
return choice.get(0);
|
||||
} // getChoice()
|
||||
|
||||
// If comparer is NULL, T has to be comparable. Otherwise you'll get an exception from inside the Arrays.sort() routine
|
||||
public static <T> T sortedOne(final String message, final List<T> choices, Comparator<T> comparer) {
|
||||
if ((choices == null) || (choices.size() == 0)) {
|
||||
return null;
|
||||
}
|
||||
final List<T> choice = GuiChoose.sortedGetChoices(message, 1, 1, choices, comparer);
|
||||
assert choice.size() == 1;
|
||||
return choice.get(0);
|
||||
}
|
||||
|
||||
// If comparer is NULL, T has to be comparable. Otherwise you'll get an exception from inside the Arrays.sort() routine
|
||||
public static <T> List<T> sortedNoneOrMany(final String message, final List<T> choices, Comparator<T> comparer) {
|
||||
return GuiChoose.sortedGetChoices(message, 0, choices.size(), choices, comparer);
|
||||
}
|
||||
|
||||
// If comparer is NULL, T has to be comparable. Otherwise you'll get an exception from inside the Arrays.sort() routine
|
||||
public static <T> List<T> sortedGetChoices(final String message, final int min, final int max, final T[] choices, Comparator<T> comparer) {
|
||||
// You may create a copy of source array if callers expect the collection to be unchanged
|
||||
Arrays.sort(choices, comparer);
|
||||
return getChoices(message, min, max, choices);
|
||||
}
|
||||
|
||||
// If comparer is NULL, T has to be comparable. Otherwise you'll get an exception from inside the Arrays.sort() routine
|
||||
public static <T> List<T> sortedGetChoices(final String message, final int min, final int max, final List<T> choices, Comparator<T> comparer) {
|
||||
// You may create a copy of source list if callers expect the collection to be unchanged
|
||||
Collections.sort(choices, comparer);
|
||||
return getChoices(message, min, max, choices);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -1,10 +1,9 @@
|
||||
package forge.gui;
|
||||
|
||||
import java.util.concurrent.Callable;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import java.util.concurrent.FutureTask;
|
||||
|
||||
import javax.swing.UIManager;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import forge.FThreads;
|
||||
@@ -12,70 +11,35 @@ import forge.game.card.CardView;
|
||||
import forge.screens.match.CMatchUI;
|
||||
import forge.toolbox.FOptionPane;
|
||||
|
||||
/**
|
||||
* Holds player interactions using standard windows
|
||||
/**
|
||||
* Holds player interactions using standard windows
|
||||
*
|
||||
*/
|
||||
public class GuiDialog {
|
||||
private static final String[] defaultConfirmOptions = { "Yes", "No" };
|
||||
|
||||
public static boolean confirm(final CardView c, final String question) {
|
||||
return confirm(c, question, true, null);
|
||||
}
|
||||
public static boolean confirm(final CardView c, final String question, final boolean defaultChoice) {
|
||||
return confirm(c, question, defaultChoice, null);
|
||||
}
|
||||
public static boolean confirm(final CardView c, final String question, String[] options) {
|
||||
return confirm(c, question, true, options);
|
||||
}
|
||||
|
||||
public static boolean confirm(final CardView c, final String question, final boolean defaultIsYes, final String[] options) {
|
||||
return confirm(c, question, defaultIsYes, options, null);
|
||||
}
|
||||
public static boolean confirm(final CardView c, final String question, final boolean defaultIsYes, final String[] options, final CMatchUI matchUI) {
|
||||
Callable<Boolean> confirmTask = new Callable<Boolean>() {
|
||||
@Override
|
||||
public Boolean call() throws Exception {
|
||||
final Callable<Boolean> confirmTask = new Callable<Boolean>() {
|
||||
@Override public final Boolean call() {
|
||||
if (matchUI != null && c != null) {
|
||||
matchUI.setCard(c);
|
||||
}
|
||||
|
||||
final String title = c == null ? "Question" : c + " - Ability";
|
||||
String questionToUse = StringUtils.isBlank(question) ? "Activate card's ability?" : question;
|
||||
String[] opts = options == null ? defaultConfirmOptions : options;
|
||||
int answer = FOptionPane.showOptionDialog(questionToUse, title, FOptionPane.QUESTION_ICON, opts, defaultIsYes ? 0 : 1);
|
||||
return answer == 0;
|
||||
final String questionToUse = StringUtils.isBlank(question) ? "Activate card's ability?" : question;
|
||||
final String[] opts = options == null ? defaultConfirmOptions : options;
|
||||
final int answer = FOptionPane.showOptionDialog(questionToUse, title, FOptionPane.QUESTION_ICON, opts, defaultIsYes ? 0 : 1);
|
||||
return Boolean.valueOf(answer == 0);
|
||||
}};
|
||||
|
||||
FutureTask<Boolean> future = new FutureTask<Boolean>(confirmTask);
|
||||
final FutureTask<Boolean> future = new FutureTask<Boolean>(confirmTask);
|
||||
FThreads.invokeInEdtAndWait(future);
|
||||
try {
|
||||
try {
|
||||
return future.get().booleanValue();
|
||||
}
|
||||
catch (Exception e) { // should be no exception here
|
||||
} catch (final InterruptedException | ExecutionException e) { // should be no exception here
|
||||
e.printStackTrace();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* showInfoDialg.
|
||||
* </p>
|
||||
*
|
||||
* @param message
|
||||
* a {@link java.lang.String} object.
|
||||
*/
|
||||
public static void message(final String message) {
|
||||
message(message, UIManager.getString("OptionPane.messageDialogTitle"));
|
||||
}
|
||||
|
||||
public static void message(final String message, final String title) {
|
||||
FThreads.invokeInEdtAndWait(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
FOptionPane.showMessageDialog(message, title, null);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,12 +6,12 @@
|
||||
* 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/>.
|
||||
*/
|
||||
@@ -35,11 +35,15 @@ import javax.swing.KeyStroke;
|
||||
* <p>
|
||||
* GuiUtils class.
|
||||
* </p>
|
||||
*
|
||||
*
|
||||
* @author Forge
|
||||
* @version $Id: GuiUtils.java 24769 2014-02-09 13:56:04Z Hellfish $
|
||||
*/
|
||||
public final class GuiUtils {
|
||||
|
||||
/**
|
||||
* Private constructor to prevent instantiation.
|
||||
*/
|
||||
private GuiUtils() {
|
||||
throw new AssertionError();
|
||||
}
|
||||
@@ -47,10 +51,9 @@ public final class GuiUtils {
|
||||
/**
|
||||
* Attempts to create a font from a filename. Concise error reported if
|
||||
* exceptions found.
|
||||
*
|
||||
*
|
||||
* @param filename
|
||||
* String
|
||||
* @return Font
|
||||
* the name of the font file.
|
||||
*/
|
||||
public static Font newFont(final String filename) {
|
||||
final File file = new File(filename);
|
||||
@@ -69,7 +72,7 @@ public final class GuiUtils {
|
||||
private static final int minItemWidth = 100;
|
||||
private static final int itemHeight = 25;
|
||||
|
||||
public static void setMenuItemSize(JMenuItem item) {
|
||||
public static void setMenuItemSize(final JMenuItem item) {
|
||||
item.setPreferredSize(new Dimension(Math.max(item.getPreferredSize().width, minItemWidth), itemHeight));
|
||||
}
|
||||
|
||||
@@ -77,19 +80,19 @@ public final class GuiUtils {
|
||||
if (label.startsWith("<html>")) { //adjust label if HTML
|
||||
label = "<html>" + "<div style='height: " + itemHeight + "px; margin-top: 6px;'>" + label.substring(6, label.length() - 7) + "</div></html>";
|
||||
}
|
||||
JMenu menu = new JMenu(label);
|
||||
final JMenu menu = new JMenu(label);
|
||||
setMenuItemSize(menu);
|
||||
return menu;
|
||||
}
|
||||
|
||||
public static JMenuItem createMenuItem(String label, KeyStroke accelerator, final Runnable onClick, boolean enabled, boolean bold) {
|
||||
public static JMenuItem createMenuItem(String label, final KeyStroke accelerator, final Runnable onClick, final boolean enabled, final boolean bold) {
|
||||
if (label.startsWith("<html>")) { //adjust label if HTML
|
||||
label = "<html>" + "<div style='height: " + itemHeight + "px; margin-top: 6px;'>" + label.substring(6, label.length() - 7) + "</div></html>";
|
||||
label = "<html>" + "<div style='height: " + itemHeight + "px; margin-top: 6px;'>" + label.substring(6, label.length() - 7) + "</div></html>";
|
||||
}
|
||||
JMenuItem item = new JMenuItem(label);
|
||||
final JMenuItem item = new JMenuItem(label);
|
||||
item.addActionListener(new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent arg0) {
|
||||
public void actionPerformed(final ActionEvent arg0) {
|
||||
if (null != onClick) {
|
||||
onClick.run();
|
||||
}
|
||||
@@ -104,35 +107,35 @@ public final class GuiUtils {
|
||||
return item;
|
||||
}
|
||||
|
||||
public static void addMenuItem(JPopupMenu parent, String label, KeyStroke accelerator, Runnable onClick) {
|
||||
public static void addMenuItem(final JPopupMenu parent, final String label, final KeyStroke accelerator, final Runnable onClick) {
|
||||
parent.add(createMenuItem(label, accelerator, onClick, true, false));
|
||||
}
|
||||
|
||||
public static void addMenuItem(JMenuItem parent, String label, KeyStroke accelerator, Runnable onClick) {
|
||||
|
||||
public static void addMenuItem(final JMenuItem parent, final String label, final KeyStroke accelerator, final Runnable onClick) {
|
||||
parent.add(createMenuItem(label, accelerator, onClick, true, false));
|
||||
}
|
||||
|
||||
public static void addMenuItem(JPopupMenu parent, String label, KeyStroke accelerator, Runnable onClick, boolean enabled) {
|
||||
|
||||
public static void addMenuItem(final JPopupMenu parent, final String label, final KeyStroke accelerator, final Runnable onClick, final boolean enabled) {
|
||||
parent.add(createMenuItem(label, accelerator, onClick, enabled, false));
|
||||
}
|
||||
|
||||
public static void addMenuItem(JMenuItem parent, String label, KeyStroke accelerator, Runnable onClick, boolean enabled) {
|
||||
|
||||
public static void addMenuItem(final JMenuItem parent, final String label, final KeyStroke accelerator, final Runnable onClick, final boolean enabled) {
|
||||
parent.add(createMenuItem(label, accelerator, onClick, enabled, false));
|
||||
}
|
||||
|
||||
public static void addMenuItem(JPopupMenu parent, String label, KeyStroke accelerator, Runnable onClick, boolean enabled, boolean bold) {
|
||||
parent.add(createMenuItem(label, accelerator, onClick, enabled, bold));
|
||||
}
|
||||
|
||||
public static void addMenuItem(JMenuItem parent, String label, KeyStroke accelerator, Runnable onClick, boolean enabled, boolean bold) {
|
||||
|
||||
public static void addMenuItem(final JPopupMenu parent, final String label, final KeyStroke accelerator, final Runnable onClick, final boolean enabled, final boolean bold) {
|
||||
parent.add(createMenuItem(label, accelerator, onClick, enabled, bold));
|
||||
}
|
||||
|
||||
public static void addSeparator(JPopupMenu parent) {
|
||||
public static void addMenuItem(final JMenuItem parent, final String label, final KeyStroke accelerator, final Runnable onClick, final boolean enabled, final boolean bold) {
|
||||
parent.add(createMenuItem(label, accelerator, onClick, enabled, bold));
|
||||
}
|
||||
|
||||
public static void addSeparator(final JPopupMenu parent) {
|
||||
parent.add(new JSeparator());
|
||||
}
|
||||
|
||||
public static void addSeparator(JMenuItem parent) {
|
||||
public static void addSeparator(final JMenuItem parent) {
|
||||
parent.add(new JSeparator());
|
||||
}
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -6,17 +6,26 @@
|
||||
* 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 forge.gui;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.HashMap;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.TreeMap;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.apache.commons.lang3.tuple.Pair;
|
||||
|
||||
import com.google.common.base.Predicate;
|
||||
import com.google.common.collect.Iterables;
|
||||
|
||||
@@ -29,15 +38,6 @@ import forge.properties.ForgeConstants;
|
||||
import forge.util.FileUtil;
|
||||
import forge.util.ImageUtil;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.apache.commons.lang3.tuple.Pair;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.HashMap;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.TreeMap;
|
||||
|
||||
public class ImportSourceAnalyzer {
|
||||
public static enum OpType {
|
||||
CONSTRUCTED_DECK,
|
||||
@@ -56,37 +56,37 @@ public class ImportSourceAnalyzer {
|
||||
PREFERENCE_FILE,
|
||||
DB_FILE
|
||||
}
|
||||
|
||||
|
||||
public static interface AnalysisCallback {
|
||||
boolean checkCancel();
|
||||
void addOp(OpType type, File src, File dest);
|
||||
}
|
||||
|
||||
|
||||
private final File _source;
|
||||
private final AnalysisCallback _cb;
|
||||
private final int _numFilesToAnalyze;
|
||||
|
||||
|
||||
private int _numFilesAnalyzed;
|
||||
|
||||
public ImportSourceAnalyzer(String source, AnalysisCallback cb) {
|
||||
|
||||
public ImportSourceAnalyzer(final String source, final AnalysisCallback cb) {
|
||||
_source = new File(source);
|
||||
_cb = cb;
|
||||
|
||||
_numFilesToAnalyze = _countFiles(_source);
|
||||
}
|
||||
|
||||
|
||||
public int getNumFilesToAnalyze() { return _numFilesToAnalyze; }
|
||||
public int getNumFilesAnalyzed() { return _numFilesAnalyzed; }
|
||||
|
||||
|
||||
public void doAnalysis() {
|
||||
_identifyAndAnalyze(_source);
|
||||
}
|
||||
|
||||
private void _identifyAndAnalyze(File root) {
|
||||
|
||||
private void _identifyAndAnalyze(final File root) {
|
||||
// see if we can figure out the likely identity of the source folder and
|
||||
// dispatch to the best analysis subroutine to handle it
|
||||
String dirname = root.getName();
|
||||
|
||||
final String dirname = root.getName();
|
||||
|
||||
if ("res".equalsIgnoreCase(dirname)) { _analyzeOldResDir(root); }
|
||||
else if ("constructed".equalsIgnoreCase(dirname)) { _analyzeConstructedDeckDir(root); }
|
||||
else if ("draft".equalsIgnoreCase(dirname)) { _analyzeDraftDeckDir(root); }
|
||||
@@ -104,11 +104,11 @@ public class ImportSourceAnalyzer {
|
||||
else {
|
||||
// look at files in directory and make a semi-educated guess based on file extensions
|
||||
int numUnhandledFiles = 0;
|
||||
for (File file : root.listFiles()) {
|
||||
for (final File file : root.listFiles()) {
|
||||
if (_cb.checkCancel()) { return; }
|
||||
|
||||
if (file.isFile()) {
|
||||
String filename = file.getName();
|
||||
final String filename = file.getName();
|
||||
if (StringUtils.endsWithIgnoreCase(filename, ".dck")) {
|
||||
_analyzeDecksDir(root);
|
||||
numUnhandledFiles = 0;
|
||||
@@ -118,7 +118,7 @@ public class ImportSourceAnalyzer {
|
||||
numUnhandledFiles = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
++numUnhandledFiles;
|
||||
} else if (file.isDirectory()) {
|
||||
_identifyAndAnalyze(file);
|
||||
@@ -127,15 +127,15 @@ public class ImportSourceAnalyzer {
|
||||
_numFilesAnalyzed += numUnhandledFiles;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// pre-profile res dir
|
||||
//
|
||||
|
||||
private void _analyzeOldResDir(File root) {
|
||||
|
||||
private void _analyzeOldResDir(final File root) {
|
||||
_analyzeDir(root, new _Analyzer() {
|
||||
@Override boolean onDir(File dir) {
|
||||
String dirname = dir.getName();
|
||||
@Override boolean onDir(final File dir) {
|
||||
final String dirname = dir.getName();
|
||||
if ("decks".equalsIgnoreCase(dirname)) {
|
||||
_analyzeDecksDir(dir);
|
||||
} else if ("gauntlet".equalsIgnoreCase(dirname)) {
|
||||
@@ -161,20 +161,20 @@ public class ImportSourceAnalyzer {
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// decks
|
||||
//
|
||||
|
||||
private void _analyzeDecksDir(File root) {
|
||||
|
||||
private void _analyzeDecksDir(final File root) {
|
||||
_analyzeDir(root, new _Analyzer() {
|
||||
@Override void onFile(File file) {
|
||||
@Override void onFile(final File file) {
|
||||
// we don't really expect any files in here, but if we find a .dck file, add it to the unknown list
|
||||
String filename = file.getName();
|
||||
final String filename = file.getName();
|
||||
if (StringUtils.endsWithIgnoreCase(filename, ".dck")) {
|
||||
File targetFile = new File(_lcaseExt(filename));
|
||||
final File targetFile = new File(_lcaseExt(filename));
|
||||
_cb.addOp(OpType.UNKNOWN_DECK, file, targetFile);
|
||||
}
|
||||
}
|
||||
|
||||
@Override boolean onDir(File dir) {
|
||||
String dirname = dir.getName();
|
||||
|
||||
@Override boolean onDir(final File dir) {
|
||||
final String dirname = dir.getName();
|
||||
if ("constructed".equalsIgnoreCase(dirname)) {
|
||||
_analyzeConstructedDeckDir(dir);
|
||||
} else if ("cube".equalsIgnoreCase(dirname)) {
|
||||
@@ -194,58 +194,58 @@ public class ImportSourceAnalyzer {
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void _analyzeConstructedDeckDir(File root) {
|
||||
|
||||
private void _analyzeConstructedDeckDir(final File root) {
|
||||
_analyzeKnownDeckDir(root, ForgeConstants.DECK_CONSTRUCTED_DIR, OpType.CONSTRUCTED_DECK);
|
||||
}
|
||||
|
||||
private void _analyzeDraftDeckDir(File root) {
|
||||
|
||||
private void _analyzeDraftDeckDir(final File root) {
|
||||
_analyzeKnownDeckDir(root, ForgeConstants.DECK_DRAFT_DIR, OpType.DRAFT_DECK);
|
||||
}
|
||||
|
||||
private void _analyzePlanarDeckDir(File root) {
|
||||
|
||||
private void _analyzePlanarDeckDir(final File root) {
|
||||
_analyzeKnownDeckDir(root, ForgeConstants.DECK_PLANE_DIR, OpType.PLANAR_DECK);
|
||||
}
|
||||
|
||||
private void _analyzeSchemeDeckDir(File root) {
|
||||
|
||||
private void _analyzeSchemeDeckDir(final File root) {
|
||||
_analyzeKnownDeckDir(root, ForgeConstants.DECK_SCHEME_DIR, OpType.SCHEME_DECK);
|
||||
}
|
||||
|
||||
private void _analyzeSealedDeckDir(File root) {
|
||||
|
||||
private void _analyzeSealedDeckDir(final File root) {
|
||||
_analyzeKnownDeckDir(root, ForgeConstants.DECK_SEALED_DIR, OpType.SEALED_DECK);
|
||||
}
|
||||
|
||||
private void _analyzeKnownDeckDir(File root, final String targetDir, final OpType opType) {
|
||||
|
||||
private void _analyzeKnownDeckDir(final File root, final String targetDir, final OpType opType) {
|
||||
_analyzeDir(root, new _Analyzer() {
|
||||
@Override void onFile(File file) {
|
||||
String filename = file.getName();
|
||||
@Override void onFile(final File file) {
|
||||
final String filename = file.getName();
|
||||
if (StringUtils.endsWithIgnoreCase(filename, ".dck")) {
|
||||
File targetFile = new File(targetDir, _lcaseExt(filename));
|
||||
final File targetFile = new File(targetDir, _lcaseExt(filename));
|
||||
if (!file.equals(targetFile)) {
|
||||
_cb.addOp(opType, file, targetFile);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override boolean onDir(File dir) {
|
||||
|
||||
@Override boolean onDir(final File dir) {
|
||||
// if there's a dir beneath a known directory, assume the same kind of decks are in there
|
||||
_analyzeKnownDeckDir(dir, targetDir, opType);
|
||||
return true;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// gauntlet
|
||||
//
|
||||
|
||||
private void _analyzeGauntletDataDir(File root) {
|
||||
|
||||
private void _analyzeGauntletDataDir(final File root) {
|
||||
_analyzeDir(root, new _Analyzer() {
|
||||
@Override void onFile(File file) {
|
||||
@Override void onFile(final File file) {
|
||||
// find *.dat files, but exclude LOCKED_*
|
||||
String filename = file.getName();
|
||||
final String filename = file.getName();
|
||||
if (StringUtils.endsWithIgnoreCase(filename, ".dat") && !filename.startsWith("LOCKED_")) {
|
||||
File targetFile = new File(ForgeConstants.GAUNTLET_DIR.userPrefLoc, _lcaseExt(filename));
|
||||
final File targetFile = new File(ForgeConstants.GAUNTLET_DIR.userPrefLoc, _lcaseExt(filename));
|
||||
if (!file.equals(targetFile)) {
|
||||
_cb.addOp(OpType.GAUNTLET_DATA, file, targetFile);
|
||||
}
|
||||
@@ -253,100 +253,104 @@ public class ImportSourceAnalyzer {
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// layouts
|
||||
//
|
||||
|
||||
private void _analyzeLayoutsDir(File root) {
|
||||
|
||||
private void _analyzeLayoutsDir(final File root) {
|
||||
_analyzeDir(root, new _Analyzer() {
|
||||
@Override void onFile(File file) {
|
||||
@Override void onFile(final File file) {
|
||||
// find *_preferred.xml files
|
||||
String filename = file.getName();
|
||||
final String filename = file.getName();
|
||||
if (StringUtils.endsWithIgnoreCase(filename, "_preferred.xml")) {
|
||||
File targetFile = new File(ForgeConstants.USER_PREFS_DIR,
|
||||
final File targetFile = new File(ForgeConstants.USER_PREFS_DIR,
|
||||
file.getName().toLowerCase(Locale.ENGLISH).replace("_preferred", ""));
|
||||
_cb.addOp(OpType.PREFERENCE_FILE, file, targetFile);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// default card pics
|
||||
//
|
||||
|
||||
private static String _oldCleanString(String in) {
|
||||
|
||||
private static String _oldCleanString(final String in) {
|
||||
final StringBuffer out = new StringBuffer();
|
||||
for (int i = 0; i < in.length(); i++) {
|
||||
char c = in.charAt(i);
|
||||
final char c = in.charAt(i);
|
||||
if ((c == ' ') || (c == '-')) {
|
||||
out.append('_');
|
||||
} else if (Character.isLetterOrDigit(c) || (c == '_')) {
|
||||
out.append(c);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// usually we would want to pass Locale.ENGLISH to the toLowerCase() method to prevent unintentional
|
||||
// character mangling on some system locales, but we want to replicate the old code here exactly
|
||||
return out.toString().toLowerCase();
|
||||
}
|
||||
|
||||
private void _addDefaultPicNames(PaperCard c, boolean backFace) {
|
||||
CardRules card = c.getRules();
|
||||
String urls = card.getPictureUrl(backFace);
|
||||
|
||||
private void _addDefaultPicNames(final PaperCard c, final boolean backFace) {
|
||||
final CardRules card = c.getRules();
|
||||
final String urls = card.getPictureUrl(backFace);
|
||||
if (StringUtils.isEmpty(urls)) { return; }
|
||||
|
||||
int numPics = 1 + StringUtils.countMatches(urls, "\\");
|
||||
final int numPics = 1 + StringUtils.countMatches(urls, "\\");
|
||||
if (c.getArtIndex() > numPics) {
|
||||
return;
|
||||
}
|
||||
|
||||
String filenameBase = ImageUtil.getImageKey(c, backFace, false);
|
||||
String filename = filenameBase + ".jpg";
|
||||
boolean alreadyHadIt = null != _defaultPicNames.put(filename, filename);
|
||||
if ( alreadyHadIt ) return;
|
||||
|
||||
final String filenameBase = ImageUtil.getImageKey(c, backFace, false);
|
||||
final String filename = filenameBase + ".jpg";
|
||||
final boolean alreadyHadIt = null != _defaultPicNames.put(filename, filename);
|
||||
if ( alreadyHadIt ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Do you shift artIndex by one here?
|
||||
String newLastSymbol = 0 == c.getArtIndex() ? "" : String.valueOf(c.getArtIndex() /* + 1 */);
|
||||
String oldFilename = _oldCleanString(filenameBase.replaceAll("[0-9]?(\\.full)?$", "")) + newLastSymbol + ".jpg";
|
||||
final String newLastSymbol = 0 == c.getArtIndex() ? "" : String.valueOf(c.getArtIndex() /* + 1 */);
|
||||
final String oldFilename = _oldCleanString(filenameBase.replaceAll("[0-9]?(\\.full)?$", "")) + newLastSymbol + ".jpg";
|
||||
//if ( numPics > 1 )
|
||||
//System.out.printf("Will move %s -> %s%n", oldFilename, filename);
|
||||
_defaultPicOldNameToCurrentName.put(oldFilename, filename);
|
||||
}
|
||||
|
||||
|
||||
|
||||
private Map<String, String> _defaultPicNames;
|
||||
private Map<String, String> _defaultPicOldNameToCurrentName;
|
||||
private void _analyzeCardPicsDir(File root) {
|
||||
private void _analyzeCardPicsDir(final File root) {
|
||||
if (null == _defaultPicNames) {
|
||||
_defaultPicNames = new TreeMap<String, String>(String.CASE_INSENSITIVE_ORDER);
|
||||
_defaultPicOldNameToCurrentName = new TreeMap<String, String>(String.CASE_INSENSITIVE_ORDER);
|
||||
|
||||
for (PaperCard c : FModel.getMagicDb().getCommonCards().getAllCards()) {
|
||||
for (final PaperCard c : FModel.getMagicDb().getCommonCards().getAllCards()) {
|
||||
_addDefaultPicNames(c, false);
|
||||
if (ImageUtil.hasBackFacePicture(c)) {
|
||||
_addDefaultPicNames(c, true);
|
||||
}
|
||||
}
|
||||
|
||||
for (PaperCard c : FModel.getMagicDb().getVariantCards().getAllCards()) {
|
||||
|
||||
for (final PaperCard c : FModel.getMagicDb().getVariantCards().getAllCards()) {
|
||||
_addDefaultPicNames(c, false);
|
||||
// variants never have backfaces
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
_analyzeListedDir(root, ForgeConstants.CACHE_CARD_PICS_DIR, new _ListedAnalyzer() {
|
||||
@Override public String map(String filename) {
|
||||
@Override public String map(final String filename) {
|
||||
if (_defaultPicOldNameToCurrentName.containsKey(filename)) {
|
||||
return _defaultPicOldNameToCurrentName.get(filename);
|
||||
}
|
||||
return _defaultPicNames.get(filename);
|
||||
}
|
||||
|
||||
@Override public OpType getOpType(String filename) { return OpType.DEFAULT_CARD_PIC; }
|
||||
|
||||
@Override boolean onDir(File dir) {
|
||||
|
||||
@Override public OpType getOpType(final String filename) {
|
||||
return OpType.DEFAULT_CARD_PIC;
|
||||
}
|
||||
|
||||
@Override boolean onDir(final File dir) {
|
||||
if ("icons".equalsIgnoreCase(dir.getName())) {
|
||||
_analyzeIconsPicsDir(dir);
|
||||
} else if ("tokens".equalsIgnoreCase(dir.getName())) {
|
||||
@@ -355,16 +359,16 @@ public class ImportSourceAnalyzer {
|
||||
_analyzeCardPicsSetDir(dir);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// set card pics
|
||||
//
|
||||
|
||||
private static void _addSetCards(Map<String, String> cardFileNames, Iterable<PaperCard> library, Predicate<PaperCard> filter) {
|
||||
for (PaperCard c : Iterables.filter(library, filter)) {
|
||||
|
||||
private static void _addSetCards(final Map<String, String> cardFileNames, final Iterable<PaperCard> library, final Predicate<PaperCard> filter) {
|
||||
for (final PaperCard c : Iterables.filter(library, filter)) {
|
||||
String filename = ImageUtil.getImageKey(c, false, true) + ".jpg";
|
||||
cardFileNames.put(filename, filename);
|
||||
if (ImageUtil.hasBackFacePicture(c)) {
|
||||
@@ -373,30 +377,30 @@ public class ImportSourceAnalyzer {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Map<String, Map<String, String>> _cardFileNamesBySet;
|
||||
Map<String, String> _nameUpdates;
|
||||
private void _analyzeCardPicsSetDir(File root) {
|
||||
private void _analyzeCardPicsSetDir(final File root) {
|
||||
if (null == _cardFileNamesBySet) {
|
||||
_cardFileNamesBySet = new TreeMap<String, Map<String, String>>(String.CASE_INSENSITIVE_ORDER);
|
||||
for (CardEdition ce : FModel.getMagicDb().getEditions()) {
|
||||
Map<String, String> cardFileNames = new TreeMap<String, String>(String.CASE_INSENSITIVE_ORDER);
|
||||
Predicate<PaperCard> filter = IPaperCard.Predicates.printedInSet(ce.getCode());
|
||||
for (final CardEdition ce : FModel.getMagicDb().getEditions()) {
|
||||
final Map<String, String> cardFileNames = new TreeMap<String, String>(String.CASE_INSENSITIVE_ORDER);
|
||||
final Predicate<PaperCard> filter = IPaperCard.Predicates.printedInSet(ce.getCode());
|
||||
_addSetCards(cardFileNames, FModel.getMagicDb().getCommonCards().getAllCards(), filter);
|
||||
_addSetCards(cardFileNames, FModel.getMagicDb().getVariantCards().getAllCards(), filter);
|
||||
_cardFileNamesBySet.put(ce.getCode2(), cardFileNames);
|
||||
}
|
||||
|
||||
|
||||
// planar cards now don't have the ".full" part in their filenames
|
||||
_nameUpdates = new TreeMap<String, String>(String.CASE_INSENSITIVE_ORDER);
|
||||
Predicate<PaperCard> predPlanes = new Predicate<PaperCard>() {
|
||||
final Predicate<PaperCard> predPlanes = new Predicate<PaperCard>() {
|
||||
@Override
|
||||
public boolean apply(PaperCard arg0) {
|
||||
public boolean apply(final PaperCard arg0) {
|
||||
return arg0.getRules().getType().isPlane() || arg0.getRules().getType().isPhenomenon();
|
||||
}
|
||||
};
|
||||
|
||||
for (PaperCard c : Iterables.filter(FModel.getMagicDb().getVariantCards().getAllCards(), predPlanes)) {
|
||||
for (final PaperCard c : Iterables.filter(FModel.getMagicDb().getVariantCards().getAllCards(), predPlanes)) {
|
||||
String baseName = ImageUtil.getImageKey(c,false, true);
|
||||
_nameUpdates.put(baseName + ".full.jpg", baseName + ".jpg");
|
||||
if (ImageUtil.hasBackFacePicture(c)) {
|
||||
@@ -406,15 +410,15 @@ public class ImportSourceAnalyzer {
|
||||
}
|
||||
}
|
||||
|
||||
CardEdition.Collection editions = FModel.getMagicDb().getEditions();
|
||||
String editionCode = root.getName();
|
||||
CardEdition edition = editions.get(editionCode);
|
||||
final CardEdition.Collection editions = FModel.getMagicDb().getEditions();
|
||||
final String editionCode = root.getName();
|
||||
final CardEdition edition = editions.get(editionCode);
|
||||
if (null == edition) {
|
||||
// not a valid set name, skip
|
||||
_numFilesAnalyzed += _countFiles(root);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
final String editionCode2 = edition.getCode2();
|
||||
final Map<String, String> validFilenames = _cardFileNamesBySet.get(editionCode2);
|
||||
_analyzeListedDir(root, ForgeConstants.CACHE_CARD_PICS_DIR, new _ListedAnalyzer() {
|
||||
@@ -424,14 +428,14 @@ public class ImportSourceAnalyzer {
|
||||
filename = _nameUpdates.get(filename);
|
||||
}
|
||||
if (validFilenames.containsKey(filename)) {
|
||||
return validFilenames.get(filename);
|
||||
return validFilenames.get(filename);
|
||||
} else if (StringUtils.endsWithIgnoreCase(filename, ".jpg")
|
||||
|| StringUtils.endsWithIgnoreCase(filename, ".png")) {
|
||||
return filename;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
@Override public OpType getOpType(String filename) {
|
||||
@Override public OpType getOpType(final String filename) {
|
||||
return validFilenames.containsKey(filename) ? OpType.SET_CARD_PIC : OpType.POSSIBLE_SET_CARD_PIC;
|
||||
}
|
||||
});
|
||||
@@ -442,54 +446,54 @@ public class ImportSourceAnalyzer {
|
||||
//
|
||||
|
||||
Map<String, String> _iconFileNames;
|
||||
private void _analyzeIconsPicsDir(File root) {
|
||||
private void _analyzeIconsPicsDir(final File root) {
|
||||
if (null == _iconFileNames) {
|
||||
_iconFileNames = new TreeMap<String, String>(String.CASE_INSENSITIVE_ORDER);
|
||||
for (Pair<String, String> nameurl : FileUtil.readNameUrlFile(ForgeConstants.IMAGE_LIST_QUEST_OPPONENT_ICONS_FILE)) {
|
||||
for (final Pair<String, String> nameurl : FileUtil.readNameUrlFile(ForgeConstants.IMAGE_LIST_QUEST_OPPONENT_ICONS_FILE)) {
|
||||
_iconFileNames.put(nameurl.getLeft(), nameurl.getLeft());
|
||||
}
|
||||
for (Pair<String, String> nameurl : FileUtil.readNameUrlFile(ForgeConstants.IMAGE_LIST_QUEST_PET_SHOP_ICONS_FILE)) {
|
||||
for (final Pair<String, String> nameurl : FileUtil.readNameUrlFile(ForgeConstants.IMAGE_LIST_QUEST_PET_SHOP_ICONS_FILE)) {
|
||||
_iconFileNames.put(nameurl.getLeft(), nameurl.getLeft());
|
||||
}
|
||||
}
|
||||
|
||||
_analyzeListedDir(root, ForgeConstants.CACHE_ICON_PICS_DIR, new _ListedAnalyzer() {
|
||||
@Override public String map(String filename) { return _iconFileNames.containsKey(filename) ? _iconFileNames.get(filename) : null; }
|
||||
@Override public OpType getOpType(String filename) { return OpType.QUEST_PIC; }
|
||||
@Override public String map(final String filename) { return _iconFileNames.containsKey(filename) ? _iconFileNames.get(filename) : null; }
|
||||
@Override public OpType getOpType(final String filename) { return OpType.QUEST_PIC; }
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
Map<String, String> _tokenFileNames;
|
||||
Map<String, String> _questTokenFileNames;
|
||||
private void _analyzeTokenPicsDir(File root) {
|
||||
private void _analyzeTokenPicsDir(final File root) {
|
||||
if (null == _tokenFileNames) {
|
||||
_tokenFileNames = new TreeMap<String, String>(String.CASE_INSENSITIVE_ORDER);
|
||||
_questTokenFileNames = new TreeMap<String, String>(String.CASE_INSENSITIVE_ORDER);
|
||||
for (Pair<String, String> nameurl : FileUtil.readNameUrlFile(ForgeConstants.IMAGE_LIST_TOKENS_FILE)) {
|
||||
for (final Pair<String, String> nameurl : FileUtil.readNameUrlFile(ForgeConstants.IMAGE_LIST_TOKENS_FILE)) {
|
||||
_tokenFileNames.put(nameurl.getLeft(), nameurl.getLeft());
|
||||
}
|
||||
for (Pair<String, String> nameurl : FileUtil.readNameUrlFile(ForgeConstants.IMAGE_LIST_QUEST_TOKENS_FILE)) {
|
||||
for (final Pair<String, String> nameurl : FileUtil.readNameUrlFile(ForgeConstants.IMAGE_LIST_QUEST_TOKENS_FILE)) {
|
||||
_questTokenFileNames.put(nameurl.getLeft(), nameurl.getLeft());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
_analyzeListedDir(root, ForgeConstants.CACHE_TOKEN_PICS_DIR, new _ListedAnalyzer() {
|
||||
@Override public String map(String filename) {
|
||||
@Override public String map(final String filename) {
|
||||
if (_questTokenFileNames.containsKey(filename)) { return _questTokenFileNames.get(filename); }
|
||||
if (_tokenFileNames.containsKey(filename)) { return _tokenFileNames.get(filename); }
|
||||
return null;
|
||||
}
|
||||
@Override public OpType getOpType(String filename) {
|
||||
@Override public OpType getOpType(final String filename) {
|
||||
return _questTokenFileNames.containsKey(filename) ? OpType.QUEST_PIC : OpType.TOKEN_PIC;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void _analyzeProductPicsDir(File root) {
|
||||
|
||||
private void _analyzeProductPicsDir(final File root) {
|
||||
// we don't care about the files in the root dir -- the new booster files are .png, not the current .jpg ones
|
||||
_analyzeDir(root, new _Analyzer() {
|
||||
@Override boolean onDir(File dir) {
|
||||
String dirName = dir.getName();
|
||||
@Override boolean onDir(final File dir) {
|
||||
final String dirName = dir.getName();
|
||||
if ("booster".equalsIgnoreCase(dirName)) {
|
||||
_analyzeSimpleListedDir(dir, ForgeConstants.IMAGE_LIST_QUEST_BOOSTERS_FILE, ForgeConstants.CACHE_BOOSTER_PICS_DIR, OpType.QUEST_PIC);
|
||||
} else if ("fatpacks".equalsIgnoreCase(dirName)) {
|
||||
@@ -507,17 +511,17 @@ public class ImportSourceAnalyzer {
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// preferences
|
||||
//
|
||||
|
||||
private void _analyzePreferencesDir(File root) {
|
||||
|
||||
private void _analyzePreferencesDir(final File root) {
|
||||
_analyzeDir(root, new _Analyzer() {
|
||||
@Override void onFile(File file) {
|
||||
String filename = file.getName();
|
||||
@Override void onFile(final File file) {
|
||||
final String filename = file.getName();
|
||||
if ("editor.preferences".equalsIgnoreCase(filename) || "forge.preferences".equalsIgnoreCase(filename)) {
|
||||
File targetFile = new File(ForgeConstants.USER_PREFS_DIR, filename.toLowerCase(Locale.ENGLISH));
|
||||
final File targetFile = new File(ForgeConstants.USER_PREFS_DIR, filename.toLowerCase(Locale.ENGLISH));
|
||||
if (!file.equals(targetFile)) {
|
||||
_cb.addOp(OpType.PREFERENCE_FILE, file, targetFile);
|
||||
}
|
||||
@@ -525,23 +529,23 @@ public class ImportSourceAnalyzer {
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// quest data
|
||||
//
|
||||
|
||||
private void _analyzeQuestDir(File root) {
|
||||
|
||||
private void _analyzeQuestDir(final File root) {
|
||||
_analyzeDir(root, new _Analyzer() {
|
||||
@Override void onFile(File file) {
|
||||
String filename = file.getName();
|
||||
@Override void onFile(final File file) {
|
||||
final String filename = file.getName();
|
||||
if ("all-prices.txt".equalsIgnoreCase(filename)) {
|
||||
File targetFile = new File(ForgeConstants.DB_DIR, filename.toLowerCase(Locale.ENGLISH));
|
||||
final File targetFile = new File(ForgeConstants.DB_DIR, filename.toLowerCase(Locale.ENGLISH));
|
||||
if (!file.equals(targetFile)) {
|
||||
_cb.addOp(OpType.DB_FILE, file, targetFile);
|
||||
}
|
||||
}
|
||||
}
|
||||
@Override boolean onDir(File dir) {
|
||||
@Override boolean onDir(final File dir) {
|
||||
if ("data".equalsIgnoreCase(dir.getName())) {
|
||||
_analyzeQuestDataDir(dir);
|
||||
return true;
|
||||
@@ -550,13 +554,13 @@ public class ImportSourceAnalyzer {
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void _analyzeQuestDataDir(File root) {
|
||||
|
||||
private void _analyzeQuestDataDir(final File root) {
|
||||
_analyzeDir(root, new _Analyzer() {
|
||||
@Override void onFile(File file) {
|
||||
String filename = file.getName();
|
||||
@Override void onFile(final File file) {
|
||||
final String filename = file.getName();
|
||||
if (StringUtils.endsWithIgnoreCase(filename, ".dat")) {
|
||||
File targetFile = new File(ForgeConstants.QUEST_SAVE_DIR, _lcaseExt(filename));
|
||||
final File targetFile = new File(ForgeConstants.QUEST_SAVE_DIR, _lcaseExt(filename));
|
||||
if (!file.equals(targetFile)) {
|
||||
_cb.addOp(OpType.QUEST_DATA, file, targetFile);
|
||||
}
|
||||
@@ -564,20 +568,20 @@ public class ImportSourceAnalyzer {
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// utility functions
|
||||
//
|
||||
|
||||
|
||||
private class _Analyzer {
|
||||
void onFile(File file) { }
|
||||
void onFile(final File file) { }
|
||||
|
||||
// returns whether the directory has been handled
|
||||
boolean onDir(File dir) { return false; }
|
||||
boolean onDir(final File dir) { return false; }
|
||||
}
|
||||
|
||||
private void _analyzeDir(File root, _Analyzer analyzer) {
|
||||
for (File file : root.listFiles()) {
|
||||
|
||||
private void _analyzeDir(final File root, final _Analyzer analyzer) {
|
||||
for (final File file : root.listFiles()) {
|
||||
if (_cb.checkCancel()) { return; }
|
||||
|
||||
if (file.isFile()) {
|
||||
@@ -590,54 +594,54 @@ public class ImportSourceAnalyzer {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private Map<String, Map<String, String>> _fileNameDb = new HashMap<String, Map<String, String>>();
|
||||
private void _analyzeSimpleListedDir(File root, String listFile, String targetDir, final OpType opType) {
|
||||
|
||||
private final Map<String, Map<String, String>> _fileNameDb = new HashMap<String, Map<String, String>>();
|
||||
private void _analyzeSimpleListedDir(final File root, final String listFile, final String targetDir, final OpType opType) {
|
||||
if (!_fileNameDb.containsKey(listFile)) {
|
||||
Map<String, String> fileNames = new TreeMap<String, String>(String.CASE_INSENSITIVE_ORDER);
|
||||
for (Pair<String, String> nameurl : FileUtil.readNameUrlFile(listFile)) {
|
||||
// we use a map instead of a set since we need to match case-insensitively but still map to the correct case
|
||||
final Map<String, String> fileNames = new TreeMap<String, String>(String.CASE_INSENSITIVE_ORDER);
|
||||
for (final Pair<String, String> nameurl : FileUtil.readNameUrlFile(listFile)) {
|
||||
// we use a map instead of a set since we need to match case-insensitively but still map to the correct case
|
||||
fileNames.put(nameurl.getLeft(), nameurl.getLeft());
|
||||
}
|
||||
_fileNameDb.put(listFile, fileNames);
|
||||
}
|
||||
|
||||
|
||||
final Map<String, String> fileDb = _fileNameDb.get(listFile);
|
||||
_analyzeListedDir(root, targetDir, new _ListedAnalyzer() {
|
||||
@Override public String map(String filename) { return fileDb.containsKey(filename) ? fileDb.get(filename) : null; }
|
||||
@Override public OpType getOpType(String filename) { return opType; }
|
||||
@Override public String map(final String filename) { return fileDb.containsKey(filename) ? fileDb.get(filename) : null; }
|
||||
@Override public OpType getOpType(final String filename) { return opType; }
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
private abstract class _ListedAnalyzer {
|
||||
abstract String map(String filename);
|
||||
abstract OpType getOpType(String filename);
|
||||
|
||||
|
||||
// returns whether the directory has been handled
|
||||
boolean onDir(File dir) { return false; }
|
||||
boolean onDir(final File dir) { return false; }
|
||||
}
|
||||
|
||||
private void _analyzeListedDir(File root, final String targetDir, final _ListedAnalyzer listedAnalyzer) {
|
||||
|
||||
private void _analyzeListedDir(final File root, final String targetDir, final _ListedAnalyzer listedAnalyzer) {
|
||||
_analyzeDir(root, new _Analyzer() {
|
||||
@Override void onFile(File file) {
|
||||
String filename = listedAnalyzer.map(file.getName());
|
||||
@Override void onFile(final File file) {
|
||||
final String filename = listedAnalyzer.map(file.getName());
|
||||
if (null != filename) {
|
||||
File targetFile = new File(targetDir, filename);
|
||||
final File targetFile = new File(targetDir, filename);
|
||||
if (!file.equals(targetFile)) {
|
||||
_cb.addOp(listedAnalyzer.getOpType(filename), file, targetFile);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override boolean onDir(File dir) { return listedAnalyzer.onDir(dir); }
|
||||
|
||||
@Override boolean onDir(final File dir) { return listedAnalyzer.onDir(dir); }
|
||||
});
|
||||
}
|
||||
|
||||
private int _countFiles(File root) {
|
||||
|
||||
private int _countFiles(final File root) {
|
||||
int count = 0;
|
||||
for (File file : root.listFiles()) {
|
||||
for (final File file : root.listFiles()) {
|
||||
if (_cb.checkCancel()) { return 0; }
|
||||
|
||||
|
||||
if (file.isFile()) {
|
||||
++count;
|
||||
} else if (file.isDirectory()) {
|
||||
@@ -646,14 +650,14 @@ public class ImportSourceAnalyzer {
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
private String _lcaseExt(String filename) {
|
||||
int lastDotIdx = filename.lastIndexOf('.');
|
||||
|
||||
private static String _lcaseExt(final String filename) {
|
||||
final int lastDotIdx = filename.lastIndexOf('.');
|
||||
if (0 > lastDotIdx) {
|
||||
return filename;
|
||||
}
|
||||
String basename = filename.substring(0, lastDotIdx);
|
||||
String ext = filename.substring(lastDotIdx).toLowerCase(Locale.ENGLISH);
|
||||
final String basename = filename.substring(0, lastDotIdx);
|
||||
final String ext = filename.substring(lastDotIdx).toLowerCase(Locale.ENGLISH);
|
||||
if (filename.endsWith(ext)) {
|
||||
return filename;
|
||||
}
|
||||
|
||||
@@ -6,18 +6,36 @@
|
||||
* 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 forge.gui;
|
||||
|
||||
import java.awt.Component;
|
||||
import java.awt.Dimension;
|
||||
import java.awt.event.KeyAdapter;
|
||||
import java.awt.event.KeyEvent;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
import javax.swing.AbstractListModel;
|
||||
import javax.swing.DefaultListCellRenderer;
|
||||
import javax.swing.JList;
|
||||
import javax.swing.ListCellRenderer;
|
||||
import javax.swing.ListSelectionModel;
|
||||
import javax.swing.SwingUtilities;
|
||||
import javax.swing.WindowConstants;
|
||||
import javax.swing.event.ListSelectionEvent;
|
||||
import javax.swing.event.ListSelectionListener;
|
||||
|
||||
import com.google.common.base.Function;
|
||||
import com.google.common.collect.Lists;
|
||||
|
||||
@@ -27,17 +45,6 @@ import forge.toolbox.FMouseAdapter;
|
||||
import forge.toolbox.FOptionPane;
|
||||
import forge.toolbox.FScrollPane;
|
||||
|
||||
import javax.swing.*;
|
||||
import javax.swing.event.ListSelectionEvent;
|
||||
import javax.swing.event.ListSelectionListener;
|
||||
|
||||
import java.awt.*;
|
||||
import java.awt.event.KeyAdapter;
|
||||
import java.awt.event.KeyEvent;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* A simple class that shows a list of choices in a dialog. Two properties
|
||||
* influence the behavior of a list chooser: minSelection and maxSelection.
|
||||
@@ -46,8 +53,8 @@ import java.util.List;
|
||||
* and the choice doesn't matter.
|
||||
* <ul>
|
||||
* <li>If minSelection is 0, there will be a Cancel button.</li>
|
||||
* <li>If minSelection is -1, 0 or 1, double-clicking a choice will also close the
|
||||
* dialog.</li>
|
||||
* <li>If minSelection is -1, 0 or 1, double-clicking a choice will also close
|
||||
* the dialog.</li>
|
||||
* <li>If the number of selections is out of bounds, the "OK" button is
|
||||
* disabled.</li>
|
||||
* <li>The dialog was "committed" if "OK" was clicked or a choice was double
|
||||
@@ -56,7 +63,7 @@ import java.util.List;
|
||||
* <li>If the dialog was canceled, the selection will be empty.</li>
|
||||
* <li>
|
||||
* </ul>
|
||||
*
|
||||
*
|
||||
* @param <T>
|
||||
* the generic type
|
||||
* @author Forge
|
||||
@@ -64,15 +71,15 @@ import java.util.List;
|
||||
*/
|
||||
public class ListChooser<T> {
|
||||
// Data and number of choices for the list
|
||||
private List<T> list;
|
||||
private int minChoices, maxChoices;
|
||||
private final List<T> list;
|
||||
private final int minChoices, maxChoices;
|
||||
|
||||
// Flag: was the dialog already shown?
|
||||
private boolean called;
|
||||
|
||||
// initialized before; listeners may be added to it
|
||||
private FList<T> lstChoices;
|
||||
private FOptionPane optionPane;
|
||||
private final FList<T> lstChoices;
|
||||
private final FOptionPane optionPane;
|
||||
|
||||
public ListChooser(final String title, final int minChoices, final int maxChoices, final Collection<T> list, final Function<T, String> display) {
|
||||
FThreads.assertExecutedByEdt(true);
|
||||
@@ -97,7 +104,7 @@ public class ListChooser<T> {
|
||||
this.lstChoices.setCellRenderer(new TransformedCellRenderer(display));
|
||||
}
|
||||
|
||||
FScrollPane listScroller = new FScrollPane(this.lstChoices, true);
|
||||
final FScrollPane listScroller = new FScrollPane(this.lstChoices, true);
|
||||
int minWidth = this.lstChoices.getAutoSizeWidth();
|
||||
if (this.lstChoices.getModel().getSize() > this.lstChoices.getVisibleRowCount()) {
|
||||
minWidth += listScroller.getVerticalScrollBar().getPreferredSize().width;
|
||||
@@ -120,16 +127,14 @@ public class ListChooser<T> {
|
||||
}
|
||||
|
||||
this.lstChoices.addKeyListener(new KeyAdapter() {
|
||||
@Override
|
||||
public void keyPressed(KeyEvent e) {
|
||||
@Override public void keyPressed(final KeyEvent e) {
|
||||
if (e.getKeyCode() == KeyEvent.VK_ENTER) {
|
||||
ListChooser.this.commit();
|
||||
}
|
||||
}
|
||||
});
|
||||
this.lstChoices.addMouseListener(new FMouseAdapter() {
|
||||
@Override
|
||||
public void onLeftClick(MouseEvent e) {
|
||||
@Override public void onLeftClick(final MouseEvent e) {
|
||||
if (e.getClickCount() == 2) {
|
||||
ListChooser.this.commit();
|
||||
}
|
||||
@@ -140,7 +145,7 @@ public class ListChooser<T> {
|
||||
/**
|
||||
* Returns the FList used in the list chooser. this is useful for
|
||||
* registering listeners before showing the dialog.
|
||||
*
|
||||
*
|
||||
* @return a {@link javax.swing.JList} object.
|
||||
*/
|
||||
public FList<T> getLstChoices() {
|
||||
@@ -154,7 +159,7 @@ public class ListChooser<T> {
|
||||
|
||||
/**
|
||||
* Shows the dialog and returns after the dialog was closed.
|
||||
*
|
||||
*
|
||||
* @param index0 index to select when shown
|
||||
* @return a boolean.
|
||||
*/
|
||||
@@ -194,7 +199,7 @@ public class ListChooser<T> {
|
||||
/**
|
||||
* Returns if the dialog was closed by pressing "OK" or double clicking an
|
||||
* option the last time.
|
||||
*
|
||||
*
|
||||
* @return a boolean.
|
||||
*/
|
||||
public boolean isCommitted() {
|
||||
@@ -206,7 +211,7 @@ public class ListChooser<T> {
|
||||
|
||||
/**
|
||||
* Returns the selected indices as a list of integers.
|
||||
*
|
||||
*
|
||||
* @return a {@link java.util.List} object.
|
||||
*/
|
||||
public int[] getSelectedIndices() {
|
||||
@@ -219,7 +224,7 @@ public class ListChooser<T> {
|
||||
/**
|
||||
* Returns the selected values as a list of objects. no casts are necessary
|
||||
* when retrieving the objects.
|
||||
*
|
||||
*
|
||||
* @return a {@link java.util.List} object.
|
||||
*/
|
||||
public List<T> getSelectedValues() {
|
||||
@@ -231,7 +236,7 @@ public class ListChooser<T> {
|
||||
|
||||
/**
|
||||
* Returns the (minimum) selected index, or -1.
|
||||
*
|
||||
*
|
||||
* @return a int.
|
||||
*/
|
||||
public int getSelectedIndex() {
|
||||
@@ -243,14 +248,14 @@ public class ListChooser<T> {
|
||||
|
||||
/**
|
||||
* Returns the (first) selected value, or null.
|
||||
*
|
||||
*
|
||||
* @return a T object.
|
||||
*/
|
||||
public T getSelectedValue() {
|
||||
if (!this.called) {
|
||||
throw new IllegalStateException("not yet shown");
|
||||
}
|
||||
return (T) this.lstChoices.getSelectedValue();
|
||||
return this.lstChoices.getSelectedValue();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -302,7 +307,7 @@ public class ListChooser<T> {
|
||||
* @see javax.swing.ListCellRenderer#getListCellRendererComponent(javax.swing.JList, java.lang.Object, int, boolean, boolean)
|
||||
*/
|
||||
@Override
|
||||
public Component getListCellRendererComponent(JList<? extends T> list, T value, int index, boolean isSelected, boolean cellHasFocus) {
|
||||
public Component getListCellRendererComponent(final JList<? extends T> list, final T value, final int index, final boolean isSelected, final boolean cellHasFocus) {
|
||||
// TODO Auto-generated method stub
|
||||
return defRenderer.getListCellRendererComponent(list, transformer.apply(value), index, isSelected, cellHasFocus);
|
||||
}
|
||||
|
||||
@@ -6,19 +6,21 @@
|
||||
* 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 forge.gui;
|
||||
|
||||
import javax.swing.*;
|
||||
import java.awt.*;
|
||||
import java.awt.Rectangle;
|
||||
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.SwingConstants;
|
||||
|
||||
/**
|
||||
* A {@link JLabel} with support for multi-line text that wraps when the line
|
||||
@@ -26,7 +28,7 @@ import java.awt.*;
|
||||
* {@link MultiLineLabelUI}, the default UI delegate of this component. The text
|
||||
* in the label can be horizontally and vertically aligned, relative to the
|
||||
* bounds of the component.
|
||||
*
|
||||
*
|
||||
* @author Samuel Sjoberg, http://samuelsjoberg.com
|
||||
* @version 1.0.0
|
||||
*/
|
||||
@@ -62,7 +64,7 @@ public class MultiLineLabel extends JLabel {
|
||||
|
||||
/**
|
||||
* Creates a new label with <code>text</code> value.
|
||||
*
|
||||
*
|
||||
* @param text
|
||||
* the value of the label
|
||||
*/
|
||||
@@ -73,7 +75,7 @@ public class MultiLineLabel extends JLabel {
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
*
|
||||
* @return a {@link java.awt.Rectangle} object.
|
||||
*/
|
||||
@Override
|
||||
@@ -86,7 +88,7 @@ public class MultiLineLabel extends JLabel {
|
||||
|
||||
/**
|
||||
* Set the vertical text alignment.
|
||||
*
|
||||
*
|
||||
* @param alignment
|
||||
* vertical alignment
|
||||
*/
|
||||
@@ -97,7 +99,7 @@ public class MultiLineLabel extends JLabel {
|
||||
|
||||
/**
|
||||
* Set the horizontal text alignment.
|
||||
*
|
||||
*
|
||||
* @param alignment
|
||||
* horizontal alignment
|
||||
*/
|
||||
@@ -108,7 +110,7 @@ public class MultiLineLabel extends JLabel {
|
||||
|
||||
/**
|
||||
* Get the vertical text alignment.
|
||||
*
|
||||
*
|
||||
* @return vertical text alignment
|
||||
*/
|
||||
public int getVerticalTextAlignment() {
|
||||
@@ -117,7 +119,7 @@ public class MultiLineLabel extends JLabel {
|
||||
|
||||
/**
|
||||
* Get the horizontal text alignment.
|
||||
*
|
||||
*
|
||||
* @return horizontal text alignment
|
||||
*/
|
||||
public int getHorizontalTextAlignment() {
|
||||
|
||||
@@ -6,23 +6,22 @@
|
||||
* 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 forge.gui;
|
||||
|
||||
import javax.swing.*;
|
||||
import javax.swing.plaf.ComponentUI;
|
||||
import javax.swing.plaf.LabelUI;
|
||||
import javax.swing.plaf.basic.BasicLabelUI;
|
||||
import javax.swing.text.*;
|
||||
import java.awt.*;
|
||||
import java.awt.Dimension;
|
||||
import java.awt.FontMetrics;
|
||||
import java.awt.Graphics;
|
||||
import java.awt.Insets;
|
||||
import java.awt.Rectangle;
|
||||
import java.awt.event.ComponentEvent;
|
||||
import java.awt.event.ComponentListener;
|
||||
import java.beans.PropertyChangeEvent;
|
||||
@@ -30,6 +29,20 @@ import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
import javax.swing.Icon;
|
||||
import javax.swing.JComponent;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.SwingConstants;
|
||||
import javax.swing.plaf.LabelUI;
|
||||
import javax.swing.plaf.basic.BasicLabelUI;
|
||||
import javax.swing.text.BadLocationException;
|
||||
import javax.swing.text.Document;
|
||||
import javax.swing.text.Element;
|
||||
import javax.swing.text.PlainDocument;
|
||||
import javax.swing.text.Segment;
|
||||
import javax.swing.text.Utilities;
|
||||
import javax.swing.text.View;
|
||||
|
||||
/**
|
||||
* Label UI delegate that supports multiple lines and line wrapping. Hard line
|
||||
* breaks (<code>\n</code>) are preserved. If the dimensions of the label is too
|
||||
@@ -42,7 +55,7 @@ import java.util.List;
|
||||
* <p/>
|
||||
* Example of usage:
|
||||
* <p/>
|
||||
*
|
||||
*
|
||||
* <pre>
|
||||
* JLabel myLabel = new JLabel();
|
||||
* myLabel.setUI(MultiLineLabelUI.labelUI);
|
||||
@@ -55,7 +68,7 @@ import java.util.List;
|
||||
* by overriding {@link #paintEnabledText(JLabel, Graphics, String, int, int)}
|
||||
* and {@link #paintDisabledText(JLabel, Graphics, String, int, int)}. This
|
||||
* class is designed to be easily extended by subclasses.
|
||||
*
|
||||
*
|
||||
* @author Samuel Sjoberg, http://samuelsjoberg.com
|
||||
* @version 1.3.0
|
||||
*/
|
||||
@@ -95,17 +108,6 @@ public class MultiLineLabelUI extends BasicLabelUI implements ComponentListener
|
||||
*/
|
||||
private static int defaultSize = 4;
|
||||
|
||||
/**
|
||||
* Get the shared UI instance.
|
||||
*
|
||||
* @param c
|
||||
* the c
|
||||
* @return a ComponentUI
|
||||
*/
|
||||
public static ComponentUI createUI(final JComponent c) {
|
||||
return MultiLineLabelUI.getLabelUI();
|
||||
}
|
||||
|
||||
/** {@inheritDoc} */
|
||||
@Override
|
||||
protected void uninstallDefaults(final JLabel c) {
|
||||
@@ -129,7 +131,7 @@ public class MultiLineLabelUI extends BasicLabelUI implements ComponentListener
|
||||
|
||||
/**
|
||||
* Clear the wrapped line cache.
|
||||
*
|
||||
*
|
||||
* @param l
|
||||
* the label containing a cached value
|
||||
*/
|
||||
@@ -150,7 +152,7 @@ public class MultiLineLabelUI extends BasicLabelUI implements ComponentListener
|
||||
/**
|
||||
* Calculate the paint rectangles for the icon and text for the passed
|
||||
* label.
|
||||
*
|
||||
*
|
||||
* @param l
|
||||
* a label
|
||||
* @param fm
|
||||
@@ -193,7 +195,7 @@ public class MultiLineLabelUI extends BasicLabelUI implements ComponentListener
|
||||
* <p>
|
||||
* prepareGraphics.
|
||||
* </p>
|
||||
*
|
||||
*
|
||||
* @param g
|
||||
* a {@link java.awt.Graphics} object.
|
||||
*/
|
||||
@@ -237,7 +239,7 @@ public class MultiLineLabelUI extends BasicLabelUI implements ComponentListener
|
||||
|
||||
/**
|
||||
* Paint the wrapped text lines.
|
||||
*
|
||||
*
|
||||
* @param g
|
||||
* graphics component to paint on
|
||||
* @param label
|
||||
@@ -288,7 +290,7 @@ public class MultiLineLabelUI extends BasicLabelUI implements ComponentListener
|
||||
/**
|
||||
* Returns the available height to paint text on. This is the height of the
|
||||
* passed component with insets subtracted.
|
||||
*
|
||||
*
|
||||
* @param l
|
||||
* a component
|
||||
* @return the available height
|
||||
@@ -301,7 +303,7 @@ public class MultiLineLabelUI extends BasicLabelUI implements ComponentListener
|
||||
/**
|
||||
* Add a clip indication to the string. It is important that the string
|
||||
* length does not exceed the length or the original string.
|
||||
*
|
||||
*
|
||||
* @param text
|
||||
* the to be painted
|
||||
* @param fm
|
||||
@@ -324,7 +326,7 @@ public class MultiLineLabelUI extends BasicLabelUI implements ComponentListener
|
||||
/**
|
||||
* Establish the vertical text alignment. The default alignment is to center
|
||||
* the text in the label.
|
||||
*
|
||||
*
|
||||
* @param label
|
||||
* the label to paint
|
||||
* @param fm
|
||||
@@ -359,7 +361,7 @@ public class MultiLineLabelUI extends BasicLabelUI implements ComponentListener
|
||||
* <p>
|
||||
* getAscent.
|
||||
* </p>
|
||||
*
|
||||
*
|
||||
* @param fm
|
||||
* a {@link java.awt.FontMetrics} object.
|
||||
* @return a int.
|
||||
@@ -371,7 +373,7 @@ public class MultiLineLabelUI extends BasicLabelUI implements ComponentListener
|
||||
/**
|
||||
* Establish the horizontal text alignment. The default alignment is left
|
||||
* aligned text.
|
||||
*
|
||||
*
|
||||
* @param label
|
||||
* the label to paint
|
||||
* @param fm
|
||||
@@ -401,7 +403,7 @@ public class MultiLineLabelUI extends BasicLabelUI implements ComponentListener
|
||||
* Check the given string to see if it should be rendered as HTML. Code
|
||||
* based on implementation found in
|
||||
* <code>BasicHTML.isHTMLString(String)</code> in future JDKs.
|
||||
*
|
||||
*
|
||||
* @param s
|
||||
* the string
|
||||
* @return <code>true</code> if string is HTML, otherwise <code>false</code>
|
||||
@@ -453,7 +455,7 @@ public class MultiLineLabelUI extends BasicLabelUI implements ComponentListener
|
||||
/**
|
||||
* The preferred height of the label is the height of the lines with added
|
||||
* top and bottom insets.
|
||||
*
|
||||
*
|
||||
* @param label
|
||||
* the label
|
||||
* @return the preferred height of the wrapped lines.
|
||||
@@ -467,7 +469,7 @@ public class MultiLineLabelUI extends BasicLabelUI implements ComponentListener
|
||||
/**
|
||||
* Get the lines of text contained in the text label. The prepared lines is
|
||||
* cached as a client property, accessible via {@link #PROPERTY_KEY}.
|
||||
*
|
||||
*
|
||||
* @param l
|
||||
* the label
|
||||
* @return the text lines of the label.
|
||||
@@ -509,7 +511,7 @@ public class MultiLineLabelUI extends BasicLabelUI implements ComponentListener
|
||||
/**
|
||||
* Prepare the text lines for rendering. The lines are wrapped to fit in the
|
||||
* current available space for text. Explicit line breaks are preserved.
|
||||
*
|
||||
*
|
||||
* @param l
|
||||
* the label to render
|
||||
* @return a list of text lines to render
|
||||
@@ -535,7 +537,7 @@ public class MultiLineLabelUI extends BasicLabelUI implements ComponentListener
|
||||
|
||||
/**
|
||||
* If necessary, wrap the text into multiple lines.
|
||||
*
|
||||
*
|
||||
* @param lines
|
||||
* line array in which to store the wrapped lines
|
||||
* @param elem
|
||||
@@ -557,7 +559,7 @@ public class MultiLineLabelUI extends BasicLabelUI implements ComponentListener
|
||||
|
||||
/**
|
||||
* Calculate the position on which to break (wrap) the line.
|
||||
*
|
||||
*
|
||||
* @param doc
|
||||
* the document
|
||||
* @param p0
|
||||
@@ -583,26 +585,16 @@ public class MultiLineLabelUI extends BasicLabelUI implements ComponentListener
|
||||
|
||||
/**
|
||||
* Gets the label ui.
|
||||
*
|
||||
*
|
||||
* @return the labelUI
|
||||
*/
|
||||
public static LabelUI getLabelUI() {
|
||||
return MultiLineLabelUI.labelUI;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the label ui.
|
||||
*
|
||||
* @param labelUI
|
||||
* the new label ui
|
||||
*/
|
||||
public static void setLabelUI(final LabelUI labelUI) {
|
||||
MultiLineLabelUI.labelUI = labelUI;
|
||||
}
|
||||
|
||||
/**
|
||||
* Static singleton {@link Segment} cache.
|
||||
*
|
||||
*
|
||||
* @author Samuel Sjoberg
|
||||
* @see javax.swing.text.SegmentCache
|
||||
*/
|
||||
@@ -627,7 +619,7 @@ public class MultiLineLabelUI extends BasicLabelUI implements ComponentListener
|
||||
/**
|
||||
* Returns a <code>Segment</code>. When done, the <code>Segment</code>
|
||||
* should be recycled by invoking {@link #releaseSegment(Segment)}.
|
||||
*
|
||||
*
|
||||
* @return a <code>Segment</code>.
|
||||
*/
|
||||
public static Segment getSegment() {
|
||||
@@ -642,7 +634,7 @@ public class MultiLineLabelUI extends BasicLabelUI implements ComponentListener
|
||||
* Releases a <code>Segment</code>. A segment should not be used after
|
||||
* it is released, and a segment should never be released more than
|
||||
* once.
|
||||
*
|
||||
*
|
||||
* @param segment
|
||||
* the segment
|
||||
*/
|
||||
|
||||
@@ -2,14 +2,12 @@ package forge.gui;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.awt.Component;
|
||||
import java.awt.Dimension;
|
||||
import java.awt.KeyboardFocusManager;
|
||||
import java.awt.Rectangle;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.Timer;
|
||||
|
||||
import net.miginfocom.swing.MigLayout;
|
||||
import forge.Singletons;
|
||||
@@ -19,17 +17,21 @@ import forge.toolbox.FOverlay;
|
||||
import forge.toolbox.FPanel;
|
||||
import forge.toolbox.FSkin;
|
||||
import forge.toolbox.FSkin.SkinnedButton;
|
||||
import forge.toolbox.FSkin.SkinnedLabel;
|
||||
|
||||
/**
|
||||
/**
|
||||
* All overlay interaction is handled here.
|
||||
*
|
||||
* <br><br><i>(S at beginning of class name denotes a static factory.)</i>
|
||||
*/
|
||||
public final class SOverlayUtils {
|
||||
private static int counter = 0;
|
||||
|
||||
/**
|
||||
/**
|
||||
* Private constructor to prevent instantiation.
|
||||
*/
|
||||
private SOverlayUtils() {
|
||||
}
|
||||
|
||||
/**
|
||||
* A standardized overlay for a game start condition.
|
||||
*/
|
||||
public static void startGameOverlay() {
|
||||
@@ -58,46 +60,6 @@ public final class SOverlayUtils {
|
||||
}
|
||||
|
||||
/**
|
||||
* A standardized overlay for a loading condition (note: thread issues, as of 1-Mar-12).
|
||||
* @param msg0   {@link java.lang.String}
|
||||
* @return {@link javax.swing.JPanel}
|
||||
*/
|
||||
// NOTE: This animation happens on the EDT; if the EDT is tied up doing something
|
||||
// else, the animation is effectively frozen. So, this needs some work.
|
||||
public static JPanel loadingOverlay(final String msg0) {
|
||||
final JPanel overlay = SOverlayUtils.genericOverlay();
|
||||
final FPanel pnlLoading = new FPanel();
|
||||
final int w = overlay.getWidth();
|
||||
final int h = overlay.getHeight();
|
||||
|
||||
final SkinnedLabel lblLoading = new SkinnedLabel("");
|
||||
lblLoading.setOpaque(true);
|
||||
lblLoading.setBackground(FSkin.getColor(FSkin.Colors.CLR_TEXT));
|
||||
lblLoading.setMinimumSize(new Dimension(0, 20));
|
||||
|
||||
pnlLoading.setBounds(((w - 170) / 2), ((h - 80) / 2), 170, 80);
|
||||
pnlLoading.setLayout(new MigLayout("wrap, align center"));
|
||||
pnlLoading.add(new FLabel.Builder().fontSize(18)
|
||||
.text(msg0).build(), "h 20px!, w 140px!, gap 0 0 5px 0");
|
||||
pnlLoading.add(lblLoading, "gap 0 0 0 10px");
|
||||
|
||||
overlay.add(pnlLoading);
|
||||
|
||||
SOverlayUtils.counter = 0;
|
||||
final Timer timer = new Timer(300, new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent arg0) {
|
||||
lblLoading.setMinimumSize(new Dimension(10 * (SOverlayUtils.counter++), 20));
|
||||
lblLoading.revalidate();
|
||||
if (SOverlayUtils.counter > 13) { SOverlayUtils.counter = 0; }
|
||||
}
|
||||
});
|
||||
timer.start();
|
||||
|
||||
return overlay;
|
||||
}
|
||||
|
||||
/**
|
||||
* A template overlay with close button, null layout, ready for anything.
|
||||
* @return {@link javax.swing.JPanel}
|
||||
*/
|
||||
@@ -113,7 +75,7 @@ public final class SOverlayUtils {
|
||||
btnCloseTopRight.setBackground(new Color(0, 0, 0));
|
||||
btnCloseTopRight.setFocusPainted(false);
|
||||
btnCloseTopRight.addActionListener(new ActionListener() { @Override
|
||||
public void actionPerformed(ActionEvent arg0) { SOverlayUtils.hideOverlay(); } });
|
||||
public void actionPerformed(final ActionEvent arg0) { SOverlayUtils.hideOverlay(); } });
|
||||
|
||||
overlay.removeAll();
|
||||
overlay.setLayout(null);
|
||||
@@ -126,7 +88,7 @@ public final class SOverlayUtils {
|
||||
public static boolean overlayHasFocus() {
|
||||
return _overlayHasFocus;
|
||||
}
|
||||
|
||||
|
||||
private static Component prevFocusOwner;
|
||||
public static void showOverlay() {
|
||||
Singletons.getView().getNavigationBar().setEnabled(false);
|
||||
|
||||
@@ -1,18 +1,21 @@
|
||||
package forge.gui;
|
||||
|
||||
import javax.swing.*;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
import javax.swing.AbstractListModel;
|
||||
import javax.swing.ListModel;
|
||||
|
||||
import com.google.common.collect.Lists;
|
||||
|
||||
@SuppressWarnings("serial")
|
||||
public class UnsortedListModel<T> extends AbstractListModel<T> {
|
||||
List<T> model;
|
||||
final List<T> model;
|
||||
|
||||
public UnsortedListModel() {
|
||||
model = new ArrayList<T>();
|
||||
model = Lists.newArrayList();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -21,25 +24,17 @@ public class UnsortedListModel<T> extends AbstractListModel<T> {
|
||||
}
|
||||
|
||||
@Override
|
||||
public T getElementAt(int index) {
|
||||
public T getElementAt(final int index) {
|
||||
return model.get(index);
|
||||
}
|
||||
|
||||
public void add(T element) {
|
||||
public void add(final T element) {
|
||||
model.add(element);
|
||||
fireIntervalAdded(this, getSize() - 1, getSize() - 1);
|
||||
fireContentsChanged(this, 0, getSize() - 1);
|
||||
}
|
||||
|
||||
public void addAll(T[] elements) {
|
||||
for (T e : elements) {
|
||||
model.add(e);
|
||||
}
|
||||
fireIntervalAdded(this, getSize() - elements.length, getSize() - 1);
|
||||
fireContentsChanged(this, 0, getSize() - 1);
|
||||
}
|
||||
|
||||
public void addAll(Collection<T> elements) {
|
||||
public void addAll(final Collection<T> elements) {
|
||||
if (elements.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
@@ -48,23 +43,23 @@ public class UnsortedListModel<T> extends AbstractListModel<T> {
|
||||
fireContentsChanged(this, 0, getSize() - 1);
|
||||
}
|
||||
|
||||
public void addAll(ListModel<T> otherModel) {
|
||||
Collection<T> elements = new ArrayList<T>();
|
||||
int size = otherModel.getSize();
|
||||
public void addAll(final ListModel<T> otherModel) {
|
||||
final Collection<T> elements = new ArrayList<T>();
|
||||
final int size = otherModel.getSize();
|
||||
for (int i = 0; size > i; ++i) {
|
||||
elements.add((T)otherModel.getElementAt(i));
|
||||
elements.add(otherModel.getElementAt(i));
|
||||
}
|
||||
addAll(elements);
|
||||
}
|
||||
|
||||
public void clear() {
|
||||
int prevSize = getSize();
|
||||
final int prevSize = getSize();
|
||||
model.clear();
|
||||
fireIntervalRemoved(this, 0, prevSize - 1);
|
||||
fireContentsChanged(this, 0, prevSize - 1);
|
||||
}
|
||||
|
||||
public boolean contains(Object element) {
|
||||
public boolean contains(final Object element) {
|
||||
return model.contains(element);
|
||||
}
|
||||
|
||||
@@ -72,7 +67,7 @@ public class UnsortedListModel<T> extends AbstractListModel<T> {
|
||||
return model.iterator();
|
||||
}
|
||||
|
||||
public void removeElement(int idx) {
|
||||
public void removeElement(final int idx) {
|
||||
model.remove(idx);
|
||||
fireIntervalRemoved(this, idx, idx);
|
||||
fireContentsChanged(this, 0, getSize());
|
||||
|
||||
@@ -1,7 +1,13 @@
|
||||
package forge.gui;
|
||||
|
||||
import javax.swing.*;
|
||||
import java.awt.*;
|
||||
import java.awt.Component;
|
||||
import java.awt.Container;
|
||||
import java.awt.Dimension;
|
||||
import java.awt.FlowLayout;
|
||||
import java.awt.Insets;
|
||||
|
||||
import javax.swing.JScrollPane;
|
||||
import javax.swing.SwingUtilities;
|
||||
|
||||
/**
|
||||
* FlowLayout subclass that fully supports wrapping of components.
|
||||
@@ -9,141 +15,141 @@ import java.awt.*;
|
||||
@SuppressWarnings("serial")
|
||||
public class WrapLayout extends FlowLayout {
|
||||
/**
|
||||
* Constructs a new <code>WrapLayout</code> with a left
|
||||
* alignment and a default 5-unit horizontal and vertical gap.
|
||||
*/
|
||||
* Constructs a new <code>WrapLayout</code> with a left
|
||||
* alignment and a default 5-unit horizontal and vertical gap.
|
||||
*/
|
||||
public WrapLayout() {
|
||||
super();
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs a new <code>FlowLayout</code> with the specified
|
||||
* alignment and a default 5-unit horizontal and vertical gap.
|
||||
* The value of the alignment argument must be one of
|
||||
* <code>FlowLayout.LEFT</code>, <code>FlowLayout.CENTER</code>,
|
||||
* or <code>FlowLayout.RIGHT</code>.
|
||||
* @param align the alignment value
|
||||
*/
|
||||
public WrapLayout(int align) {
|
||||
* Constructs a new <code>FlowLayout</code> with the specified
|
||||
* alignment and a default 5-unit horizontal and vertical gap.
|
||||
* The value of the alignment argument must be one of
|
||||
* <code>FlowLayout.LEFT</code>, <code>FlowLayout.CENTER</code>,
|
||||
* or <code>FlowLayout.RIGHT</code>.
|
||||
* @param align the alignment value
|
||||
*/
|
||||
public WrapLayout(final int align) {
|
||||
super(align);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new flow layout manager with the indicated alignment
|
||||
* and the indicated horizontal and vertical gaps.
|
||||
* <p>
|
||||
* The value of the alignment argument must be one of
|
||||
* <code>FlowLayout.LEFT</code>, <code>FlowLayout.CENTER</code>,
|
||||
* or <code>FlowLayout.RIGHT</code>.
|
||||
* @param align the alignment value
|
||||
* @param hgap the horizontal gap between components
|
||||
* @param vgap the vertical gap between components
|
||||
*/
|
||||
public WrapLayout(int align, int hgap, int vgap) {
|
||||
* Creates a new flow layout manager with the indicated alignment
|
||||
* and the indicated horizontal and vertical gaps.
|
||||
* <p>
|
||||
* The value of the alignment argument must be one of
|
||||
* <code>FlowLayout.LEFT</code>, <code>FlowLayout.CENTER</code>,
|
||||
* or <code>FlowLayout.RIGHT</code>.
|
||||
* @param align the alignment value
|
||||
* @param hgap the horizontal gap between components
|
||||
* @param vgap the vertical gap between components
|
||||
*/
|
||||
public WrapLayout(final int align, final int hgap, final int vgap) {
|
||||
super(align, hgap, vgap);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the preferred dimensions for this layout given the
|
||||
* <i>visible</i> components in the specified target container.
|
||||
* @param target the component which needs to be laid out
|
||||
* Returns the preferred dimensions for this layout given the
|
||||
* <i>visible</i> components in the specified target container.
|
||||
* @param target the component which needs to be laid out
|
||||
* @return the preferred dimensions to lay out the
|
||||
* subcomponents of the specified container
|
||||
*/
|
||||
* subcomponents of the specified container
|
||||
*/
|
||||
@Override
|
||||
public Dimension preferredLayoutSize(Container target) {
|
||||
public Dimension preferredLayoutSize(final Container target) {
|
||||
return layoutSize(target, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the minimum dimensions needed to layout the <i>visible</i>
|
||||
* components contained in the specified target container.
|
||||
* @param target the component which needs to be laid out
|
||||
* @return the minimum dimensions to lay out the
|
||||
* subcomponents of the specified container
|
||||
*/
|
||||
* Returns the minimum dimensions needed to layout the <i>visible</i>
|
||||
* components contained in the specified target container.
|
||||
* @param target the component which needs to be laid out
|
||||
* @return the minimum dimensions to lay out the
|
||||
* subcomponents of the specified container
|
||||
*/
|
||||
@Override
|
||||
public Dimension minimumLayoutSize(Container target) {
|
||||
Dimension minimum = layoutSize(target, false);
|
||||
public Dimension minimumLayoutSize(final Container target) {
|
||||
final Dimension minimum = layoutSize(target, false);
|
||||
minimum.width -= (getHgap() + 1);
|
||||
return minimum;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the minimum or preferred dimension needed to layout the target
|
||||
* container.
|
||||
*
|
||||
* @param target target to get layout size for
|
||||
* @param preferred should preferred size be calculated
|
||||
* @return the dimension to layout the target container
|
||||
*/
|
||||
private Dimension layoutSize(Container target, boolean preferred) {
|
||||
synchronized (target.getTreeLock()) {
|
||||
// Each row must fit with the width allocated to the container.
|
||||
// When the container width = 0, the preferred width of the container
|
||||
// has not yet been calculated so we use a width guaranteed to be less
|
||||
// than we need so that it gets recalculated later when the widget is
|
||||
// shown.
|
||||
|
||||
int hgap = getHgap();
|
||||
Insets insets = target.getInsets();
|
||||
int horizontalInsetsAndGap = insets.left + insets.right + (hgap * 2);
|
||||
int targetWidth = Math.max(horizontalInsetsAndGap, target.getSize().width);
|
||||
int maxWidth = targetWidth - horizontalInsetsAndGap;
|
||||
|
||||
// Fit components into the allowed width
|
||||
Dimension dim = new Dimension(0, 0);
|
||||
int rowWidth = 0;
|
||||
int rowHeight = 0;
|
||||
|
||||
final int nmembers = target.getComponentCount();
|
||||
for (int i = 0; i < nmembers; i++) {
|
||||
Component m = target.getComponent(i);
|
||||
* Returns the minimum or preferred dimension needed to layout the target
|
||||
* container.
|
||||
*
|
||||
* @param target target to get layout size for
|
||||
* @param preferred should preferred size be calculated
|
||||
* @return the dimension to layout the target container
|
||||
*/
|
||||
private Dimension layoutSize(final Container target, final boolean preferred) {
|
||||
synchronized (target.getTreeLock()) {
|
||||
// Each row must fit with the width allocated to the container.
|
||||
// When the container width = 0, the preferred width of the container
|
||||
// has not yet been calculated so we use a width guaranteed to be less
|
||||
// than we need so that it gets recalculated later when the widget is
|
||||
// shown.
|
||||
|
||||
if (!m.isVisible()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
Dimension d = preferred ? m.getPreferredSize() : m.getMinimumSize();
|
||||
final int hgap = getHgap();
|
||||
final Insets insets = target.getInsets();
|
||||
final int horizontalInsetsAndGap = insets.left + insets.right + (hgap * 2);
|
||||
final int targetWidth = Math.max(horizontalInsetsAndGap, target.getSize().width);
|
||||
final int maxWidth = targetWidth - horizontalInsetsAndGap;
|
||||
|
||||
// can't add the component to current row. Start a new row if
|
||||
// there's at least one component in this row.
|
||||
if (0 < rowWidth && rowWidth + d.width > maxWidth) {
|
||||
addRow(dim, rowWidth, rowHeight);
|
||||
rowWidth = 0;
|
||||
rowHeight = 0;
|
||||
// Fit components into the allowed width
|
||||
final Dimension dim = new Dimension(0, 0);
|
||||
int rowWidth = 0;
|
||||
int rowHeight = 0;
|
||||
|
||||
final int nmembers = target.getComponentCount();
|
||||
for (int i = 0; i < nmembers; i++) {
|
||||
final Component m = target.getComponent(i);
|
||||
|
||||
if (!m.isVisible()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
final Dimension d = preferred ? m.getPreferredSize() : m.getMinimumSize();
|
||||
|
||||
// can't add the component to current row. Start a new row if
|
||||
// there's at least one component in this row.
|
||||
if (0 < rowWidth && rowWidth + d.width > maxWidth) {
|
||||
addRow(dim, rowWidth, rowHeight);
|
||||
rowWidth = 0;
|
||||
rowHeight = 0;
|
||||
}
|
||||
|
||||
// Add a horizontal gap for all components after the first
|
||||
if (rowWidth != 0) {
|
||||
rowWidth += hgap;
|
||||
}
|
||||
|
||||
rowWidth += d.width;
|
||||
rowHeight = Math.max(rowHeight, d.height);
|
||||
}
|
||||
|
||||
// Add a horizontal gap for all components after the first
|
||||
if (rowWidth != 0) {
|
||||
rowWidth += hgap;
|
||||
// add last row
|
||||
addRow(dim, rowWidth, rowHeight);
|
||||
|
||||
dim.width += horizontalInsetsAndGap;
|
||||
dim.height += insets.top + insets.bottom + getVgap() * 2;
|
||||
|
||||
// When using a scroll pane or the DecoratedLookAndFeel we need to
|
||||
// make sure the preferred size is less than the size of the
|
||||
// target container so shrinking the container size works
|
||||
// correctly. Removing the horizontal gap is an easy way to do this.
|
||||
|
||||
final Container scrollPane = SwingUtilities.getAncestorOfClass(JScrollPane.class, target);
|
||||
|
||||
if (scrollPane != null) {
|
||||
dim.width -= (hgap + 1);
|
||||
}
|
||||
|
||||
rowWidth += d.width;
|
||||
rowHeight = Math.max(rowHeight, d.height);
|
||||
return dim;
|
||||
}
|
||||
|
||||
// add last row
|
||||
addRow(dim, rowWidth, rowHeight);
|
||||
|
||||
dim.width += horizontalInsetsAndGap;
|
||||
dim.height += insets.top + insets.bottom + getVgap() * 2;
|
||||
|
||||
// When using a scroll pane or the DecoratedLookAndFeel we need to
|
||||
// make sure the preferred size is less than the size of the
|
||||
// target container so shrinking the container size works
|
||||
// correctly. Removing the horizontal gap is an easy way to do this.
|
||||
|
||||
Container scrollPane = SwingUtilities.getAncestorOfClass(JScrollPane.class, target);
|
||||
|
||||
if (scrollPane != null) {
|
||||
dim.width -= (hgap + 1);
|
||||
}
|
||||
|
||||
return dim;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* A new row has been completed. Use the dimensions of this row
|
||||
* to update the preferred size for the container.
|
||||
@@ -152,9 +158,9 @@ public class WrapLayout extends FlowLayout {
|
||||
* @param rowWidth the width of the row to add
|
||||
* @param rowHeight the height of the row to add
|
||||
*/
|
||||
private void addRow(Dimension dim, int rowWidth, int rowHeight) {
|
||||
private void addRow(final Dimension dim, final int rowWidth, final int rowHeight) {
|
||||
dim.width = Math.max(dim.width, rowWidth);
|
||||
|
||||
|
||||
if (dim.height > 0) {
|
||||
dim.height += getVgap();
|
||||
}
|
||||
|
||||
@@ -1,21 +1,11 @@
|
||||
package forge.gui.framework;
|
||||
|
||||
import forge.UiCommand;
|
||||
|
||||
/**
|
||||
/**
|
||||
* An intentionally empty ICDoc to fill field slots unused
|
||||
* by the current layout of a match UI.
|
||||
*/
|
||||
public class CEmptyDoc implements ICDoc {
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.framework.ICDoc#getCommandOnSelect()
|
||||
*/
|
||||
@Override
|
||||
public UiCommand getCommandOnSelect() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void register() {
|
||||
}
|
||||
|
||||
@@ -1,5 +1,20 @@
|
||||
package forge.gui.framework;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.awt.Dimension;
|
||||
import java.awt.Font;
|
||||
import java.awt.Graphics;
|
||||
import java.awt.event.MouseAdapter;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.SwingConstants;
|
||||
|
||||
import net.miginfocom.swing.MigLayout;
|
||||
|
||||
import com.google.common.collect.Lists;
|
||||
|
||||
import forge.assets.FSkinProp;
|
||||
@@ -10,15 +25,6 @@ import forge.toolbox.FPanel;
|
||||
import forge.toolbox.FSkin;
|
||||
import forge.toolbox.FSkin.SkinImage;
|
||||
import forge.view.FView;
|
||||
import net.miginfocom.swing.MigLayout;
|
||||
|
||||
import javax.swing.*;
|
||||
|
||||
import java.awt.*;
|
||||
import java.awt.event.MouseAdapter;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Top-level container in drag layout. A cell holds
|
||||
@@ -49,9 +55,6 @@ public final class DragCell extends JPanel implements ILocalRepaint {
|
||||
private final JLabel lblOverflow = new JLabel();
|
||||
private IVDoc<? extends ICDoc> docSelected = null;
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public DragCell() {
|
||||
super(new MigLayout("insets 0, gap 0, wrap 2"));
|
||||
|
||||
@@ -89,10 +92,10 @@ public final class DragCell extends JPanel implements ILocalRepaint {
|
||||
* <p>
|
||||
* Primarily used to toggle visibility of tabs.
|
||||
*/
|
||||
public void doCellLayout(boolean showTabs) {
|
||||
public void doCellLayout(final boolean showTabs) {
|
||||
this.removeAll();
|
||||
int borderT = SLayoutConstants.BORDER_T;
|
||||
int headH = ((showTabs || allDocs.size() > 1) ? SLayoutConstants.HEAD_H : 0);
|
||||
final int borderT = SLayoutConstants.BORDER_T;
|
||||
final int headH = ((showTabs || allDocs.size() > 1) ? SLayoutConstants.HEAD_H : 0);
|
||||
this.add(pnlHead,
|
||||
"w 100% - " + borderT + "px!" + ", " + "h " + headH + "px!");
|
||||
this.add(pnlBorderRight,
|
||||
@@ -109,8 +112,8 @@ public final class DragCell extends JPanel implements ILocalRepaint {
|
||||
/**
|
||||
* Determines visibility of tabs on game screen.
|
||||
*/
|
||||
private boolean showGameTabs() {
|
||||
ForgePreferences prefs = FModel.getPreferences();
|
||||
private static boolean showGameTabs() {
|
||||
final ForgePreferences prefs = FModel.getPreferences();
|
||||
return !prefs.getPrefBoolean(FPref.UI_HIDE_GAME_TABS);
|
||||
}
|
||||
|
||||
@@ -229,7 +232,7 @@ public final class DragCell extends JPanel implements ILocalRepaint {
|
||||
* @param w0   double
|
||||
* @param h0   double
|
||||
*/
|
||||
public void setRoughBounds(RectangleOfDouble rectangleOfDouble) {
|
||||
public void setRoughBounds(final RectangleOfDouble rectangleOfDouble) {
|
||||
this.roughSize = rectangleOfDouble;
|
||||
}
|
||||
|
||||
@@ -283,7 +286,7 @@ public final class DragCell extends JPanel implements ILocalRepaint {
|
||||
/** Removes a document from the layout and tabs.
|
||||
* @param doc0   {@link forge.gui.framework.IVDoc} */
|
||||
public void removeDoc(final IVDoc<? extends ICDoc> doc0) {
|
||||
boolean wasSelected = (docSelected == doc0);
|
||||
final boolean wasSelected = (docSelected == doc0);
|
||||
allDocs.remove(doc0);
|
||||
pnlHead.remove(doc0.getTabLabel());
|
||||
if (wasSelected) { //after removing selected doc, select most recent doc if possible
|
||||
@@ -296,10 +299,10 @@ public final class DragCell extends JPanel implements ILocalRepaint {
|
||||
/** - Deselects previous selection, if there is one<br>
|
||||
* - Decrements the priorities of all other tabs<br>
|
||||
* - Sets selected as priority 1<br>
|
||||
*
|
||||
*
|
||||
* <br><b>null</b> will reset
|
||||
* (deselect all tabs, and then select the first in the group).
|
||||
*
|
||||
*
|
||||
* <br><br>Unless there are no tab docs in this cell, there
|
||||
* will always be a selection.
|
||||
*
|
||||
@@ -342,32 +345,6 @@ public final class DragCell extends JPanel implements ILocalRepaint {
|
||||
return docSelected;
|
||||
}
|
||||
|
||||
/**
|
||||
* Enable/disable resize on the X axis for this cell.
|
||||
*
|
||||
* @param enable0   boolean
|
||||
*/
|
||||
public void toggleResizeX(final boolean enable0) {
|
||||
this.removeMouseListener(SResizingUtil.getResizeXListener());
|
||||
|
||||
if (enable0) {
|
||||
this.addMouseListener(SResizingUtil.getResizeXListener());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Enable/disable resize on the Y axis for this cell.
|
||||
*
|
||||
* @param enable0   boolean
|
||||
*/
|
||||
public void toggleResizeY(final boolean enable0) {
|
||||
this.removeMouseListener(SResizingUtil.getResizeYListener());
|
||||
|
||||
if (enable0) {
|
||||
this.addMouseListener(SResizingUtil.getResizeYListener());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Refreshes visual display of head bar.
|
||||
*/
|
||||
@@ -464,8 +441,8 @@ public final class DragCell extends JPanel implements ILocalRepaint {
|
||||
public void paintComponent(final Graphics g) {
|
||||
super.paintComponent(g);
|
||||
if (!hovered) { return; }
|
||||
|
||||
final Dimension imgSize = img.getSizeForPaint(g);
|
||||
|
||||
final Dimension imgSize = img.getSizeForPaint(g);
|
||||
final int imgW = imgSize.width;
|
||||
if (imgW < 1) { return; }
|
||||
final int imgH = imgSize.height;
|
||||
|
||||
@@ -23,7 +23,7 @@ import forge.toolbox.FSkin;
|
||||
import forge.toolbox.FSkin.SkinImage;
|
||||
import forge.view.FView;
|
||||
|
||||
/**
|
||||
/**
|
||||
* Definitions for Forge screens
|
||||
*/
|
||||
public class FScreen {
|
||||
@@ -81,15 +81,6 @@ public class FScreen {
|
||||
"Close Editor",
|
||||
ForgeConstants.EDITOR_LAYOUT_FILE,
|
||||
false);
|
||||
public static final FScreen DECK_EDITOR_VANGUARD = new FScreen(
|
||||
VDeckEditorUI.SINGLETON_INSTANCE,
|
||||
CDeckEditorUI.SINGLETON_INSTANCE,
|
||||
"Vanguard Deck Editor",
|
||||
FSkin.getImage(FSkinProp.IMG_PACK),
|
||||
true,
|
||||
"Close Editor",
|
||||
ForgeConstants.EDITOR_LAYOUT_FILE,
|
||||
false);
|
||||
public static final FScreen DECK_EDITOR_DRAFT = new FScreen(
|
||||
VDeckEditorUI.SINGLETON_INSTANCE,
|
||||
CDeckEditorUI.SINGLETON_INSTANCE,
|
||||
@@ -188,14 +179,14 @@ public class FScreen {
|
||||
|
||||
public static FScreen getMatchScreen(final CMatchUI controller, final VMatchUI view) {
|
||||
return new FScreen(
|
||||
view,
|
||||
controller,
|
||||
"Game",
|
||||
FSkin.getIcon(FSkinProp.ICO_ALPHASTRIKE), //TODO: Create icon for match screen
|
||||
true,
|
||||
"Concede Game",
|
||||
ForgeConstants.MATCH_LAYOUT_FILE,
|
||||
true);
|
||||
view,
|
||||
controller,
|
||||
"Game",
|
||||
FSkin.getIcon(FSkinProp.ICO_ALPHASTRIKE), //TODO: Create icon for match screen
|
||||
true,
|
||||
"Concede Game",
|
||||
ForgeConstants.MATCH_LAYOUT_FILE,
|
||||
true);
|
||||
}
|
||||
|
||||
public IVTopLevelUI getView() {
|
||||
@@ -226,14 +217,14 @@ public class FScreen {
|
||||
return closeButtonTooltip;
|
||||
}
|
||||
|
||||
public boolean onSwitching(FScreen toScreen) {
|
||||
public boolean onSwitching(final FScreen toScreen) {
|
||||
return view.onSwitching(this, toScreen);
|
||||
}
|
||||
|
||||
|
||||
public boolean onClosing() {
|
||||
return view.onClosing(this);
|
||||
}
|
||||
|
||||
|
||||
public FileLocation getLayoutFile() {
|
||||
return layoutFile;
|
||||
}
|
||||
@@ -247,7 +238,7 @@ public class FScreen {
|
||||
}
|
||||
private static boolean deleteLayoutFile(final FileLocation file) {
|
||||
try {
|
||||
File f = new File(file.userPrefLoc);
|
||||
final File f = new File(file.userPrefLoc);
|
||||
f.delete();
|
||||
return true;
|
||||
} catch (final Exception e) {
|
||||
@@ -255,13 +246,9 @@ public class FScreen {
|
||||
FOptionPane.showErrorDialog("Failed to delete layout file.");
|
||||
}
|
||||
return false;
|
||||
|
||||
|
||||
}
|
||||
|
||||
public void open() {
|
||||
Singletons.getControl().setCurrentScreen(this);
|
||||
}
|
||||
|
||||
public void close() {
|
||||
Singletons.getView().getNavigationBar().closeTab(this);
|
||||
}
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
package forge.gui.framework;
|
||||
|
||||
import forge.UiCommand;
|
||||
|
||||
/**
|
||||
* Dictates methods required for any controller of an
|
||||
* {@link forge.gui.framework.IVDoc}.
|
||||
@@ -12,14 +10,6 @@ import forge.UiCommand;
|
||||
* <i>(C at beginning of class name denotes a controller class.)</i>
|
||||
*/
|
||||
public interface ICDoc {
|
||||
/**
|
||||
* Fires when this controller's view tab is selected. Since this method is
|
||||
* fired when all tabs are first initialized, be wary of NPEs created by
|
||||
* referring to non-existent components.
|
||||
*
|
||||
* @return {@link forge.UiCommand}
|
||||
*/
|
||||
UiCommand getCommandOnSelect();
|
||||
|
||||
/**
|
||||
* Asks this controller to register its docs, so that a layout can be
|
||||
|
||||
@@ -1,12 +0,0 @@
|
||||
/**
|
||||
*
|
||||
*/
|
||||
package forge.gui.framework;
|
||||
|
||||
/**
|
||||
* This interface provides a unifying type to all enums
|
||||
* used as tab identifiers in XML and card layouts.
|
||||
*
|
||||
* <br><br><i>(I at beginning of class name denotes an interface.)</i>
|
||||
*/
|
||||
public interface IDocIdList { }
|
||||
@@ -1,18 +1,29 @@
|
||||
package forge.gui.framework;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.awt.Component;
|
||||
import java.awt.GraphicsConfiguration;
|
||||
import java.awt.GraphicsDevice;
|
||||
import java.awt.GraphicsEnvironment;
|
||||
import java.awt.Insets;
|
||||
import java.awt.KeyboardFocusManager;
|
||||
import java.awt.Point;
|
||||
import java.awt.Rectangle;
|
||||
import java.awt.Toolkit;
|
||||
import java.awt.Window;
|
||||
import java.util.Timer;
|
||||
import java.util.TimerTask;
|
||||
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.SwingUtilities;
|
||||
|
||||
import forge.FThreads;
|
||||
import forge.view.FFrame;
|
||||
|
||||
import javax.swing.*;
|
||||
|
||||
import java.awt.*;
|
||||
import java.util.Timer;
|
||||
import java.util.TimerTask;
|
||||
|
||||
/**
|
||||
/**
|
||||
* Experimental static factory for generic operations carried out
|
||||
* onto specific members of the framework. Doublestrike 11-04-12
|
||||
*
|
||||
*
|
||||
* <br><br><i>(S at beginning of class name denotes a static factory.)</i>
|
||||
*/
|
||||
public class SDisplayUtil {
|
||||
@@ -22,7 +33,7 @@ public class SDisplayUtil {
|
||||
private static Timer timer1 = null;
|
||||
|
||||
/** Flashes animation on input panel if play is currently waiting on input.
|
||||
*
|
||||
*
|
||||
* @param tab0   {@link java.GuiBase.getInterface().framework.IVDoc}
|
||||
*/
|
||||
public static void remind(final IVDoc<? extends ICDoc> tab0) {
|
||||
@@ -55,21 +66,22 @@ public class SDisplayUtil {
|
||||
}
|
||||
|
||||
final TimerTask tt = new TimerTask() {
|
||||
@Override
|
||||
public void run() {
|
||||
@Override public final void run() {
|
||||
counter++;
|
||||
if (counter != (steps - 1)) {
|
||||
SwingUtilities.invokeLater(new Runnable() { @Override
|
||||
public void run() {
|
||||
int r = newR == null ? oldR : newR[counter];
|
||||
int a = newA == null ? oldA : newR[counter];
|
||||
pnl.setBackground(new Color(r, oldG, oldB, a));
|
||||
SwingUtilities.invokeLater(new Runnable() {
|
||||
@Override public void run() {
|
||||
final int r = newR == null ? oldR : newR[counter];
|
||||
final int a = newA == null ? oldA : newR[counter];
|
||||
pnl.setBackground(new Color(r, oldG, oldB, a));
|
||||
}
|
||||
});
|
||||
} else {
|
||||
SwingUtilities.invokeLater(new Runnable() {
|
||||
@Override public void run() {
|
||||
pnl.setBackground(new Color(oldR, oldG, oldB, oldA));
|
||||
}
|
||||
});
|
||||
}
|
||||
else {
|
||||
SwingUtilities.invokeLater(new Runnable() { @Override
|
||||
public void run() { pnl.setBackground(new Color(oldR, oldG, oldB, oldA)); } });
|
||||
remindIsRunning = false;
|
||||
timer1.cancel();
|
||||
newR = null;
|
||||
@@ -86,15 +98,15 @@ public class SDisplayUtil {
|
||||
|
||||
/** @param tab0   {@link java.GuiBase.getInterface().framework.IVDoc} */
|
||||
public static void showTab(final IVDoc<? extends ICDoc> tab0) {
|
||||
|
||||
Runnable showTabRoutine = new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
|
||||
final Runnable showTabRoutine = new Runnable() {
|
||||
@Override public void run() {
|
||||
// FThreads.assertExecutedByEdt(true); - always true
|
||||
Component c = KeyboardFocusManager.getCurrentKeyboardFocusManager().getPermanentFocusOwner();
|
||||
DragCell dc = tab0.getParentCell();
|
||||
if (dc != null)
|
||||
final Component c = KeyboardFocusManager.getCurrentKeyboardFocusManager().getPermanentFocusOwner();
|
||||
final DragCell dc = tab0.getParentCell();
|
||||
if (dc != null) {
|
||||
dc.setSelected(tab0);
|
||||
}
|
||||
// set focus back to previous owner, if any
|
||||
if (null != c) {
|
||||
c.requestFocusInWindow();
|
||||
@@ -103,56 +115,52 @@ public class SDisplayUtil {
|
||||
};
|
||||
FThreads.invokeInEdtLater(showTabRoutine);
|
||||
}
|
||||
|
||||
public static GraphicsDevice getGraphicsDevice(Point point) {
|
||||
GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
|
||||
for (GraphicsDevice gd : env.getScreenDevices()) {
|
||||
|
||||
public static GraphicsDevice getGraphicsDevice(final Point point) {
|
||||
final GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
|
||||
for (final GraphicsDevice gd : env.getScreenDevices()) {
|
||||
if (gd.getDefaultConfiguration().getBounds().contains(point)) {
|
||||
return gd;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static GraphicsDevice getGraphicsDevice(Rectangle rect) {
|
||||
|
||||
public static GraphicsDevice getGraphicsDevice(final Rectangle rect) {
|
||||
return getGraphicsDevice(new Point(rect.x + (rect.width / 2), rect.y + (rect.height / 2)));
|
||||
}
|
||||
|
||||
public static Rectangle getScreenBoundsForPoint(Point point) {
|
||||
GraphicsDevice gd = getGraphicsDevice(point);
|
||||
|
||||
public static Rectangle getScreenBoundsForPoint(final Point point) {
|
||||
final GraphicsDevice gd = getGraphicsDevice(point);
|
||||
if (gd == null) {
|
||||
//return bounds of default monitor if point not on any screen
|
||||
return GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds();
|
||||
}
|
||||
return gd.getDefaultConfiguration().getBounds();
|
||||
}
|
||||
|
||||
public static Rectangle getScreenMaximizedBounds(Rectangle rect) {
|
||||
GraphicsDevice gd = getGraphicsDevice(rect);
|
||||
|
||||
public static Rectangle getScreenMaximizedBounds(final Rectangle rect) {
|
||||
final GraphicsDevice gd = getGraphicsDevice(rect);
|
||||
if (gd == null) {
|
||||
//return bounds of default monitor if center of rect not on any screen
|
||||
return GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds();
|
||||
}
|
||||
|
||||
GraphicsConfiguration config = gd.getDefaultConfiguration();
|
||||
Rectangle bounds = config.getBounds();
|
||||
Insets screenInsets = Toolkit.getDefaultToolkit().getScreenInsets(config);
|
||||
final GraphicsConfiguration config = gd.getDefaultConfiguration();
|
||||
final Rectangle bounds = config.getBounds();
|
||||
final Insets screenInsets = Toolkit.getDefaultToolkit().getScreenInsets(config);
|
||||
bounds.x += screenInsets.left;
|
||||
bounds.y += screenInsets.top;
|
||||
bounds.width -= screenInsets.left + screenInsets.right;
|
||||
bounds.height -= screenInsets.top + screenInsets.bottom;
|
||||
return bounds;
|
||||
}
|
||||
|
||||
public static boolean setFullScreenWindow(FFrame frame, boolean fullScreen) {
|
||||
|
||||
public static boolean setFullScreenWindow(final FFrame frame, final boolean fullScreen) {
|
||||
return setFullScreenWindow(getGraphicsDevice(frame.getNormalBounds()), frame, fullScreen);
|
||||
}
|
||||
|
||||
public static boolean setFullScreenWindow(Window window, boolean fullScreen) {
|
||||
return setFullScreenWindow(getGraphicsDevice(window.getBounds()), window, fullScreen);
|
||||
}
|
||||
|
||||
private static boolean setFullScreenWindow(GraphicsDevice gd, Window window, boolean fullScreen) {
|
||||
private static boolean setFullScreenWindow(final GraphicsDevice gd, final Window window, final boolean fullScreen) {
|
||||
if (gd != null && gd.isFullScreenSupported()) {
|
||||
if (fullScreen) {
|
||||
gd.setFullScreenWindow(window);
|
||||
|
||||
@@ -53,7 +53,7 @@ import forge.screens.match.controllers.CDetailPicture;
|
||||
import forge.toolbox.FOptionPane;
|
||||
import forge.toolbox.FSkin;
|
||||
|
||||
/**
|
||||
/**
|
||||
* ItemManager for decks
|
||||
*
|
||||
*/
|
||||
@@ -78,8 +78,7 @@ public final class DeckManager extends ItemManager<DeckProxy> implements IHasGam
|
||||
this.gameType = gt;
|
||||
|
||||
this.addSelectionListener(new ListSelectionListener() {
|
||||
@Override
|
||||
public void valueChanged(ListSelectionEvent e) {
|
||||
@Override public void valueChanged(final ListSelectionEvent e) {
|
||||
if (cmdSelect != null) {
|
||||
cmdSelect.run();
|
||||
}
|
||||
@@ -94,18 +93,19 @@ public final class DeckManager extends ItemManager<DeckProxy> implements IHasGam
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public GameType getGameType() {
|
||||
return gameType;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setup(ItemManagerConfig config0) {
|
||||
boolean wasStringOnly = (this.getConfig() == ItemManagerConfig.STRING_ONLY);
|
||||
boolean isStringOnly = (config0 == ItemManagerConfig.STRING_ONLY);
|
||||
public void setup(final ItemManagerConfig config0) {
|
||||
final boolean wasStringOnly = (this.getConfig() == ItemManagerConfig.STRING_ONLY);
|
||||
final boolean isStringOnly = (config0 == ItemManagerConfig.STRING_ONLY);
|
||||
|
||||
Map<ColumnDef, ItemTableColumn> colOverrides = null;
|
||||
if (config0.getCols().containsKey(ColumnDef.DECK_ACTIONS)) {
|
||||
ItemTableColumn column = new ItemTableColumn(new ItemColumn(config0.getCols().get(ColumnDef.DECK_ACTIONS)));
|
||||
final ItemTableColumn column = new ItemTableColumn(new ItemColumn(config0.getCols().get(ColumnDef.DECK_ACTIONS)));
|
||||
column.setCellRenderer(new DeckActionsRenderer());
|
||||
colOverrides = new HashMap<ColumnDef, ItemTableColumn>();
|
||||
colOverrides.put(ColumnDef.DECK_ACTIONS, column);
|
||||
@@ -148,17 +148,17 @@ public final class DeckManager extends ItemManager<DeckProxy> implements IHasGam
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void buildAddFilterMenu(JMenu menu) {
|
||||
protected void buildAddFilterMenu(final JMenu menu) {
|
||||
GuiUtils.addSeparator(menu); //separate from current search item
|
||||
|
||||
Set<String> folders = new HashSet<String>();
|
||||
final Set<String> folders = new HashSet<String>();
|
||||
for (final Entry<DeckProxy, Integer> deckEntry : getPool()) {
|
||||
String path = deckEntry.getKey().getPath();
|
||||
final String path = deckEntry.getKey().getPath();
|
||||
if (StringUtils.isNotEmpty(path)) { //don't include root folder as option
|
||||
folders.add(path);
|
||||
}
|
||||
}
|
||||
JMenu folder = GuiUtils.createMenu("Folder");
|
||||
final JMenu folder = GuiUtils.createMenu("Folder");
|
||||
if (folders.size() > 0) {
|
||||
for (final String f : folders) {
|
||||
GuiUtils.addMenuItem(folder, f, null, new Runnable() {
|
||||
@@ -174,7 +174,7 @@ public final class DeckManager extends ItemManager<DeckProxy> implements IHasGam
|
||||
}
|
||||
menu.add(folder);
|
||||
|
||||
JMenu fmt = GuiUtils.createMenu("Format");
|
||||
final JMenu fmt = GuiUtils.createMenu("Format");
|
||||
for (final GameFormat f : FModel.getFormats().getOrderedList()) {
|
||||
GuiUtils.addMenuItem(fmt, f.getName(), null, new Runnable() {
|
||||
@Override
|
||||
@@ -186,18 +186,15 @@ public final class DeckManager extends ItemManager<DeckProxy> implements IHasGam
|
||||
menu.add(fmt);
|
||||
|
||||
GuiUtils.addMenuItem(menu, "Sets...", null, new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
DeckSetFilter existingFilter = getFilter(DeckSetFilter.class);
|
||||
@Override public void run() {
|
||||
final DeckSetFilter existingFilter = getFilter(DeckSetFilter.class);
|
||||
if (existingFilter != null) {
|
||||
existingFilter.edit();
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
final DialogChooseSets dialog = new DialogChooseSets(null, null, true);
|
||||
dialog.setOkCallback(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
List<String> sets = dialog.getSelectedSets();
|
||||
@Override public void run() {
|
||||
final List<String> sets = dialog.getSelectedSets();
|
||||
if (!sets.isEmpty()) {
|
||||
addFilter(new DeckSetFilter(DeckManager.this, sets, dialog.getWantReprints()));
|
||||
}
|
||||
@@ -207,11 +204,10 @@ public final class DeckManager extends ItemManager<DeckProxy> implements IHasGam
|
||||
}
|
||||
});
|
||||
|
||||
JMenu world = GuiUtils.createMenu("Quest world");
|
||||
final JMenu world = GuiUtils.createMenu("Quest world");
|
||||
for (final QuestWorld w : FModel.getWorlds()) {
|
||||
GuiUtils.addMenuItem(world, w.getName(), null, new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
@Override public void run() {
|
||||
addFilter(new DeckQuestWorldFilter(DeckManager.this, w));
|
||||
}
|
||||
}, DeckQuestWorldFilter.canAddQuestWorld(w, getFilter(DeckQuestWorldFilter.class)));
|
||||
@@ -235,30 +231,30 @@ public final class DeckManager extends ItemManager<DeckProxy> implements IHasGam
|
||||
FScreen screen = null;
|
||||
|
||||
switch (this.gameType) {
|
||||
case Quest:
|
||||
screen = FScreen.DECK_EDITOR_QUEST;
|
||||
editorCtrl = new CEditorQuest(FModel.getQuest(), getCDetailPicture());
|
||||
break;
|
||||
case Constructed:
|
||||
screen = FScreen.DECK_EDITOR_CONSTRUCTED;
|
||||
DeckPreferences.setCurrentDeck(deck.toString());
|
||||
//re-use constructed controller
|
||||
break;
|
||||
case Sealed:
|
||||
screen = FScreen.DECK_EDITOR_SEALED;
|
||||
editorCtrl = new CEditorLimited(FModel.getDecks().getSealed(), screen, getCDetailPicture());
|
||||
break;
|
||||
case Draft:
|
||||
screen = FScreen.DECK_EDITOR_DRAFT;
|
||||
editorCtrl = new CEditorLimited(FModel.getDecks().getDraft(), screen, getCDetailPicture());
|
||||
break;
|
||||
case Winston:
|
||||
screen = FScreen.DECK_EDITOR_DRAFT;
|
||||
editorCtrl = new CEditorLimited(FModel.getDecks().getWinston(), screen, getCDetailPicture());
|
||||
break;
|
||||
case Quest:
|
||||
screen = FScreen.DECK_EDITOR_QUEST;
|
||||
editorCtrl = new CEditorQuest(FModel.getQuest(), getCDetailPicture());
|
||||
break;
|
||||
case Constructed:
|
||||
screen = FScreen.DECK_EDITOR_CONSTRUCTED;
|
||||
DeckPreferences.setCurrentDeck(deck.toString());
|
||||
//re-use constructed controller
|
||||
break;
|
||||
case Sealed:
|
||||
screen = FScreen.DECK_EDITOR_SEALED;
|
||||
editorCtrl = new CEditorLimited(FModel.getDecks().getSealed(), screen, getCDetailPicture());
|
||||
break;
|
||||
case Draft:
|
||||
screen = FScreen.DECK_EDITOR_DRAFT;
|
||||
editorCtrl = new CEditorLimited(FModel.getDecks().getDraft(), screen, getCDetailPicture());
|
||||
break;
|
||||
case Winston:
|
||||
screen = FScreen.DECK_EDITOR_DRAFT;
|
||||
editorCtrl = new CEditorLimited(FModel.getDecks().getWinston(), screen, getCDetailPicture());
|
||||
break;
|
||||
|
||||
default:
|
||||
return;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
if (!Singletons.getControl().ensureScreenActive(screen)) { return; }
|
||||
@@ -272,7 +268,7 @@ public final class DeckManager extends ItemManager<DeckProxy> implements IHasGam
|
||||
CDeckEditorUI.SINGLETON_INSTANCE.getCurrentEditorController().getDeckController().load(deck.getPath(), deck.getName());
|
||||
}
|
||||
|
||||
public boolean deleteDeck(DeckProxy deck) {
|
||||
public boolean deleteDeck(final DeckProxy deck) {
|
||||
if (deck == null) { return false; }
|
||||
|
||||
if (!FOptionPane.showConfirmDialog(
|
||||
@@ -283,17 +279,17 @@ public final class DeckManager extends ItemManager<DeckProxy> implements IHasGam
|
||||
|
||||
// consider using deck proxy's method to delete deck
|
||||
switch(this.gameType) {
|
||||
case Constructed:
|
||||
case Draft:
|
||||
case Sealed:
|
||||
deck.deleteFromStorage();
|
||||
break;
|
||||
case Quest:
|
||||
deck.deleteFromStorage();
|
||||
FModel.getQuest().save();
|
||||
break;
|
||||
default:
|
||||
throw new UnsupportedOperationException("Delete not implemented for game type = " + gameType.toString());
|
||||
case Constructed:
|
||||
case Draft:
|
||||
case Sealed:
|
||||
deck.deleteFromStorage();
|
||||
break;
|
||||
case Quest:
|
||||
deck.deleteFromStorage();
|
||||
FModel.getQuest().save();
|
||||
break;
|
||||
default:
|
||||
throw new UnsupportedOperationException("Delete not implemented for game type = " + gameType.toString());
|
||||
}
|
||||
|
||||
this.removeItem(deck, 1);
|
||||
@@ -305,7 +301,7 @@ public final class DeckManager extends ItemManager<DeckProxy> implements IHasGam
|
||||
}
|
||||
|
||||
public class DeckActionsRenderer extends ItemCellRenderer {
|
||||
private int overActionIndex = -1;
|
||||
private final int overActionIndex = -1;
|
||||
private static final int imgSize = 20;
|
||||
|
||||
@Override
|
||||
@@ -315,7 +311,7 @@ public final class DeckManager extends ItemManager<DeckProxy> implements IHasGam
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
*
|
||||
* @see
|
||||
* javax.swing.table.DefaultTableCellRenderer#getTableCellRendererComponent
|
||||
* (javax.swing.JTable, java.lang.Object, boolean, boolean, int, int)
|
||||
@@ -329,11 +325,11 @@ public final class DeckManager extends ItemManager<DeckProxy> implements IHasGam
|
||||
|
||||
@Override
|
||||
public <T extends InventoryItem> void processMouseEvent(final MouseEvent e, final ItemListView<T> listView, final Object value, final int row, final int column) {
|
||||
Rectangle cellBounds = listView.getTable().getCellRect(row, column, false);
|
||||
int x = e.getX() - cellBounds.x;
|
||||
final Rectangle cellBounds = listView.getTable().getCellRect(row, column, false);
|
||||
final int x = e.getX() - cellBounds.x;
|
||||
|
||||
if (e.getID() == MouseEvent.MOUSE_PRESSED && e.getButton() == 1) {
|
||||
DeckProxy deck = (DeckProxy) value;
|
||||
final DeckProxy deck = (DeckProxy) value;
|
||||
|
||||
if (x >= 0 && x < imgSize) { //delete button
|
||||
if (DeckManager.this.deleteDeck(deck)) {
|
||||
@@ -370,7 +366,7 @@ public final class DeckManager extends ItemManager<DeckProxy> implements IHasGam
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
*
|
||||
* @see javax.swing.JComponent#paint(java.awt.Graphics)
|
||||
*/
|
||||
@Override
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,22 +1,22 @@
|
||||
package forge.itemmanager.filters;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
import forge.game.GameFormat;
|
||||
import forge.item.PaperCard;
|
||||
import forge.itemmanager.ItemManager;
|
||||
import forge.model.FModel;
|
||||
import forge.quest.QuestWorld;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
|
||||
public class CardQuestWorldFilter extends CardFormatFilter {
|
||||
private final Set<QuestWorld> questWorlds = new HashSet<QuestWorld>();
|
||||
|
||||
public CardQuestWorldFilter(ItemManager<? super PaperCard> itemManager0) {
|
||||
public CardQuestWorldFilter(final ItemManager<? super PaperCard> itemManager0) {
|
||||
super(itemManager0);
|
||||
}
|
||||
public CardQuestWorldFilter(ItemManager<? super PaperCard> itemManager0, QuestWorld questWorld0) {
|
||||
public CardQuestWorldFilter(final ItemManager<? super PaperCard> itemManager0, final QuestWorld questWorld0) {
|
||||
super(itemManager0);
|
||||
this.questWorlds.add(questWorld0);
|
||||
this.formats.add(getQuestWorldFormat(questWorld0));
|
||||
@@ -24,9 +24,9 @@ public class CardQuestWorldFilter extends CardFormatFilter {
|
||||
|
||||
@Override
|
||||
public ItemFilter<PaperCard> createCopy() {
|
||||
CardQuestWorldFilter copy = new CardQuestWorldFilter(itemManager);
|
||||
final CardQuestWorldFilter copy = new CardQuestWorldFilter(itemManager);
|
||||
copy.questWorlds.addAll(this.questWorlds);
|
||||
for (QuestWorld w : this.questWorlds) {
|
||||
for (final QuestWorld w : this.questWorlds) {
|
||||
copy.formats.add(getQuestWorldFormat(w));
|
||||
}
|
||||
return copy;
|
||||
@@ -38,7 +38,7 @@ public class CardQuestWorldFilter extends CardFormatFilter {
|
||||
super.reset();
|
||||
}
|
||||
|
||||
public static boolean canAddQuestWorld(QuestWorld questWorld, ItemFilter<PaperCard> existingFilter) {
|
||||
public static boolean canAddQuestWorld(final QuestWorld questWorld, final ItemFilter<PaperCard> existingFilter) {
|
||||
if (questWorld.getFormat() == null && FModel.getQuest().getMainFormat() == null) {
|
||||
return false; //must have format
|
||||
}
|
||||
@@ -51,10 +51,10 @@ public class CardQuestWorldFilter extends CardFormatFilter {
|
||||
* @return true if filter merged in or to suppress adding a new filter, false to allow adding new filter
|
||||
*/
|
||||
@Override
|
||||
public boolean merge(ItemFilter<?> filter) {
|
||||
CardQuestWorldFilter cardQuestWorldFilter = (CardQuestWorldFilter)filter;
|
||||
public boolean merge(final ItemFilter<?> filter) {
|
||||
final CardQuestWorldFilter cardQuestWorldFilter = (CardQuestWorldFilter)filter;
|
||||
this.questWorlds.addAll(cardQuestWorldFilter.questWorlds);
|
||||
for (QuestWorld w : cardQuestWorldFilter.questWorlds) {
|
||||
for (final QuestWorld w : cardQuestWorldFilter.questWorlds) {
|
||||
this.formats.add(getQuestWorldFormat(w));
|
||||
}
|
||||
return true;
|
||||
@@ -72,14 +72,14 @@ public class CardQuestWorldFilter extends CardFormatFilter {
|
||||
|
||||
@Override
|
||||
protected Iterable<String> getList() {
|
||||
Set<String> strings = new HashSet<String>();
|
||||
for (QuestWorld w : this.questWorlds) {
|
||||
final Set<String> strings = new HashSet<String>();
|
||||
for (final QuestWorld w : this.questWorlds) {
|
||||
strings.add(w.getName());
|
||||
}
|
||||
return strings;
|
||||
}
|
||||
|
||||
private GameFormat getQuestWorldFormat(QuestWorld w) {
|
||||
private static GameFormat getQuestWorldFormat(final QuestWorld w) {
|
||||
GameFormat format = w.getFormat();
|
||||
if (format == null) {
|
||||
//assumes that no world other than the main world will have a null format
|
||||
|
||||
@@ -1,22 +1,22 @@
|
||||
package forge.itemmanager.filters;
|
||||
|
||||
import forge.game.GameFormat;
|
||||
import forge.itemmanager.ItemManager;
|
||||
import forge.deck.DeckProxy;
|
||||
import forge.model.FModel;
|
||||
import forge.quest.QuestWorld;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
import forge.deck.DeckProxy;
|
||||
import forge.game.GameFormat;
|
||||
import forge.itemmanager.ItemManager;
|
||||
import forge.model.FModel;
|
||||
import forge.quest.QuestWorld;
|
||||
|
||||
|
||||
public class DeckQuestWorldFilter extends DeckFormatFilter {
|
||||
private final Set<QuestWorld> questWorlds = new HashSet<QuestWorld>();
|
||||
|
||||
public DeckQuestWorldFilter(ItemManager<? super DeckProxy> itemManager0) {
|
||||
public DeckQuestWorldFilter(final ItemManager<? super DeckProxy> itemManager0) {
|
||||
super(itemManager0);
|
||||
}
|
||||
public DeckQuestWorldFilter(ItemManager<? super DeckProxy> itemManager0, QuestWorld questWorld0) {
|
||||
public DeckQuestWorldFilter(final ItemManager<? super DeckProxy> itemManager0, final QuestWorld questWorld0) {
|
||||
super(itemManager0);
|
||||
this.questWorlds.add(questWorld0);
|
||||
this.formats.add(getQuestWorldFormat(questWorld0));
|
||||
@@ -24,9 +24,9 @@ public class DeckQuestWorldFilter extends DeckFormatFilter {
|
||||
|
||||
@Override
|
||||
public ItemFilter<DeckProxy> createCopy() {
|
||||
DeckQuestWorldFilter copy = new DeckQuestWorldFilter(itemManager);
|
||||
final DeckQuestWorldFilter copy = new DeckQuestWorldFilter(itemManager);
|
||||
copy.questWorlds.addAll(this.questWorlds);
|
||||
for (QuestWorld w : this.questWorlds) {
|
||||
for (final QuestWorld w : this.questWorlds) {
|
||||
copy.formats.add(getQuestWorldFormat(w));
|
||||
}
|
||||
return copy;
|
||||
@@ -38,7 +38,7 @@ public class DeckQuestWorldFilter extends DeckFormatFilter {
|
||||
super.reset();
|
||||
}
|
||||
|
||||
public static boolean canAddQuestWorld(QuestWorld questWorld, ItemFilter<DeckProxy> existingFilter) {
|
||||
public static boolean canAddQuestWorld(final QuestWorld questWorld, final ItemFilter<DeckProxy> existingFilter) {
|
||||
if (questWorld.getFormat() == null && FModel.getQuest().getMainFormat() == null) {
|
||||
return false; //must have format
|
||||
}
|
||||
@@ -51,10 +51,10 @@ public class DeckQuestWorldFilter extends DeckFormatFilter {
|
||||
* @return true if filter merged in or to suppress adding a new filter, false to allow adding new filter
|
||||
*/
|
||||
@Override
|
||||
public boolean merge(ItemFilter<?> filter) {
|
||||
DeckQuestWorldFilter cardQuestWorldFilter = (DeckQuestWorldFilter)filter;
|
||||
public boolean merge(final ItemFilter<?> filter) {
|
||||
final DeckQuestWorldFilter cardQuestWorldFilter = (DeckQuestWorldFilter)filter;
|
||||
this.questWorlds.addAll(cardQuestWorldFilter.questWorlds);
|
||||
for (QuestWorld w : cardQuestWorldFilter.questWorlds) {
|
||||
for (final QuestWorld w : cardQuestWorldFilter.questWorlds) {
|
||||
this.formats.add(getQuestWorldFormat(w));
|
||||
}
|
||||
return true;
|
||||
@@ -72,14 +72,14 @@ public class DeckQuestWorldFilter extends DeckFormatFilter {
|
||||
|
||||
@Override
|
||||
protected Iterable<String> getList() {
|
||||
Set<String> strings = new HashSet<String>();
|
||||
for (QuestWorld w : this.questWorlds) {
|
||||
final Set<String> strings = new HashSet<String>();
|
||||
for (final QuestWorld w : this.questWorlds) {
|
||||
strings.add(w.getName());
|
||||
}
|
||||
return strings;
|
||||
}
|
||||
|
||||
private GameFormat getQuestWorldFormat(QuestWorld w) {
|
||||
private static GameFormat getQuestWorldFormat(final QuestWorld w) {
|
||||
GameFormat format = w.getFormat();
|
||||
if (format == null) {
|
||||
//assumes that no world other than the main world will have a null format
|
||||
|
||||
@@ -1,37 +0,0 @@
|
||||
package forge.itemmanager.filters;
|
||||
|
||||
import com.google.common.base.Predicates;
|
||||
|
||||
import forge.deck.DeckProxy;
|
||||
import forge.item.InventoryItem;
|
||||
import forge.item.PaperCard;
|
||||
import forge.itemmanager.ItemManager;
|
||||
import forge.itemmanager.SItemManagerUtil.StatTypes;
|
||||
import forge.toolbox.FLabel;
|
||||
import forge.util.ItemPool;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
public abstract class DeckStatTypeFilter extends StatTypeFilter<DeckProxy> {
|
||||
public DeckStatTypeFilter(ItemManager<? super DeckProxy> itemManager0) {
|
||||
super(itemManager0);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected <U extends InventoryItem> boolean showUnsupportedItem(U item) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void afterFiltersApplied() {
|
||||
final ItemPool<? super DeckProxy> items = itemManager.getFilteredItems();
|
||||
|
||||
for (Map.Entry<StatTypes, FLabel> btn : buttonMap.entrySet()) {
|
||||
if (btn.getKey().predicate != null) {
|
||||
int count = items.countAll(DeckProxy.createPredicate(Predicates.compose(btn.getKey().predicate, PaperCard.FN_GET_RULES)), DeckProxy.class);
|
||||
btn.getValue().setText(String.valueOf(count));
|
||||
}
|
||||
}
|
||||
getWidget().revalidate();
|
||||
}
|
||||
}
|
||||
@@ -6,28 +6,29 @@
|
||||
* 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 forge.itemmanager.views;
|
||||
|
||||
import forge.item.InventoryItem;
|
||||
import forge.itemmanager.ColumnDef;
|
||||
import forge.toolbox.FSkin;
|
||||
import java.awt.Component;
|
||||
import java.awt.event.MouseEvent;
|
||||
|
||||
import javax.swing.*;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JTable;
|
||||
import javax.swing.border.Border;
|
||||
import javax.swing.border.EmptyBorder;
|
||||
import javax.swing.table.DefaultTableCellRenderer;
|
||||
|
||||
import java.awt.*;
|
||||
import java.awt.event.MouseEvent;
|
||||
import forge.item.InventoryItem;
|
||||
import forge.itemmanager.ColumnDef;
|
||||
import forge.toolbox.FSkin;
|
||||
|
||||
/**
|
||||
* Base cell renderer class for item tables
|
||||
@@ -36,7 +37,7 @@ import java.awt.event.MouseEvent;
|
||||
public class ItemCellRenderer extends DefaultTableCellRenderer {
|
||||
private static final Border DEFAULT_BORDER = new EmptyBorder(1, 1, 1, 1);
|
||||
|
||||
public static ItemCellRenderer getColumnDefRenderer(ColumnDef columnDef) {
|
||||
public static ItemCellRenderer getColumnDefRenderer(final ColumnDef columnDef) {
|
||||
switch (columnDef) {
|
||||
case POWER:
|
||||
case TOUGHNESS:
|
||||
@@ -66,12 +67,12 @@ public class ItemCellRenderer extends DefaultTableCellRenderer {
|
||||
return false;
|
||||
}
|
||||
|
||||
public <T extends InventoryItem> void processMouseEvent(final MouseEvent e, final ItemListView<T> listView, final Object value, final int row, final int column) {
|
||||
protected <T extends InventoryItem> void processMouseEvent(final MouseEvent e, final ItemListView<T> listView, final Object value, final int row, final int column) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
|
||||
JLabel lbl = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
|
||||
public Component getTableCellRendererComponent(final JTable table, final Object value, final boolean isSelected, final boolean hasFocus, final int row, final int column) {
|
||||
final JLabel lbl = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
|
||||
lbl.setBorder(DEFAULT_BORDER); //prevent selected cell having inner border
|
||||
if (isSelected) {
|
||||
lbl.setBackground(table.getSelectionBackground());
|
||||
@@ -85,5 +86,5 @@ public class ItemCellRenderer extends DefaultTableCellRenderer {
|
||||
}
|
||||
}
|
||||
return lbl;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,17 +6,67 @@
|
||||
* 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 forge.itemmanager.views;
|
||||
|
||||
import java.awt.Component;
|
||||
import java.awt.Cursor;
|
||||
import java.awt.Dimension;
|
||||
import java.awt.KeyboardFocusManager;
|
||||
import java.awt.Point;
|
||||
import java.awt.Rectangle;
|
||||
import java.awt.Toolkit;
|
||||
import java.awt.datatransfer.Clipboard;
|
||||
import java.awt.datatransfer.StringSelection;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.awt.event.FocusAdapter;
|
||||
import java.awt.event.FocusEvent;
|
||||
import java.awt.event.FocusListener;
|
||||
import java.awt.event.KeyEvent;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.awt.event.MouseMotionAdapter;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.Enumeration;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import javax.swing.JComponent;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JTable;
|
||||
import javax.swing.JViewport;
|
||||
import javax.swing.KeyStroke;
|
||||
import javax.swing.ListSelectionModel;
|
||||
import javax.swing.SwingConstants;
|
||||
import javax.swing.border.Border;
|
||||
import javax.swing.border.EmptyBorder;
|
||||
import javax.swing.event.ChangeEvent;
|
||||
import javax.swing.event.ChangeListener;
|
||||
import javax.swing.event.ListSelectionEvent;
|
||||
import javax.swing.event.ListSelectionListener;
|
||||
import javax.swing.event.TableModelEvent;
|
||||
import javax.swing.table.AbstractTableModel;
|
||||
import javax.swing.table.DefaultTableCellRenderer;
|
||||
import javax.swing.table.DefaultTableColumnModel;
|
||||
import javax.swing.table.JTableHeader;
|
||||
import javax.swing.table.TableCellRenderer;
|
||||
import javax.swing.table.TableColumn;
|
||||
import javax.swing.table.TableColumnModel;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import forge.assets.FSkinProp;
|
||||
import forge.gui.MouseUtil;
|
||||
import forge.item.InventoryItem;
|
||||
@@ -29,39 +79,17 @@ import forge.itemmanager.ItemManagerModel;
|
||||
import forge.toolbox.FCheckBox;
|
||||
import forge.toolbox.FMouseAdapter;
|
||||
import forge.toolbox.FSkin;
|
||||
import forge.toolbox.FSkin.*;
|
||||
|
||||
import javax.swing.*;
|
||||
import javax.swing.border.Border;
|
||||
import javax.swing.border.EmptyBorder;
|
||||
import javax.swing.event.ChangeEvent;
|
||||
import javax.swing.event.ChangeListener;
|
||||
import javax.swing.event.ListSelectionEvent;
|
||||
import javax.swing.event.ListSelectionListener;
|
||||
import javax.swing.event.TableModelEvent;
|
||||
import javax.swing.table.*;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import java.awt.*;
|
||||
import java.awt.datatransfer.Clipboard;
|
||||
import java.awt.datatransfer.StringSelection;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.awt.event.FocusAdapter;
|
||||
import java.awt.event.FocusEvent;
|
||||
import java.awt.event.FocusListener;
|
||||
import java.awt.event.KeyEvent;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.awt.event.MouseMotionAdapter;
|
||||
import java.util.*;
|
||||
import java.util.List;
|
||||
import java.util.Map.Entry;
|
||||
import forge.toolbox.FSkin.SkinBorder;
|
||||
import forge.toolbox.FSkin.SkinColor;
|
||||
import forge.toolbox.FSkin.SkinFont;
|
||||
import forge.toolbox.FSkin.SkinImage;
|
||||
import forge.toolbox.FSkin.SkinnedTable;
|
||||
import forge.toolbox.FSkin.SkinnedTableHeader;
|
||||
|
||||
|
||||
/**
|
||||
* ItemTable.
|
||||
*
|
||||
*
|
||||
* @param <T>
|
||||
* the generic type
|
||||
*/
|
||||
@@ -87,11 +115,11 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
|
||||
|
||||
/**
|
||||
* ItemTable Constructor.
|
||||
*
|
||||
*
|
||||
* @param itemManager0
|
||||
* @param model0
|
||||
*/
|
||||
public ItemListView(ItemManager<T> itemManager0, ItemManagerModel<T> model0) {
|
||||
public ItemListView(final ItemManager<T> itemManager0, final ItemManagerModel<T> model0) {
|
||||
super(itemManager0, model0);
|
||||
this.tableModel = new ItemTableModel(model0);
|
||||
this.setAllowMultipleSelections(false);
|
||||
@@ -99,21 +127,19 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
|
||||
|
||||
// use different selection highlight colors for focused vs. unfocused tables
|
||||
this.table.addMouseListener(new FMouseAdapter() {
|
||||
@Override
|
||||
public void onLeftDoubleClick(MouseEvent e) {
|
||||
@Override public void onLeftDoubleClick(final MouseEvent e) {
|
||||
if (e.isConsumed()) { return; } //don't activate if inline button double clicked
|
||||
|
||||
int clickedIndex = table.rowAtPoint(e.getPoint());
|
||||
final int clickedIndex = table.rowAtPoint(e.getPoint());
|
||||
|
||||
itemManager.activateSelectedItems();
|
||||
|
||||
if (clickedIndex >= table.getRowCount()) {
|
||||
FMouseAdapter.forceMouseUp(); //prevent mouse getting stuck if final row removed from double click handling
|
||||
FMouseAdapter.forceMouseUp(); //prevent mouse getting stuck if final row removed from double click handling
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onRightClick(MouseEvent e) {
|
||||
@Override public void onRightClick(final MouseEvent e) {
|
||||
itemManager.showContextMenu(e);
|
||||
}
|
||||
});
|
||||
@@ -124,13 +150,13 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setup(ItemManagerConfig config, Map<ColumnDef, ItemTableColumn> colOverrides) {
|
||||
public void setup(final ItemManagerConfig config, final Map<ColumnDef, ItemTableColumn> colOverrides) {
|
||||
final Iterable<T> selectedItemsBefore = getSelectedItems();
|
||||
final DefaultTableColumnModel colmodel = new DefaultTableColumnModel();
|
||||
|
||||
//ensure columns ordered properly
|
||||
final List<ItemTableColumn> columns = new LinkedList<ItemTableColumn>();
|
||||
for (ItemColumnConfig colConfig : config.getCols().values()) {
|
||||
for (final ItemColumnConfig colConfig : config.getCols().values()) {
|
||||
if (colOverrides == null || !colOverrides.containsKey(colConfig.getDef())) {
|
||||
columns.add(new ItemTableColumn(new ItemColumn(colConfig)));
|
||||
}
|
||||
@@ -139,14 +165,13 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
|
||||
}
|
||||
}
|
||||
Collections.sort(columns, new Comparator<ItemTableColumn>() {
|
||||
@Override
|
||||
public int compare(ItemTableColumn arg0, ItemTableColumn arg1) {
|
||||
@Override public int compare(final ItemTableColumn arg0, final ItemTableColumn arg1) {
|
||||
return Integer.compare(arg0.getIndex(), arg1.getIndex());
|
||||
}
|
||||
});
|
||||
|
||||
//hide table header if only showing single string column
|
||||
boolean hideHeader = (config.getCols().size() == 1 && config.getCols().containsKey(ColumnDef.STRING));
|
||||
final boolean hideHeader = (config.getCols().size() == 1 && config.getCols().containsKey(ColumnDef.STRING));
|
||||
|
||||
getPnlOptions().removeAll();
|
||||
|
||||
@@ -155,9 +180,8 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
|
||||
chkBox.setFont(ROW_FONT);
|
||||
chkBox.setToolTipText("Toggle whether to show unique cards only");
|
||||
chkBox.addChangeListener(new ChangeListener() {
|
||||
@Override
|
||||
public void stateChanged(ChangeEvent arg0) {
|
||||
boolean wantUnique = chkBox.isSelected();
|
||||
@Override public void stateChanged(final ChangeEvent arg0) {
|
||||
final boolean wantUnique = chkBox.isSelected();
|
||||
if (itemManager.getWantUnique() == wantUnique) { return; }
|
||||
itemManager.setWantUnique(wantUnique);
|
||||
itemManager.refresh();
|
||||
@@ -181,9 +205,8 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
|
||||
chkBox.setFont(ROW_FONT);
|
||||
chkBox.setToolTipText(col.getLongName());
|
||||
chkBox.addChangeListener(new ChangeListener() {
|
||||
@Override
|
||||
public void stateChanged(ChangeEvent arg0) {
|
||||
boolean visible = chkBox.isSelected();
|
||||
@Override public void stateChanged(final ChangeEvent arg0) {
|
||||
final boolean visible = chkBox.isSelected();
|
||||
if (col.isVisible() == visible) { return; }
|
||||
col.setVisible(visible);
|
||||
|
||||
@@ -191,7 +214,7 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
|
||||
colmodel.addColumn(col);
|
||||
|
||||
//move column into proper position
|
||||
int oldIndex = colmodel.getColumnCount() - 1;
|
||||
final int oldIndex = colmodel.getColumnCount() - 1;
|
||||
int newIndex = col.getIndex();
|
||||
for (int i = 0; i < col.getIndex(); i++) {
|
||||
if (!columns.get(i).isVisible()) {
|
||||
@@ -252,7 +275,7 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setAllowMultipleSelections(boolean allowMultipleSelections) {
|
||||
public void setAllowMultipleSelections(final boolean allowMultipleSelections) {
|
||||
this.table.setSelectionMode(allowMultipleSelections ? ListSelectionModel.MULTIPLE_INTERVAL_SELECTION : ListSelectionModel.SINGLE_SELECTION);
|
||||
}
|
||||
|
||||
@@ -263,8 +286,8 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
|
||||
|
||||
@Override
|
||||
public Iterable<Integer> getSelectedIndices() {
|
||||
List<Integer> indices = new ArrayList<Integer>();
|
||||
int[] selectedRows = this.table.getSelectedRows();
|
||||
final List<Integer> indices = new ArrayList<Integer>();
|
||||
final int[] selectedRows = this.table.getSelectedRows();
|
||||
for (int i = 0; i < selectedRows.length; i++) {
|
||||
indices.add(selectedRows[i]);
|
||||
}
|
||||
@@ -272,23 +295,23 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onSetSelectedIndex(int index) {
|
||||
protected void onSetSelectedIndex(final int index) {
|
||||
this.table.setRowSelectionInterval(index, index);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onSetSelectedIndices(Iterable<Integer> indices) {
|
||||
protected void onSetSelectedIndices(final Iterable<Integer> indices) {
|
||||
this.table.clearSelection();
|
||||
for (Integer index : indices) {
|
||||
for (final Integer index : indices) {
|
||||
this.table.addRowSelectionInterval(index, index);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onScrollSelectionIntoView(JViewport viewport) {
|
||||
protected void onScrollSelectionIntoView(final JViewport viewport) {
|
||||
// compute where we're going and where we are
|
||||
Rectangle targetRect = this.table.getCellRect(this.getSelectedIndex(), 0, true);
|
||||
Rectangle curViewRect = viewport.getViewRect();
|
||||
final Rectangle targetRect = this.table.getCellRect(this.getSelectedIndex(), 0, true);
|
||||
final Rectangle curViewRect = viewport.getViewRect();
|
||||
|
||||
// if the target cell is not visible, attempt to jump to a location where it is
|
||||
// visible but not on the edge of the viewport
|
||||
@@ -310,13 +333,13 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getIndexOfItem(T item) {
|
||||
public int getIndexOfItem(final T item) {
|
||||
return this.tableModel.itemToRow(item);
|
||||
}
|
||||
|
||||
@Override
|
||||
public T getItemAtIndex(int index) {
|
||||
Entry<T, Integer> itemEntry = this.tableModel.rowToItem(index);
|
||||
public T getItemAtIndex(final int index) {
|
||||
final Entry<T, Integer> itemEntry = this.tableModel.rowToItem(index);
|
||||
return itemEntry != null ? itemEntry.getKey() : null;
|
||||
}
|
||||
|
||||
@@ -331,7 +354,7 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getIndexAtPoint(Point p) {
|
||||
public int getIndexAtPoint(final Point p) {
|
||||
return this.table.rowAtPoint(p);
|
||||
}
|
||||
|
||||
@@ -355,7 +378,7 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
|
||||
|
||||
this.addFocusListener(new FocusListener() {
|
||||
@Override
|
||||
public void focusGained(FocusEvent e) {
|
||||
public void focusGained(final FocusEvent e) {
|
||||
setSelectionBackground(SEL_ACTIVE_COLOR);
|
||||
// if nothing selected when we gain focus, select the first row (if exists)
|
||||
if (getSelectedIndex() == -1 && getCount() > 0) {
|
||||
@@ -364,7 +387,7 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void focusLost(FocusEvent e) {
|
||||
public void focusLost(final FocusEvent e) {
|
||||
if (!e.isTemporary()) {
|
||||
setSelectionBackground(SEL_INACTIVE_COLOR);
|
||||
}
|
||||
@@ -382,13 +405,13 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
|
||||
public void actionPerformed(final ActionEvent e) {
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
for (final int row : getSelectedRows()) {
|
||||
Entry<T, Integer> item = tableModel.rowToItem(row);
|
||||
final Entry<T, Integer> item = tableModel.rowToItem(row);
|
||||
sb.append(item.getValue().toString());
|
||||
sb.append(' ');
|
||||
sb.append(item.getKey().toString());
|
||||
sb.append('\n');
|
||||
}
|
||||
final StringSelection selection = new StringSelection(sb.toString());
|
||||
final StringSelection selection = new StringSelection(sb.toString());
|
||||
final Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
|
||||
clipboard.setContents(selection, selection);
|
||||
}
|
||||
@@ -399,12 +422,12 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
|
||||
}
|
||||
@Override
|
||||
protected JTableHeader createDefaultTableHeader() {
|
||||
SkinnedTableHeader header = new SkinnedTableHeader(columnModel) {
|
||||
final SkinnedTableHeader header = new SkinnedTableHeader(columnModel) {
|
||||
@Override
|
||||
public String getToolTipText(MouseEvent e) {
|
||||
int col = columnModel.getColumnIndexAtX(e.getPoint().x);
|
||||
public String getToolTipText(final MouseEvent e) {
|
||||
final int col = columnModel.getColumnIndexAtX(e.getPoint().x);
|
||||
if (col < 0) { return null; }
|
||||
ItemTableColumn tableColumn = (ItemTableColumn) columnModel.getColumn(col);
|
||||
final ItemTableColumn tableColumn = (ItemTableColumn) columnModel.getColumn(col);
|
||||
if (tableColumn.getLongName().isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
@@ -418,9 +441,9 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
|
||||
final DefaultTableCellRenderer renderer = ((DefaultTableCellRenderer)header.getDefaultRenderer());
|
||||
header.setDefaultRenderer(new DefaultTableCellRenderer() {
|
||||
@Override
|
||||
public Component getTableCellRendererComponent(JTable table,
|
||||
Object value, boolean isSelected, boolean hasFocus, int row, int column) {
|
||||
JLabel lbl = (JLabel) renderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
|
||||
public Component getTableCellRendererComponent(final JTable table,
|
||||
final Object value, final boolean isSelected, final boolean hasFocus, final int row, final int column) {
|
||||
final JLabel lbl = (JLabel) renderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
|
||||
lbl.setHorizontalAlignment(SwingConstants.LEFT);
|
||||
FSkin.setTempBorder(lbl, HEADER_BORDER);
|
||||
return lbl;
|
||||
@@ -429,39 +452,40 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
|
||||
return header;
|
||||
}
|
||||
|
||||
public void processMouseEvent(MouseEvent e) {
|
||||
Point p = e.getPoint();
|
||||
int row = rowAtPoint(p);
|
||||
int col = columnAtPoint(p);
|
||||
@Override
|
||||
public void processMouseEvent(final MouseEvent e) {
|
||||
final Point p = e.getPoint();
|
||||
final int row = rowAtPoint(p);
|
||||
final int col = columnAtPoint(p);
|
||||
|
||||
if (col < 0 || col >= getColumnCount() || row < 0 || row >= getRowCount()) {
|
||||
return;
|
||||
}
|
||||
|
||||
Object val = getValueAt(row, col);
|
||||
final Object val = getValueAt(row, col);
|
||||
if (val == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
ItemCellRenderer renderer = (ItemCellRenderer)getCellRenderer(row, col);
|
||||
final ItemCellRenderer renderer = (ItemCellRenderer)getCellRenderer(row, col);
|
||||
if (renderer != null) {
|
||||
renderer.processMouseEvent(e, ItemListView.this, val, row, col); //give renderer a chance to process the mouse event
|
||||
}
|
||||
try {
|
||||
super.processMouseEvent(e);
|
||||
}
|
||||
catch (Exception ex) { //trap error thrown by weird tooltip issue
|
||||
catch (final Exception ex) { //trap error thrown by weird tooltip issue
|
||||
ex.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
private String getCellTooltip(TableCellRenderer renderer, int row, int col, Object val) {
|
||||
Component cell = renderer.getTableCellRendererComponent(this, val, false, false, row, col);
|
||||
private String getCellTooltip(final TableCellRenderer renderer, final int row, final int col, final Object val) {
|
||||
final Component cell = renderer.getTableCellRendererComponent(this, val, false, false, row, col);
|
||||
|
||||
// use a pre-set tooltip if it exists
|
||||
if (cell instanceof JComponent) {
|
||||
JComponent jcell = (JComponent)cell;
|
||||
String tip = jcell.getToolTipText();
|
||||
final JComponent jcell = (JComponent)cell;
|
||||
final String tip = jcell.getToolTipText();
|
||||
if (tip != null && !tip.isEmpty()) {
|
||||
return tip;
|
||||
}
|
||||
@@ -470,7 +494,7 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
|
||||
// if we're conditionally showing the tooltip, check to see
|
||||
// if we shouldn't show it
|
||||
if (val == null) { return null; }
|
||||
String text = val.toString();
|
||||
final String text = val.toString();
|
||||
if (text.isEmpty()) { return null; }
|
||||
|
||||
if (!(renderer instanceof ItemCellRenderer) || !((ItemCellRenderer)renderer).alwaysShowTooltip()) {
|
||||
@@ -478,8 +502,8 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
|
||||
// we use '>' here instead of '>=' since that seems to be the
|
||||
// threshold for where the ellipses appear for the default
|
||||
// JTable renderer
|
||||
int requiredWidth = cell.getPreferredSize().width;
|
||||
TableColumn tableColumn = this.getColumnModel().getColumn(col);
|
||||
final int requiredWidth = cell.getPreferredSize().width;
|
||||
final TableColumn tableColumn = this.getColumnModel().getColumn(col);
|
||||
if (tableColumn.getWidth() > requiredWidth) {
|
||||
return null;
|
||||
}
|
||||
@@ -490,16 +514,16 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getToolTipText(MouseEvent e) {
|
||||
Point p = e.getPoint();
|
||||
int row = rowAtPoint(p);
|
||||
int col = columnAtPoint(p);
|
||||
public String getToolTipText(final MouseEvent e) {
|
||||
final Point p = e.getPoint();
|
||||
final int row = rowAtPoint(p);
|
||||
final int col = columnAtPoint(p);
|
||||
|
||||
if (col >= getColumnCount() || row >= getRowCount()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
Object val = getValueAt(row, col);
|
||||
final Object val = getValueAt(row, col);
|
||||
if (val == null) {
|
||||
return null;
|
||||
}
|
||||
@@ -512,7 +536,7 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
|
||||
private Point lastTooltipPt;
|
||||
|
||||
@Override
|
||||
public Point getToolTipLocation(MouseEvent e) {
|
||||
public Point getToolTipLocation(final MouseEvent e) {
|
||||
Point p = e.getPoint();
|
||||
final int row = rowAtPoint(p);
|
||||
final int col = columnAtPoint(p);
|
||||
@@ -533,7 +557,7 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
|
||||
|
||||
/**
|
||||
* Instantiates a new table model.
|
||||
*
|
||||
*
|
||||
* @param table0   {@link forge.gui.ItemManager.ItemTable<T>}
|
||||
* @param model0   {@link forge.gui.ItemManager.ItemManagerModel<T>}
|
||||
*/
|
||||
@@ -556,7 +580,7 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
|
||||
model.getCascadeManager().reset();
|
||||
|
||||
for (int i = sortcols.length - 1; i >= 0; i--) {
|
||||
ItemTableColumn col = sortcols[i];
|
||||
final ItemTableColumn col = sortcols[i];
|
||||
if (col != null) {
|
||||
model.getCascadeManager().add(col.getItemColumn(), true);
|
||||
}
|
||||
@@ -565,7 +589,7 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
|
||||
|
||||
/**
|
||||
* Row to item.
|
||||
*
|
||||
*
|
||||
* @param row - the row
|
||||
* @return the item
|
||||
*/
|
||||
@@ -576,7 +600,7 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
|
||||
|
||||
/**
|
||||
* Item to row.
|
||||
*
|
||||
*
|
||||
* @param item - the item
|
||||
* @return the row
|
||||
*/
|
||||
@@ -608,11 +632,11 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
|
||||
private ItemTableColumn resizeColumn;
|
||||
|
||||
@Override
|
||||
public void onLeftMouseDown(MouseEvent e) {
|
||||
public void onLeftMouseDown(final MouseEvent e) {
|
||||
focus();
|
||||
if (Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR) == table.getTableHeader().getCursor()) {
|
||||
final TableColumnModel colModel = table.getColumnModel();
|
||||
int index = colModel.getColumnIndexAtX(e.getX() - 3); //-3 to ensure we get column left of resizer
|
||||
final int index = colModel.getColumnIndexAtX(e.getX() - 3); //-3 to ensure we get column left of resizer
|
||||
if (index >= 0) {
|
||||
resizeColumn = (ItemTableColumn) colModel.getColumn(index);
|
||||
resizeColumn.startResize();
|
||||
@@ -622,7 +646,7 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onLeftMouseUp(MouseEvent e) {
|
||||
public void onLeftMouseUp(final MouseEvent e) {
|
||||
if (resizeColumn != null) {
|
||||
MouseUtil.unlockCursor();
|
||||
resizeColumn.endResize();
|
||||
@@ -631,7 +655,7 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onLeftClick(MouseEvent e) {
|
||||
public void onLeftClick(final MouseEvent e) {
|
||||
if (Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR) == table.getTableHeader().getCursor()) {
|
||||
return;
|
||||
}
|
||||
@@ -655,9 +679,9 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onLeftMouseDragDrop(MouseEvent e) { //save preferences after column moved/resized
|
||||
public void onLeftMouseDragDrop(final MouseEvent e) { //save preferences after column moved/resized
|
||||
for (int i = 0; i < table.getColumnCount(); i++) {
|
||||
ItemTableColumn column = (ItemTableColumn) table.getColumnModel().getColumn(i);
|
||||
final ItemTableColumn column = (ItemTableColumn) table.getColumnModel().getColumn(i);
|
||||
column.updatePreferredWidth();
|
||||
column.setIndex(i);
|
||||
}
|
||||
@@ -665,14 +689,14 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onMouseExit(MouseEvent e) {
|
||||
public void onMouseExit(final MouseEvent e) {
|
||||
MouseUtil.resetCursor();
|
||||
}
|
||||
};
|
||||
|
||||
private final MouseMotionAdapter headerMouseMotionAdapter = new MouseMotionAdapter() {
|
||||
@Override
|
||||
public void mouseMoved(MouseEvent arg0) {
|
||||
public void mouseMoved(final MouseEvent arg0) {
|
||||
MouseUtil.setCursor(table.getTableHeader().getCursor());
|
||||
}
|
||||
};
|
||||
@@ -724,8 +748,8 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
|
||||
* @see javax.swing.table.TableModel#getValueAt(int, int)
|
||||
*/
|
||||
@Override
|
||||
public Object getValueAt(int iRow, int iCol) {
|
||||
Entry<T, Integer> card = this.rowToItem(iRow);
|
||||
public Object getValueAt(final int iRow, final int iCol) {
|
||||
final Entry<T, Integer> card = this.rowToItem(iRow);
|
||||
if (null == card) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -6,17 +6,22 @@
|
||||
* 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 forge.itemmanager.views;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import javax.swing.table.TableColumn;
|
||||
|
||||
import com.google.common.base.Function;
|
||||
|
||||
import forge.item.InventoryItem;
|
||||
@@ -26,11 +31,6 @@ import forge.itemmanager.ItemColumnConfig;
|
||||
import forge.itemmanager.ItemColumnConfig.SortState;
|
||||
import forge.itemmanager.ItemManagerConfig;
|
||||
|
||||
import javax.swing.table.TableColumn;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
/**
|
||||
* A column object in a EditorTableModel in the card editor.
|
||||
* Requires a sorting function and a display function
|
||||
@@ -41,15 +41,15 @@ public class ItemTableColumn extends TableColumn {
|
||||
|
||||
private final ItemColumn itemColumn;
|
||||
|
||||
public ItemTableColumn(ItemColumn itemColumn0) {
|
||||
public ItemTableColumn(final ItemColumn itemColumn0) {
|
||||
super();
|
||||
|
||||
itemColumn = itemColumn0;
|
||||
ColumnDef def = itemColumn.getConfig().getDef();
|
||||
final ColumnDef def = itemColumn.getConfig().getDef();
|
||||
this.setIdentifier(def);
|
||||
this.setHeaderValue(def.shortName);
|
||||
|
||||
int width = itemColumn.getConfig().getPreferredWidth();
|
||||
final int width = itemColumn.getConfig().getPreferredWidth();
|
||||
this.setPreferredWidth(width);
|
||||
if (def.isWidthFixed) {
|
||||
this.setMinWidth(width);
|
||||
@@ -102,7 +102,7 @@ public class ItemTableColumn extends TableColumn {
|
||||
return itemColumn.getConfig().isVisible();
|
||||
}
|
||||
|
||||
public void setVisible(boolean visible0) {
|
||||
public void setVisible(final boolean visible0) {
|
||||
itemColumn.getConfig().setVisible(visible0);
|
||||
}
|
||||
|
||||
@@ -125,7 +125,7 @@ public class ItemTableColumn extends TableColumn {
|
||||
public void endResize() {
|
||||
//restore min/max width after resize to prevent table auto-scaling fixed width columns
|
||||
if (itemColumn.getConfig().getDef().isWidthFixed) {
|
||||
int width = this.getWidth();
|
||||
final int width = this.getWidth();
|
||||
this.setMinWidth(width);
|
||||
this.setMaxWidth(width);
|
||||
}
|
||||
@@ -140,13 +140,13 @@ public class ItemTableColumn extends TableColumn {
|
||||
return itemColumn.toString();
|
||||
}
|
||||
|
||||
public static void addColOverride(ItemManagerConfig config, Map<ColumnDef, ItemTableColumn> colOverrides, ColumnDef colDef) {
|
||||
ItemColumnConfig colConfig = config.getCols().get(colDef);
|
||||
public static void addColOverride(final ItemManagerConfig config, final Map<ColumnDef, ItemTableColumn> colOverrides, final ColumnDef colDef) {
|
||||
final ItemColumnConfig colConfig = config.getCols().get(colDef);
|
||||
addColOverride(config, colOverrides, colDef, colConfig.getFnSort(), colConfig.getFnDisplay());
|
||||
}
|
||||
public static void addColOverride(ItemManagerConfig config, Map<ColumnDef, ItemTableColumn> colOverrides, ColumnDef colDef,
|
||||
Function<Entry<InventoryItem, Integer>, Comparable<?>> fnSort0,
|
||||
Function<Entry<? extends InventoryItem, Integer>, Object> fnDisplay0) {
|
||||
public static void addColOverride(final ItemManagerConfig config, final Map<ColumnDef, ItemTableColumn> colOverrides, final ColumnDef colDef,
|
||||
final Function<Entry<InventoryItem, Integer>, Comparable<?>> fnSort0,
|
||||
final Function<Entry<? extends InventoryItem, Integer>, Object> fnDisplay0) {
|
||||
colOverrides.put(colDef, new ItemTableColumn(new ItemColumn(config.getCols().get(colDef), fnSort0, fnDisplay0)));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -70,7 +70,7 @@ public abstract class ItemView<T extends InventoryItem> {
|
||||
this.model = model0;
|
||||
this.scroller = new FScrollPane(false) {
|
||||
@Override
|
||||
protected void processMouseWheelEvent(MouseWheelEvent e) {
|
||||
protected void processMouseWheelEvent(final MouseWheelEvent e) {
|
||||
if (e.isControlDown()) {
|
||||
onMouseWheelZoom(e);
|
||||
return;
|
||||
@@ -81,9 +81,13 @@ public abstract class ItemView<T extends InventoryItem> {
|
||||
this.pnlOptions.setOpaque(false);
|
||||
this.pnlOptions.setBorder(new FSkin.MatteSkinBorder(1, 0, 0, 0, BORDER_COLOR));
|
||||
this.scroller.setBorder(new FSkin.LineSkinBorder(BORDER_COLOR));
|
||||
this.button = new FLabel.Builder().hoverable().selectable(true)
|
||||
.icon(getIcon()).iconScaleAuto(false)
|
||||
.tooltip(getCaption()).build();
|
||||
this.button = new FLabel.Builder()
|
||||
.hoverable()
|
||||
.selectable(true)
|
||||
.icon(getIcon())
|
||||
.iconScaleAuto(false)
|
||||
.tooltip(getCaption())
|
||||
.build();
|
||||
}
|
||||
|
||||
public void initialize(final int index) {
|
||||
@@ -92,16 +96,14 @@ public abstract class ItemView<T extends InventoryItem> {
|
||||
//hook incremental search functionality
|
||||
final IncrementalSearch incrementalSearch = new IncrementalSearch();
|
||||
comp.addFocusListener(new FocusAdapter() {
|
||||
@Override
|
||||
public void focusLost(FocusEvent arg0) {
|
||||
@Override public void focusLost(final FocusEvent arg0) {
|
||||
incrementalSearch.cancel();
|
||||
}
|
||||
});
|
||||
comp.addKeyListener(incrementalSearch);
|
||||
|
||||
this.button.setCommand(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
@Override public void run() {
|
||||
if (button.isSelected()) {
|
||||
itemManager.setViewIndex(index);
|
||||
}
|
||||
@@ -114,11 +116,10 @@ public abstract class ItemView<T extends InventoryItem> {
|
||||
this.scroller.setViewportView(comp);
|
||||
this.scroller.getVerticalScrollBar().addAdjustmentListener(new ToolTipListener());
|
||||
this.scroller.addComponentListener(new ComponentAdapter() {
|
||||
@Override
|
||||
public void componentResized(ComponentEvent e) {
|
||||
@Override public void componentResized(final ComponentEvent e) {
|
||||
onResize();
|
||||
//scroll selection into view whenever view height changes
|
||||
int height = e.getComponent().getHeight();
|
||||
final int height = e.getComponent().getHeight();
|
||||
if (height != heightBackup) {
|
||||
heightBackup = height;
|
||||
scrollSelectionIntoView();
|
||||
@@ -143,11 +144,11 @@ public abstract class ItemView<T extends InventoryItem> {
|
||||
return scroller.getVerticalScrollBar().getValue();
|
||||
}
|
||||
|
||||
public void setScrollValue(int value) {
|
||||
public void setScrollValue(final int value) {
|
||||
scroller.getVerticalScrollBar().setValue(value);
|
||||
}
|
||||
|
||||
protected void onMouseWheelZoom(MouseWheelEvent e) {
|
||||
protected void onMouseWheelZoom(final MouseWheelEvent e) {
|
||||
}
|
||||
|
||||
public boolean isIncrementalSearchActive() {
|
||||
@@ -178,9 +179,9 @@ public abstract class ItemView<T extends InventoryItem> {
|
||||
}
|
||||
|
||||
public final Collection<T> getSelectedItems() {
|
||||
List<T> items = new ArrayList<T>();
|
||||
for (Integer i : getSelectedIndices()) {
|
||||
T item = getItemAtIndex(i);
|
||||
final List<T> items = new ArrayList<T>();
|
||||
for (final Integer i : getSelectedIndices()) {
|
||||
final T item = getItemAtIndex(i);
|
||||
if (item != null) {
|
||||
items.add(item);
|
||||
}
|
||||
@@ -188,11 +189,11 @@ public abstract class ItemView<T extends InventoryItem> {
|
||||
return items;
|
||||
}
|
||||
|
||||
public final boolean setSelectedItem(T item) {
|
||||
public final boolean setSelectedItem(final T item) {
|
||||
return setSelectedItem(item, true);
|
||||
}
|
||||
public final boolean setSelectedItem(T item, boolean scrollIntoView) {
|
||||
int index = getIndexOfItem(item);
|
||||
public final boolean setSelectedItem(final T item, final boolean scrollIntoView) {
|
||||
final int index = getIndexOfItem(item);
|
||||
if (index != -1) {
|
||||
setSelectedIndex(index, scrollIntoView);
|
||||
return true;
|
||||
@@ -200,13 +201,13 @@ public abstract class ItemView<T extends InventoryItem> {
|
||||
return false;
|
||||
}
|
||||
|
||||
public final boolean setSelectedItems(Iterable<T> items) {
|
||||
public final boolean setSelectedItems(final Iterable<T> items) {
|
||||
return setSelectedItems(items, true);
|
||||
}
|
||||
public final boolean setSelectedItems(Iterable<T> items, boolean scrollIntoView) {
|
||||
List<Integer> indices = new ArrayList<Integer>();
|
||||
for (T item : items) {
|
||||
int index = getIndexOfItem(item);
|
||||
public final boolean setSelectedItems(final Iterable<T> items, final boolean scrollIntoView) {
|
||||
final List<Integer> indices = new ArrayList<Integer>();
|
||||
for (final T item : items) {
|
||||
final int index = getIndexOfItem(item);
|
||||
if (index != -1) {
|
||||
indices.add(index);
|
||||
}
|
||||
@@ -221,11 +222,11 @@ public abstract class ItemView<T extends InventoryItem> {
|
||||
return false;
|
||||
}
|
||||
|
||||
public void setSelectedIndex(int index) {
|
||||
public void setSelectedIndex(final int index) {
|
||||
setSelectedIndex(index, true);
|
||||
}
|
||||
public void setSelectedIndex(int index, boolean scrollIntoView) {
|
||||
int count = getCount();
|
||||
public void setSelectedIndex(int index, final boolean scrollIntoView) {
|
||||
final int count = getCount();
|
||||
if (count == 0) { return; }
|
||||
|
||||
if (index < 0) {
|
||||
@@ -241,22 +242,22 @@ public abstract class ItemView<T extends InventoryItem> {
|
||||
}
|
||||
}
|
||||
|
||||
public void setSelectedIndices(Iterable<Integer> indices) {
|
||||
public void setSelectedIndices(final Iterable<Integer> indices) {
|
||||
setSelectedIndices(indices, true);
|
||||
}
|
||||
public void setSelectedIndices(Iterable<Integer> indices, boolean scrollIntoView) {
|
||||
int count = getCount();
|
||||
public void setSelectedIndices(final Iterable<Integer> indices, final boolean scrollIntoView) {
|
||||
final int count = getCount();
|
||||
if (count == 0) { return; }
|
||||
|
||||
List<Integer> indexList = new ArrayList<Integer>();
|
||||
for (Integer index : indices) {
|
||||
final List<Integer> indexList = new ArrayList<Integer>();
|
||||
for (final Integer index : indices) {
|
||||
if (index >= 0 && index < count) {
|
||||
indexList.add(index);
|
||||
}
|
||||
}
|
||||
|
||||
if (indexList.isEmpty()) { //if no index in range, set selected index based on first index
|
||||
for (Integer index : indices) {
|
||||
for (final Integer index : indices) {
|
||||
setSelectedIndex(index);
|
||||
return;
|
||||
}
|
||||
@@ -272,15 +273,15 @@ public abstract class ItemView<T extends InventoryItem> {
|
||||
protected void onSelectionChange() {
|
||||
final int index = getSelectedIndex();
|
||||
if (index != -1) {
|
||||
ListSelectionEvent event = new ListSelectionEvent(itemManager, index, index, false);
|
||||
for (ListSelectionListener listener : itemManager.getSelectionListeners()) {
|
||||
final ListSelectionEvent event = new ListSelectionEvent(itemManager, index, index, false);
|
||||
for (final ListSelectionListener listener : itemManager.getSelectionListeners()) {
|
||||
listener.valueChanged(event);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void scrollSelectionIntoView() {
|
||||
Container parent = getComponent().getParent();
|
||||
final Container parent = getComponent().getParent();
|
||||
if (parent instanceof JViewport) {
|
||||
onScrollSelectionIntoView((JViewport)parent);
|
||||
}
|
||||
@@ -334,13 +335,13 @@ public abstract class ItemView<T extends InventoryItem> {
|
||||
private void setPopupSize() {
|
||||
// resize popup to size of label (ensure there's room for the next character so the label
|
||||
// doesn't show '...' in the time between when we set the text and when we increase the size
|
||||
Dimension labelDimension = popupLabel.getPreferredSize();
|
||||
Dimension popupDimension = new Dimension(labelDimension.width + 12, labelDimension.height + 4);
|
||||
final Dimension labelDimension = popupLabel.getPreferredSize();
|
||||
final Dimension popupDimension = new Dimension(labelDimension.width + 12, labelDimension.height + 4);
|
||||
SwingUtilities.getRoot(popupLabel).setSize(popupDimension);
|
||||
}
|
||||
|
||||
private void findNextMatch(int startIdx, boolean reverse) {
|
||||
int numItems = itemManager.getItemCount();
|
||||
private void findNextMatch(int startIdx, final boolean reverse) {
|
||||
final int numItems = itemManager.getItemCount();
|
||||
if (0 == numItems) {
|
||||
cancel();
|
||||
return;
|
||||
@@ -349,11 +350,11 @@ public abstract class ItemView<T extends InventoryItem> {
|
||||
// find the next item that matches the string
|
||||
startIdx %= numItems;
|
||||
final int increment = reverse ? numItems - 1 : 1;
|
||||
int stopIdx = (startIdx + numItems - increment) % numItems;
|
||||
String searchStr = str.toString();
|
||||
final int stopIdx = (startIdx + numItems - increment) % numItems;
|
||||
final String searchStr = str.toString();
|
||||
boolean found = false;
|
||||
for (int idx = startIdx;; idx = (idx + increment) % numItems) {
|
||||
T item = ItemView.this.getItemAtIndex(idx);
|
||||
final T item = ItemView.this.getItemAtIndex(idx);
|
||||
if (item == null) {
|
||||
break;
|
||||
}
|
||||
@@ -388,14 +389,13 @@ public abstract class ItemView<T extends InventoryItem> {
|
||||
popupTimer.restart();
|
||||
}
|
||||
else {
|
||||
PopupFactory factory = PopupFactory.getSharedInstance();
|
||||
Point tableLoc = ItemView.this.getLocationOnScreen();
|
||||
final PopupFactory factory = PopupFactory.getSharedInstance();
|
||||
final Point tableLoc = ItemView.this.getLocationOnScreen();
|
||||
popup = factory.getPopup(null, popupLabel, tableLoc.x + 10, tableLoc.y + 10);
|
||||
FSkin.setTempBackground(SwingUtilities.getRoot(popupLabel), FSkin.getColor(FSkin.Colors.CLR_INACTIVE));
|
||||
|
||||
popupTimer = new Timer(5000, new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
@Override public void actionPerformed(final ActionEvent e) {
|
||||
cancel();
|
||||
}
|
||||
});
|
||||
@@ -424,14 +424,14 @@ public abstract class ItemView<T extends InventoryItem> {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void keyPressed(KeyEvent e) {
|
||||
public void keyPressed(final KeyEvent e) {
|
||||
if (popupShowing) {
|
||||
if (KeyEvent.VK_ESCAPE == e.getKeyCode()) {
|
||||
cancel();
|
||||
}
|
||||
}
|
||||
else {
|
||||
for (KeyListener keyListener : itemManager.getKeyListeners()) {
|
||||
for (final KeyListener keyListener : itemManager.getKeyListeners()) {
|
||||
keyListener.keyPressed(e);
|
||||
if (e.isConsumed()) { return; }
|
||||
}
|
||||
@@ -445,9 +445,9 @@ public abstract class ItemView<T extends InventoryItem> {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void keyTyped(KeyEvent e) {
|
||||
public void keyTyped(final KeyEvent e) {
|
||||
if (!popupShowing) {
|
||||
for (KeyListener keyListener : itemManager.getKeyListeners()) {
|
||||
for (final KeyListener keyListener : itemManager.getKeyListeners()) {
|
||||
keyListener.keyTyped(e);
|
||||
if (e.isConsumed()) { return; }
|
||||
}
|
||||
@@ -478,11 +478,11 @@ public abstract class ItemView<T extends InventoryItem> {
|
||||
return;
|
||||
}
|
||||
|
||||
//$FALL-THROUGH$
|
||||
//$FALL-THROUGH$
|
||||
default:
|
||||
// shift and/or alt-graph down is ok. anything else is a hotkey (e.g. ctrl-f)
|
||||
if (okModifiers != (e.getModifiers() | okModifiers)
|
||||
|| !CharUtils.isAsciiPrintable(e.getKeyChar())) { // escape sneaks in here on Windows
|
||||
|| !CharUtils.isAsciiPrintable(e.getKeyChar())) { // escape sneaks in here on Windows
|
||||
return;
|
||||
}
|
||||
str.append(e.getKeyChar());
|
||||
@@ -492,9 +492,9 @@ public abstract class ItemView<T extends InventoryItem> {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void keyReleased(KeyEvent e) {
|
||||
public void keyReleased(final KeyEvent e) {
|
||||
if (!popupShowing) {
|
||||
for (KeyListener keyListener : itemManager.getKeyListeners()) {
|
||||
for (final KeyListener keyListener : itemManager.getKeyListeners()) {
|
||||
keyListener.keyReleased(e);
|
||||
if (e.isConsumed()) { return; }
|
||||
}
|
||||
|
||||
@@ -38,12 +38,12 @@ public final class LayoutMenu {
|
||||
|
||||
private FScreen currentScreen;
|
||||
private static final ForgePreferences prefs = FModel.getPreferences();
|
||||
private boolean showIcons = false;
|
||||
private final boolean showIcons = false;
|
||||
|
||||
public JMenu getMenu() {
|
||||
currentScreen = Singletons.getControl().getCurrentScreen();
|
||||
|
||||
JMenu menu = new JMenu("Layout");
|
||||
final JMenu menu = new JMenu("Layout");
|
||||
menu.setMnemonic(KeyEvent.VK_L);
|
||||
if (currentScreen != FScreen.HOME_SCREEN) {
|
||||
menu.add(getMenu_ViewOptions());
|
||||
@@ -60,7 +60,7 @@ public final class LayoutMenu {
|
||||
}
|
||||
|
||||
private JMenu getMenu_ViewOptions() {
|
||||
JMenu menu = new JMenu("View");
|
||||
final JMenu menu = new JMenu("View");
|
||||
menu.add(getMenuItem_ShowTabs());
|
||||
if (currentScreen != null && currentScreen.isMatchScreen()) {
|
||||
menu.add(getMenuItem_ShowBackgroundImage());
|
||||
@@ -69,18 +69,18 @@ public final class LayoutMenu {
|
||||
}
|
||||
|
||||
private JMenu getMenu_FileOptions() {
|
||||
JMenu menu = new JMenu("File");
|
||||
final JMenu menu = new JMenu("File");
|
||||
menu.add(getMenuItem_OpenLayout());
|
||||
menu.add(getMenuItem_SaveLayout());
|
||||
return menu;
|
||||
}
|
||||
|
||||
private static JMenu getMenu_ThemeOptions() {
|
||||
JMenu menu = new JMenu("Theme");
|
||||
final JMenu menu = new JMenu("Theme");
|
||||
JRadioButtonMenuItem menuItem;
|
||||
ButtonGroup group = new ButtonGroup();
|
||||
String currentSkin = prefs.getPref(FPref.UI_SKIN);
|
||||
for (String skin : FSkin.getAllSkins()) {
|
||||
final ButtonGroup group = new ButtonGroup();
|
||||
final String currentSkin = prefs.getPref(FPref.UI_SKIN);
|
||||
for (final String skin : FSkin.getAllSkins()) {
|
||||
menuItem = new JRadioButtonMenuItem(skin);
|
||||
group.add(menuItem);
|
||||
if (skin.equals(currentSkin)) {
|
||||
@@ -94,8 +94,7 @@ public final class LayoutMenu {
|
||||
}
|
||||
|
||||
private static final ActionListener changeSkin = new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
@Override public void actionPerformed(final ActionEvent e) {
|
||||
MouseUtil.setCursor(Cursor.WAIT_CURSOR);
|
||||
FSkin.changeSkin(e.getActionCommand());
|
||||
MouseUtil.resetCursor();
|
||||
@@ -111,9 +110,8 @@ public final class LayoutMenu {
|
||||
|
||||
private static ActionListener getShowBackgroundImageAction(final JCheckBoxMenuItem menuItem) {
|
||||
return new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
boolean isVisible = menuItem.getState();
|
||||
@Override public void actionPerformed(final ActionEvent e) {
|
||||
final boolean isVisible = menuItem.getState();
|
||||
prefs.setPref(FPref.UI_MATCH_IMAGE_VISIBLE, isVisible);
|
||||
if (isVisible) {
|
||||
FView.SINGLETON_INSTANCE.getPnlInsets().setForegroundImage(FSkin.getIcon(FSkinProp.BG_MATCH));
|
||||
@@ -134,9 +132,8 @@ public final class LayoutMenu {
|
||||
}
|
||||
private static ActionListener getShowTabsAction(final JCheckBoxMenuItem menuItem) {
|
||||
return new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
boolean showTabs = menuItem.getState();
|
||||
@Override public void actionPerformed(final ActionEvent e) {
|
||||
final boolean showTabs = menuItem.getState();
|
||||
FView.SINGLETON_INSTANCE.refreshAllCellLayouts(showTabs);
|
||||
prefs.setPref(FPref.UI_HIDE_GAME_TABS, !showTabs);
|
||||
prefs.save();
|
||||
@@ -145,67 +142,63 @@ public final class LayoutMenu {
|
||||
}
|
||||
|
||||
private JMenuItem getMenuItem_SaveLayout() {
|
||||
SkinnedMenuItem menuItem = new SkinnedMenuItem("Save Current Layout");
|
||||
final SkinnedMenuItem menuItem = new SkinnedMenuItem("Save Current Layout");
|
||||
menuItem.setIcon((showIcons ? MenuUtil.getMenuIcon(FSkinProp.ICO_SAVELAYOUT) : null));
|
||||
menuItem.addActionListener(getSaveLayoutAction());
|
||||
return menuItem;
|
||||
}
|
||||
|
||||
private ActionListener getSaveLayoutAction() {
|
||||
private static ActionListener getSaveLayoutAction() {
|
||||
return new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
@Override public void actionPerformed(final ActionEvent e) {
|
||||
SLayoutIO.saveLayout();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
private JMenuItem getMenuItem_OpenLayout() {
|
||||
SkinnedMenuItem menuItem = new SkinnedMenuItem("Open...");
|
||||
final SkinnedMenuItem menuItem = new SkinnedMenuItem("Open...");
|
||||
menuItem.setIcon((showIcons ? MenuUtil.getMenuIcon(FSkinProp.ICO_OPENLAYOUT) : null));
|
||||
menuItem.addActionListener(getOpenLayoutAction());
|
||||
return menuItem;
|
||||
}
|
||||
|
||||
private ActionListener getOpenLayoutAction() {
|
||||
private static ActionListener getOpenLayoutAction() {
|
||||
return new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
@Override public void actionPerformed(final ActionEvent e) {
|
||||
SLayoutIO.openLayout();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
private JMenuItem getMenuItem_RevertLayout() {
|
||||
SkinnedMenuItem menuItem = new SkinnedMenuItem("Refresh");
|
||||
final SkinnedMenuItem menuItem = new SkinnedMenuItem("Refresh");
|
||||
menuItem.setIcon((showIcons ? MenuUtil.getMenuIcon(FSkinProp.ICO_REVERTLAYOUT) : null));
|
||||
menuItem.addActionListener(getRevertLayoutAction());
|
||||
return menuItem;
|
||||
}
|
||||
|
||||
private ActionListener getRevertLayoutAction() {
|
||||
private static ActionListener getRevertLayoutAction() {
|
||||
return new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
@Override public void actionPerformed(final ActionEvent e) {
|
||||
SLayoutIO.revertLayout();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
private static JMenuItem getMenuItem_SetWindowSize() {
|
||||
JMenuItem menuItem = new JMenuItem("Set Window Size");
|
||||
final JMenuItem menuItem = new JMenuItem("Set Window Size");
|
||||
menuItem.addActionListener(getSetWindowSizeAction());
|
||||
return menuItem;
|
||||
}
|
||||
|
||||
private static ActionListener getSetWindowSizeAction() {
|
||||
return new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
String[] options = {"800x600", "1024x768", "1280x720"};
|
||||
@Override public void actionPerformed(final ActionEvent e) {
|
||||
final String[] options = {"800x600", "1024x768", "1280x720"};
|
||||
final String choice = GuiChoose.oneOrNone("Choose new window size", options);
|
||||
if (choice != null) {
|
||||
String[] dims = choice.split("x");
|
||||
final String[] dims = choice.split("x");
|
||||
Singletons.getView().getFrame().setSize(Integer.parseInt(dims[0]), Integer.parseInt(dims[1]));
|
||||
}
|
||||
}
|
||||
@@ -225,8 +218,7 @@ public final class LayoutMenu {
|
||||
}
|
||||
private static ActionListener getFullScreenAction() {
|
||||
return new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
@Override public void actionPerformed(final ActionEvent e) {
|
||||
final FFrame frame = Singletons.getView().getFrame();
|
||||
frame.setFullScreen(!frame.isFullScreen());
|
||||
}
|
||||
|
||||
@@ -1,21 +1,18 @@
|
||||
package forge.screens.bazaar;
|
||||
|
||||
import javax.swing.SwingUtilities;
|
||||
|
||||
import com.google.common.collect.Iterables;
|
||||
|
||||
import forge.UiCommand;
|
||||
import forge.gui.framework.ICDoc;
|
||||
import forge.quest.bazaar.QuestBazaarManager;
|
||||
import forge.toolbox.FLabel;
|
||||
|
||||
import javax.swing.*;
|
||||
|
||||
/**
|
||||
* TODO: Write javadoc for this type.
|
||||
*
|
||||
*/
|
||||
public enum CBazaarUI implements ICDoc {
|
||||
SINGLETON_INSTANCE;
|
||||
|
||||
private final VBazaarUI view = VBazaarUI.SINGLETON_INSTANCE;
|
||||
|
||||
/**
|
||||
* Controls top-level instance of bazaar.
|
||||
* @param v0   {@link forge.screens.bazaar.VBazaarUI}
|
||||
@@ -25,32 +22,22 @@ public enum CBazaarUI implements ICDoc {
|
||||
}
|
||||
|
||||
/** Populate all stalls, and select first one. */
|
||||
public void initBazaar(QuestBazaarManager bazaar) {
|
||||
VBazaarUI.SINGLETON_INSTANCE.populateStalls();
|
||||
((FLabel) VBazaarUI.SINGLETON_INSTANCE.getPnlAllStalls().getComponent(0)).setSelected(true);
|
||||
public void initBazaar(final QuestBazaarManager bazaar) {
|
||||
view.populateStalls();
|
||||
((FLabel) view.getPnlAllStalls().getComponent(0)).setSelected(true);
|
||||
showStall(Iterables.get(bazaar.getStallNames(), 0), bazaar);
|
||||
}
|
||||
|
||||
/** @param s0   {@link java.lang.String} */
|
||||
public void showStall(final String s0, final QuestBazaarManager bazaar) {
|
||||
SwingUtilities.invokeLater(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
VBazaarUI.SINGLETON_INSTANCE.getPnlSingleStall().setStall(bazaar.getStall(s0));
|
||||
VBazaarUI.SINGLETON_INSTANCE.getPnlSingleStall().updateStall();
|
||||
@Override public void run() {
|
||||
view.getPnlSingleStall().setStall(bazaar.getStall(s0));
|
||||
view.getPnlSingleStall().updateStall();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.framework.ICDoc#getCommandOnSelect()
|
||||
*/
|
||||
@Override
|
||||
public UiCommand getCommandOnSelect() {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void register() {
|
||||
}
|
||||
@@ -60,8 +47,6 @@ public enum CBazaarUI implements ICDoc {
|
||||
*/
|
||||
@Override
|
||||
public void initialize() {
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@@ -69,7 +54,5 @@ public enum CBazaarUI implements ICDoc {
|
||||
*/
|
||||
@Override
|
||||
public void update() {
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,12 +6,12 @@
|
||||
* 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/>.
|
||||
*/
|
||||
@@ -52,7 +52,7 @@ import forge.util.ItemPool;
|
||||
* top-level control for child UIs. Tasks targeting the view of individual
|
||||
* components are found in a separate controller for that component and
|
||||
* should not be included here.
|
||||
*
|
||||
*
|
||||
* <br><br><i>(C at beginning of class name denotes a control class.)</i>
|
||||
*/
|
||||
public enum CDeckEditorUI implements ICDoc {
|
||||
@@ -60,9 +60,9 @@ public enum CDeckEditorUI implements ICDoc {
|
||||
SINGLETON_INSTANCE;
|
||||
|
||||
private final HashMap<FScreen, ACEditorBase<? extends InventoryItem, ? extends DeckBase>> screenChildControllers;
|
||||
private ACEditorBase<? extends InventoryItem, ? extends DeckBase> childController;
|
||||
private final CDetailPicture cDetailPicture;
|
||||
private final VAllDecks vAllDecks;
|
||||
private ACEditorBase<? extends InventoryItem, ? extends DeckBase> childController;
|
||||
private final CDetailPicture cDetailPicture;
|
||||
private final VAllDecks vAllDecks;
|
||||
|
||||
private CDeckEditorUI() {
|
||||
screenChildControllers = new HashMap<FScreen, ACEditorBase<? extends InventoryItem, ? extends DeckBase>>();
|
||||
@@ -92,7 +92,7 @@ public enum CDeckEditorUI implements ICDoc {
|
||||
return !deckController.isSaved();
|
||||
}
|
||||
|
||||
public boolean canSwitchAway(boolean isClosing) {
|
||||
public boolean canSwitchAway(final boolean isClosing) {
|
||||
if (this.childController != null) {
|
||||
if (!this.childController.canSwitchAway(isClosing)) {
|
||||
return false;
|
||||
@@ -117,8 +117,8 @@ public enum CDeckEditorUI implements ICDoc {
|
||||
/**
|
||||
* Set controller for a given editor screen.
|
||||
*/
|
||||
public void setEditorController(ACEditorBase<? extends InventoryItem, ? extends DeckBase> childController0) {
|
||||
FScreen screen = childController0.getScreen();
|
||||
public void setEditorController(final ACEditorBase<? extends InventoryItem, ? extends DeckBase> childController0) {
|
||||
final FScreen screen = childController0.getScreen();
|
||||
screenChildControllers.put(screen, childController0);
|
||||
if (screen == Singletons.getControl().getCurrentScreen()) {
|
||||
setCurrentEditorController(childController0);
|
||||
@@ -126,18 +126,18 @@ public enum CDeckEditorUI implements ICDoc {
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public <T extends InventoryItem> void incrementDeckQuantity(T item, int delta) {
|
||||
public <T extends InventoryItem> void incrementDeckQuantity(final T item, final int delta) {
|
||||
if (item == null || delta == 0) { return; }
|
||||
|
||||
if (delta > 0) { //add items
|
||||
int qty = Math.min(delta, ((ItemManager<T>)childController.getCatalogManager()).getItemCount(item));
|
||||
final int qty = Math.min(delta, ((ItemManager<T>)childController.getCatalogManager()).getItemCount(item));
|
||||
if (qty == 0) { return; }
|
||||
((ACEditorBase<T, ?>)childController).addItem(item, qty, false);
|
||||
((ACEditorBase<T, ?>)childController).addItem(item, qty);
|
||||
}
|
||||
else { //remove items
|
||||
int qty = Math.min(-delta, ((ItemManager<T>)childController.getDeckManager()).getItemCount(item));
|
||||
final int qty = Math.min(-delta, ((ItemManager<T>)childController.getDeckManager()).getItemCount(item));
|
||||
if (qty == 0) { return; }
|
||||
((ACEditorBase<T, ?>)childController).removeItem(item, qty, false);
|
||||
((ACEditorBase<T, ?>)childController).removeItem(item, qty);
|
||||
}
|
||||
|
||||
CStatistics.SINGLETON_INSTANCE.update();
|
||||
@@ -148,12 +148,12 @@ public enum CDeckEditorUI implements ICDoc {
|
||||
public <T extends InventoryItem> void move(Iterable<Entry<T, Integer>> items);
|
||||
}
|
||||
|
||||
private <T extends InventoryItem> void moveSelectedItems(ItemManager<T> itemManager, _MoveAction moveAction, int maxQty) {
|
||||
private <T extends InventoryItem> void moveSelectedItems(final ItemManager<T> itemManager, final _MoveAction moveAction, final int maxQty) {
|
||||
if (maxQty == 0) { return; }
|
||||
|
||||
ItemPool<T> items = new ItemPool<T>(itemManager.getGenericType());
|
||||
for (T item : itemManager.getSelectedItems()) {
|
||||
int qty = Math.min(maxQty, itemManager.getItemCount(item));
|
||||
final ItemPool<T> items = new ItemPool<T>(itemManager.getGenericType());
|
||||
for (final T item : itemManager.getSelectedItems()) {
|
||||
final int qty = Math.min(maxQty, itemManager.getItemCount(item));
|
||||
if (qty > 0) {
|
||||
items.add(item, qty);
|
||||
}
|
||||
@@ -167,42 +167,28 @@ public enum CDeckEditorUI implements ICDoc {
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public void addSelectedCards(final boolean toAlternate, int number) {
|
||||
public void addSelectedCards(final boolean toAlternate, final int number) {
|
||||
moveSelectedItems(childController.getCatalogManager(), new _MoveAction() {
|
||||
@Override
|
||||
public <T extends InventoryItem> void move(Iterable<Entry<T, Integer>> items) {
|
||||
@Override public <T extends InventoryItem> void move(final Iterable<Entry<T, Integer>> items) {
|
||||
((ACEditorBase<T, ?>)childController).addItems(items, toAlternate);
|
||||
}
|
||||
}, number);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public void removeSelectedCards(final boolean toAlternate, int number) {
|
||||
public void removeSelectedCards(final boolean toAlternate, final int number) {
|
||||
moveSelectedItems(childController.getDeckManager(), new _MoveAction() {
|
||||
@Override
|
||||
public <T extends InventoryItem> void move(Iterable<Entry<T, Integer>> items) {
|
||||
@Override public <T extends InventoryItem> void move(final Iterable<Entry<T, Integer>> items) {
|
||||
((ACEditorBase<T, ?>)childController).removeItems(items, toAlternate);
|
||||
}
|
||||
}, number);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public void removeAllCards(final boolean toAlternate) {
|
||||
ItemManager<?> v = childController.getDeckManager();
|
||||
v.selectAll();
|
||||
moveSelectedItems(v, new _MoveAction() {
|
||||
@Override
|
||||
public <T extends InventoryItem> void move(Iterable<Entry<T, Integer>> items) {
|
||||
((ACEditorBase<T, ?>)childController).removeItems(items, toAlternate);
|
||||
}
|
||||
}, Integer.MAX_VALUE);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set current editor controller
|
||||
*/
|
||||
@SuppressWarnings("serial")
|
||||
private void setCurrentEditorController(ACEditorBase<? extends InventoryItem, ? extends DeckBase> childController0) {
|
||||
private void setCurrentEditorController(final ACEditorBase<? extends InventoryItem, ? extends DeckBase> childController0) {
|
||||
this.childController = childController0;
|
||||
Singletons.getControl().getForgeMenu().setProvider(childController0);
|
||||
|
||||
@@ -216,8 +202,7 @@ public enum CDeckEditorUI implements ICDoc {
|
||||
|
||||
if (!childController.listenersHooked) { //hook listeners the first time the controller is updated
|
||||
catView.addKeyListener(new KeyAdapter() {
|
||||
@Override
|
||||
public void keyPressed(KeyEvent e) {
|
||||
@Override public void keyPressed(final KeyEvent e) {
|
||||
if (!catView.isIncrementalSearchActive() && KeyEvent.VK_SPACE == e.getKeyCode()) {
|
||||
addSelectedCards(e.isControlDown() || e.isMetaDown(), e.isShiftDown() ? 4: 1);
|
||||
}
|
||||
@@ -229,8 +214,7 @@ public enum CDeckEditorUI implements ICDoc {
|
||||
});
|
||||
|
||||
deckView.addKeyListener(new KeyAdapter() {
|
||||
@Override
|
||||
public void keyPressed(KeyEvent e) {
|
||||
@Override public void keyPressed(final KeyEvent e) {
|
||||
if (!catView.isIncrementalSearchActive() && KeyEvent.VK_SPACE == e.getKeyCode()) {
|
||||
removeSelectedCards(e.isControlDown() || e.isMetaDown(), e.isShiftDown() ? 4: 1);
|
||||
}
|
||||
@@ -265,18 +249,16 @@ public enum CDeckEditorUI implements ICDoc {
|
||||
|
||||
//set card when selection changes
|
||||
catView.addSelectionListener(new ListSelectionListener() {
|
||||
@Override
|
||||
public void valueChanged(ListSelectionEvent e) {
|
||||
setCard(catView.getSelectedItem());
|
||||
}
|
||||
});
|
||||
@Override public void valueChanged(final ListSelectionEvent e) {
|
||||
setCard(catView.getSelectedItem());
|
||||
}
|
||||
});
|
||||
|
||||
deckView.addSelectionListener(new ListSelectionListener() {
|
||||
@Override
|
||||
public void valueChanged(ListSelectionEvent e) {
|
||||
setCard(deckView.getSelectedItem());
|
||||
}
|
||||
});
|
||||
@Override public void valueChanged(final ListSelectionEvent e) {
|
||||
setCard(deckView.getSelectedItem());
|
||||
}
|
||||
});
|
||||
|
||||
catView.setAllowMultipleSelections(true);
|
||||
deckView.setAllowMultipleSelections(true);
|
||||
@@ -296,14 +278,6 @@ public enum CDeckEditorUI implements ICDoc {
|
||||
});
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.framework.ICDoc#getCommandOnSelect()
|
||||
*/
|
||||
@Override
|
||||
public UiCommand getCommandOnSelect() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void register() {
|
||||
EDocID.CARD_PICTURE.setDoc(cDetailPicture.getCPicture().getView());
|
||||
@@ -316,17 +290,16 @@ public enum CDeckEditorUI implements ICDoc {
|
||||
@Override
|
||||
public void initialize() {
|
||||
//change to previously open child controller based on screen
|
||||
FScreen screen = Singletons.getControl().getCurrentScreen();
|
||||
ACEditorBase<? extends InventoryItem, ? extends DeckBase> screenChildController = screenChildControllers.get(screen);
|
||||
final FScreen screen = Singletons.getControl().getCurrentScreen();
|
||||
final ACEditorBase<? extends InventoryItem, ? extends DeckBase> screenChildController = screenChildControllers.get(screen);
|
||||
if (screenChildController != null) {
|
||||
setCurrentEditorController(screenChildController);
|
||||
}
|
||||
else if (screen == FScreen.DECK_EDITOR_CONSTRUCTED) {
|
||||
} else if (screen == FScreen.DECK_EDITOR_CONSTRUCTED) {
|
||||
setEditorController(new CEditorConstructed(cDetailPicture)); //ensure Constructed deck editor controller initialized
|
||||
|
||||
String currentDeckStr = DeckPreferences.getCurrentDeck();
|
||||
final String currentDeckStr = DeckPreferences.getCurrentDeck();
|
||||
if (currentDeckStr != null) {
|
||||
DeckProxy deck = vAllDecks.getLstDecks().stringToItem(currentDeckStr);
|
||||
final DeckProxy deck = vAllDecks.getLstDecks().stringToItem(currentDeckStr);
|
||||
if (deck != null) {
|
||||
vAllDecks.getLstDecks().setSelectedItem(deck);
|
||||
childController.getDeckController().load(deck.getPath(), deck.getName());
|
||||
|
||||
@@ -6,17 +6,26 @@
|
||||
* 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 forge.screens.deckeditor;
|
||||
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.awt.event.WindowEvent;
|
||||
import java.util.List;
|
||||
|
||||
import javax.swing.BorderFactory;
|
||||
import javax.swing.event.DocumentEvent;
|
||||
import javax.swing.event.DocumentListener;
|
||||
|
||||
import forge.deck.Deck;
|
||||
import forge.deck.DeckBase;
|
||||
import forge.deck.DeckImportController;
|
||||
@@ -24,19 +33,18 @@ import forge.deck.DeckRecognizer;
|
||||
import forge.deck.DeckRecognizer.TokenType;
|
||||
import forge.item.InventoryItem;
|
||||
import forge.screens.deckeditor.controllers.ACEditorBase;
|
||||
import forge.toolbox.*;
|
||||
import forge.toolbox.FButton;
|
||||
import forge.toolbox.FCheckBox;
|
||||
import forge.toolbox.FComboBox;
|
||||
import forge.toolbox.FHtmlViewer;
|
||||
import forge.toolbox.FLabel;
|
||||
import forge.toolbox.FScrollPane;
|
||||
import forge.toolbox.FSkin;
|
||||
import forge.toolbox.FTextArea;
|
||||
import forge.view.FDialog;
|
||||
|
||||
import javax.swing.*;
|
||||
import javax.swing.event.DocumentEvent;
|
||||
import javax.swing.event.DocumentListener;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.awt.event.WindowEvent;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
* Dialog for quick import of decks.
|
||||
*
|
||||
* @param <TItem>
|
||||
@@ -87,7 +95,7 @@ public class DeckImport<TItem extends InventoryItem, TModel extends DeckBase> ex
|
||||
private final ACEditorBase<TItem, TModel> host;
|
||||
|
||||
|
||||
public DeckImport(final ACEditorBase<TItem, TModel> g, boolean allowCardsFromAllSets) {
|
||||
public DeckImport(final ACEditorBase<TItem, TModel> g, final boolean allowCardsFromAllSets) {
|
||||
this.controller = new DeckImportController(!g.getDeckController().isEmpty(),
|
||||
newEditionCheck, dateTimeCheck, onlyCoreExpCheck, monthDropdown, yearDropdown);
|
||||
this.host = g;
|
||||
@@ -102,7 +110,7 @@ public class DeckImport<TItem extends InventoryItem, TModel extends DeckBase> ex
|
||||
txtInput.setFocusable(true);
|
||||
txtInput.setEditable(true);
|
||||
|
||||
FSkin.SkinColor foreColor = FSkin.getColor(FSkin.Colors.CLR_TEXT);
|
||||
final FSkin.SkinColor foreColor = FSkin.getColor(FSkin.Colors.CLR_TEXT);
|
||||
this.scrollInput.setBorder(new FSkin.TitledSkinBorder(BorderFactory.createEtchedBorder(), "Paste or type a decklist", foreColor));
|
||||
this.scrollOutput.setBorder(new FSkin.TitledSkinBorder(BorderFactory.createEtchedBorder(), "Expect the recognized lines to appear", foreColor));
|
||||
this.scrollInput.setViewportBorder(BorderFactory.createLoweredBevelBorder());
|
||||
@@ -144,10 +152,9 @@ public class DeckImport<TItem extends InventoryItem, TModel extends DeckBase> ex
|
||||
}
|
||||
});
|
||||
|
||||
ActionListener updateDateCheck = new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
boolean isSel = dateTimeCheck.isSelected();
|
||||
final ActionListener updateDateCheck = new ActionListener() {
|
||||
@Override public void actionPerformed(final ActionEvent e) {
|
||||
final boolean isSel = dateTimeCheck.isSelected();
|
||||
monthDropdown.setEnabled(isSel);
|
||||
yearDropdown.setEnabled(isSel);
|
||||
parseAndDisplay();
|
||||
@@ -155,8 +162,10 @@ public class DeckImport<TItem extends InventoryItem, TModel extends DeckBase> ex
|
||||
};
|
||||
this.dateTimeCheck.addActionListener(updateDateCheck);
|
||||
|
||||
ActionListener reparse = new ActionListener() {
|
||||
@Override public void actionPerformed(ActionEvent e) { parseAndDisplay(); }
|
||||
final ActionListener reparse = new ActionListener() {
|
||||
@Override public void actionPerformed(final ActionEvent e) {
|
||||
parseAndDisplay();
|
||||
}
|
||||
};
|
||||
this.newEditionCheck.addActionListener(reparse);
|
||||
this.onlyCoreExpCheck.addActionListener(reparse);
|
||||
@@ -192,12 +201,12 @@ public class DeckImport<TItem extends InventoryItem, TModel extends DeckBase> ex
|
||||
}
|
||||
|
||||
private void parseAndDisplay() {
|
||||
List<DeckRecognizer.Token> tokens = controller.parseInput(txtInput.getText());
|
||||
final List<DeckRecognizer.Token> tokens = controller.parseInput(txtInput.getText());
|
||||
displayTokens(tokens);
|
||||
updateSummaries(tokens);
|
||||
}
|
||||
|
||||
private void displayTokens(List<DeckRecognizer.Token> tokens) {
|
||||
private void displayTokens(final List<DeckRecognizer.Token> tokens) {
|
||||
if (tokens.isEmpty()) {
|
||||
htmlOutput.setText(HTML_WELCOME_TEXT);
|
||||
}
|
||||
@@ -212,7 +221,7 @@ public class DeckImport<TItem extends InventoryItem, TModel extends DeckBase> ex
|
||||
}
|
||||
}
|
||||
|
||||
private void updateSummaries(List<DeckRecognizer.Token> tokens) {
|
||||
private void updateSummaries(final List<DeckRecognizer.Token> tokens) {
|
||||
final int[] cardsOk = new int[2];
|
||||
final int[] cardsUnknown = new int[2];
|
||||
int idx = 0;
|
||||
@@ -232,7 +241,7 @@ public class DeckImport<TItem extends InventoryItem, TModel extends DeckBase> ex
|
||||
cmdAccept.setEnabled(cardsOk[0] > 0);
|
||||
}
|
||||
|
||||
private String makeHtmlViewOfToken(final DeckRecognizer.Token token) {
|
||||
private static String makeHtmlViewOfToken(final DeckRecognizer.Token token) {
|
||||
switch (token.getType()) {
|
||||
case KnownCard:
|
||||
return String.format("<div class='knowncard'>%s * %s [%s] %s</div>", token.getNumber(), token.getCard()
|
||||
|
||||
@@ -6,17 +6,29 @@
|
||||
* 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 forge.screens.deckeditor.controllers;
|
||||
|
||||
import java.awt.Toolkit;
|
||||
import java.awt.event.InputEvent;
|
||||
import java.awt.event.KeyEvent;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import javax.swing.JMenu;
|
||||
import javax.swing.JPopupMenu;
|
||||
import javax.swing.KeyStroke;
|
||||
import javax.swing.SwingUtilities;
|
||||
|
||||
import forge.UiCommand;
|
||||
import forge.assets.FSkinProp;
|
||||
import forge.deck.Deck;
|
||||
@@ -24,7 +36,11 @@ import forge.deck.DeckBase;
|
||||
import forge.deck.DeckSection;
|
||||
import forge.gui.GuiChoose;
|
||||
import forge.gui.GuiUtils;
|
||||
import forge.gui.framework.*;
|
||||
import forge.gui.framework.DragCell;
|
||||
import forge.gui.framework.FScreen;
|
||||
import forge.gui.framework.ICDoc;
|
||||
import forge.gui.framework.IVDoc;
|
||||
import forge.gui.framework.SRearrangingUtil;
|
||||
import forge.item.InventoryItem;
|
||||
import forge.item.PaperCard;
|
||||
import forge.itemmanager.ItemManager;
|
||||
@@ -43,15 +59,6 @@ import forge.toolbox.FSkin;
|
||||
import forge.util.ItemPool;
|
||||
import forge.view.FView;
|
||||
|
||||
import javax.swing.*;
|
||||
|
||||
import java.awt.*;
|
||||
import java.awt.event.InputEvent;
|
||||
import java.awt.event.KeyEvent;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
/**
|
||||
* Maintains a generically typed architecture for various editing
|
||||
* environments. A basic editor instance requires a card catalog, the
|
||||
@@ -60,7 +67,7 @@ import java.util.Map.Entry;
|
||||
* These requirements are collected in this class and manipulated
|
||||
* in subclasses for different environments. There are two generic
|
||||
* types for all card display and filter predicates.
|
||||
*
|
||||
*
|
||||
* <br><br><i>(A at beginning of class name denotes an abstract class.)</i>
|
||||
* <br><br><i>(C at beginning of class name denotes a control class.)</i>
|
||||
*
|
||||
@@ -138,41 +145,35 @@ public abstract class ACEditorBase<TItem extends InventoryItem, TModel extends D
|
||||
return new CDeckEditorUIMenus().getMenus();
|
||||
}
|
||||
|
||||
public final void addItem(TItem item) {
|
||||
public final void addItem(final TItem item) {
|
||||
onAddItems(createPoolForItem(item, 1), false);
|
||||
}
|
||||
public final void addItem(TItem item, int qty) {
|
||||
public final void addItem(final TItem item, final int qty) {
|
||||
onAddItems(createPoolForItem(item, qty), false);
|
||||
}
|
||||
public final void addItem(TItem item, int qty, boolean toAlternate) {
|
||||
onAddItems(createPoolForItem(item, qty), toAlternate);
|
||||
}
|
||||
|
||||
public final void removeItem(TItem item) {
|
||||
public final void removeItem(final TItem item) {
|
||||
onRemoveItems(createPoolForItem(item, 1), false);
|
||||
}
|
||||
public final void removeItem(TItem item, int qty) {
|
||||
public final void removeItem(final TItem item, final int qty) {
|
||||
onRemoveItems(createPoolForItem(item, qty), false);
|
||||
}
|
||||
public final void removeItem(TItem item, int qty, boolean toAlternate) {
|
||||
onRemoveItems(createPoolForItem(item, qty), toAlternate);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
private ItemPool<TItem> createPoolForItem(final TItem item, final int qty) {
|
||||
if (item == null || qty <= 0) { return null; }
|
||||
|
||||
ItemPool<TItem> pool = new ItemPool<TItem>((Class<TItem>)item.getClass());
|
||||
final ItemPool<TItem> pool = new ItemPool<TItem>((Class<TItem>)item.getClass());
|
||||
pool.add(item, qty);
|
||||
return pool;
|
||||
}
|
||||
|
||||
public final void addItems(Iterable<Entry<TItem, Integer>> items, boolean toAlternate) {
|
||||
public final void addItems(final Iterable<Entry<TItem, Integer>> items, final boolean toAlternate) {
|
||||
if (items == null || !items.iterator().hasNext()) { return; } //do nothing if no items
|
||||
onAddItems(items, toAlternate);
|
||||
}
|
||||
|
||||
public final void removeItems(Iterable<Entry<TItem, Integer>> items, boolean toAlternate) {
|
||||
public final void removeItems(final Iterable<Entry<TItem, Integer>> items, final boolean toAlternate) {
|
||||
if (items == null || !items.iterator().hasNext()) { return; } //do nothing if no items
|
||||
onRemoveItems(items, toAlternate);
|
||||
}
|
||||
@@ -189,15 +190,15 @@ public abstract class ACEditorBase<TItem extends InventoryItem, TModel extends D
|
||||
/**
|
||||
* @return pool of additions allowed to deck
|
||||
*/
|
||||
protected ItemPool<TItem> getAllowedAdditions(Iterable<Entry<TItem, Integer>> itemsToAdd) {
|
||||
ItemPool<TItem> additions = new ItemPool<TItem>(getCatalogManager().getGenericType());
|
||||
CardLimit limit = getCardLimit();
|
||||
DeckController<TModel> controller = getDeckController();
|
||||
Deck deck = controller != null && controller.getModel() instanceof Deck ? (Deck)controller.getModel() : null;
|
||||
protected ItemPool<TItem> getAllowedAdditions(final Iterable<Entry<TItem, Integer>> itemsToAdd) {
|
||||
final ItemPool<TItem> additions = new ItemPool<TItem>(getCatalogManager().getGenericType());
|
||||
final CardLimit limit = getCardLimit();
|
||||
final DeckController<TModel> controller = getDeckController();
|
||||
final Deck deck = controller != null && controller.getModel() instanceof Deck ? (Deck)controller.getModel() : null;
|
||||
|
||||
for (Entry<TItem, Integer> itemEntry : itemsToAdd) {
|
||||
TItem item = itemEntry.getKey();
|
||||
PaperCard card = item instanceof PaperCard ? (PaperCard)item : null;
|
||||
for (final Entry<TItem, Integer> itemEntry : itemsToAdd) {
|
||||
final TItem item = itemEntry.getKey();
|
||||
final PaperCard card = item instanceof PaperCard ? (PaperCard)item : null;
|
||||
int qty = itemEntry.getValue();
|
||||
|
||||
int max;
|
||||
@@ -228,7 +229,7 @@ public abstract class ACEditorBase<TItem extends InventoryItem, TModel extends D
|
||||
|
||||
protected abstract CardLimit getCardLimit();
|
||||
|
||||
/**
|
||||
/**
|
||||
* Operation to add selected items to current deck.
|
||||
*/
|
||||
protected abstract void onAddItems(Iterable<Entry<TItem, Integer>> items, boolean toAlternate);
|
||||
@@ -255,7 +256,7 @@ public abstract class ACEditorBase<TItem extends InventoryItem, TModel extends D
|
||||
|
||||
/**
|
||||
* Called when switching away from or closing the editor wants to exit. Should confirm save options.
|
||||
*
|
||||
*
|
||||
* @return boolean   true if safe to exit
|
||||
*/
|
||||
public abstract boolean canSwitchAway(boolean isClosing);
|
||||
@@ -272,7 +273,7 @@ public abstract class ACEditorBase<TItem extends InventoryItem, TModel extends D
|
||||
|
||||
/**
|
||||
* Gets the ItemManager holding the cards in the current deck.
|
||||
*
|
||||
*
|
||||
* @return {@link forge.itemmanager.ItemManager}
|
||||
*/
|
||||
public ItemManager<TItem> getDeckManager() {
|
||||
@@ -281,7 +282,7 @@ public abstract class ACEditorBase<TItem extends InventoryItem, TModel extends D
|
||||
|
||||
/**
|
||||
* Sets the ItemManager holding the cards in the current deck.
|
||||
*
|
||||
*
|
||||
* @param itemManager   {@link forge.itemmanager.ItemManager}
|
||||
*/
|
||||
@SuppressWarnings("serial")
|
||||
@@ -289,14 +290,12 @@ public abstract class ACEditorBase<TItem extends InventoryItem, TModel extends D
|
||||
this.deckManager = itemManager;
|
||||
|
||||
btnRemove.setCommand(new UiCommand() {
|
||||
@Override
|
||||
public void run() {
|
||||
@Override public void run() {
|
||||
CDeckEditorUI.SINGLETON_INSTANCE.removeSelectedCards(false, 1);
|
||||
}
|
||||
});
|
||||
btnRemove4.setCommand(new UiCommand() {
|
||||
@Override
|
||||
public void run() {
|
||||
@Override public void run() {
|
||||
CDeckEditorUI.SINGLETON_INSTANCE.removeSelectedCards(false, 4);
|
||||
}
|
||||
});
|
||||
@@ -307,7 +306,7 @@ public abstract class ACEditorBase<TItem extends InventoryItem, TModel extends D
|
||||
|
||||
/**
|
||||
* Gets the ItemManager holding the cards in the current catalog.
|
||||
*
|
||||
*
|
||||
* @return {@link forge.itemmanager.ItemManager}
|
||||
*/
|
||||
public ItemManager<TItem> getCatalogManager() {
|
||||
@@ -316,7 +315,7 @@ public abstract class ACEditorBase<TItem extends InventoryItem, TModel extends D
|
||||
|
||||
/**
|
||||
* Sets the ItemManager holding the cards in the current catalog.
|
||||
*
|
||||
*
|
||||
* @param itemManager   {@link forge.itemmanager.ItemManager}
|
||||
*/
|
||||
@SuppressWarnings("serial")
|
||||
@@ -324,14 +323,12 @@ public abstract class ACEditorBase<TItem extends InventoryItem, TModel extends D
|
||||
this.catalogManager = itemManager;
|
||||
|
||||
btnAdd.setCommand(new UiCommand() {
|
||||
@Override
|
||||
public void run() {
|
||||
@Override public void run() {
|
||||
CDeckEditorUI.SINGLETON_INSTANCE.addSelectedCards(false, 1);
|
||||
}
|
||||
});
|
||||
btnAdd4.setCommand(new UiCommand() {
|
||||
@Override
|
||||
public void run() {
|
||||
@Override public void run() {
|
||||
CDeckEditorUI.SINGLETON_INSTANCE.addSelectedCards(false, 4);
|
||||
}
|
||||
});
|
||||
@@ -342,7 +339,7 @@ public abstract class ACEditorBase<TItem extends InventoryItem, TModel extends D
|
||||
/**
|
||||
* Removes the specified tab and returns its parent for later re-adding
|
||||
*/
|
||||
protected DragCell removeTab (IVDoc<? extends ICDoc> tab) {
|
||||
protected DragCell removeTab (final IVDoc<? extends ICDoc> tab) {
|
||||
final DragCell parent;
|
||||
if (tab.getParentCell() == null) {
|
||||
parent = null;
|
||||
@@ -398,7 +395,7 @@ public abstract class ACEditorBase<TItem extends InventoryItem, TModel extends D
|
||||
public FLabel getBtnRemove4() { return btnRemove4; }
|
||||
public FLabel getBtnCycleSection() { return btnCycleSection; }
|
||||
|
||||
public ContextMenuBuilder createContextMenuBuilder(boolean isAddContextMenu0) {
|
||||
public ContextMenuBuilder createContextMenuBuilder(final boolean isAddContextMenu0) {
|
||||
return new EditorContextMenuBuilder(isAddContextMenu0);
|
||||
}
|
||||
|
||||
@@ -406,7 +403,7 @@ public abstract class ACEditorBase<TItem extends InventoryItem, TModel extends D
|
||||
private final boolean isAddContextMenu;
|
||||
private JPopupMenu menu;
|
||||
|
||||
private EditorContextMenuBuilder(boolean isAddContextMenu0) {
|
||||
private EditorContextMenuBuilder(final boolean isAddContextMenu0) {
|
||||
isAddContextMenu = isAddContextMenu0;
|
||||
}
|
||||
|
||||
@@ -419,7 +416,7 @@ public abstract class ACEditorBase<TItem extends InventoryItem, TModel extends D
|
||||
}
|
||||
|
||||
@Override
|
||||
public void buildContextMenu(JPopupMenu menu) {
|
||||
public void buildContextMenu(final JPopupMenu menu) {
|
||||
this.menu = menu; //cache menu while controller populates menu
|
||||
if (isAddContextMenu) {
|
||||
buildAddContextMenu(this);
|
||||
@@ -459,28 +456,27 @@ public abstract class ACEditorBase<TItem extends InventoryItem, TModel extends D
|
||||
});
|
||||
}
|
||||
|
||||
private void addItem(String verb, String dest, final boolean toAlternate, final int qty, int shortcutModifiers) {
|
||||
private void addItem(final String verb, final String dest, final boolean toAlternate, final int qty, final int shortcutModifiers) {
|
||||
String label = verb + " " + SItemManagerUtil.getItemDisplayString(getItemManager().getSelectedItems(), qty, false);
|
||||
if (dest != null && !dest.isEmpty()) {
|
||||
label += " " + dest;
|
||||
}
|
||||
GuiUtils.addMenuItem(menu, label,
|
||||
KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, shortcutModifiers), new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
Integer quantity = qty;
|
||||
if (quantity < 0) {
|
||||
quantity = GuiChoose.getInteger("Choose a value for X", 1, -quantity, 20);
|
||||
if (quantity == null) { return; }
|
||||
}
|
||||
if (isAddContextMenu) {
|
||||
CDeckEditorUI.SINGLETON_INSTANCE.addSelectedCards(toAlternate, quantity);
|
||||
}
|
||||
else {
|
||||
CDeckEditorUI.SINGLETON_INSTANCE.removeSelectedCards(toAlternate, quantity);
|
||||
}
|
||||
}
|
||||
}, true, shortcutModifiers == 0);
|
||||
@Override public void run() {
|
||||
Integer quantity = qty;
|
||||
if (quantity < 0) {
|
||||
quantity = GuiChoose.getInteger("Choose a value for X", 1, -quantity, 20);
|
||||
if (quantity == null) { return; }
|
||||
}
|
||||
if (isAddContextMenu) {
|
||||
CDeckEditorUI.SINGLETON_INSTANCE.addSelectedCards(toAlternate, quantity);
|
||||
}
|
||||
else {
|
||||
CDeckEditorUI.SINGLETON_INSTANCE.removeSelectedCards(toAlternate, quantity);
|
||||
}
|
||||
}
|
||||
}, true, shortcutModifiers == 0);
|
||||
}
|
||||
|
||||
private int getMaxMoveQuantity() {
|
||||
@@ -492,7 +488,7 @@ public abstract class ACEditorBase<TItem extends InventoryItem, TModel extends D
|
||||
return 0;
|
||||
}
|
||||
int max = Integer.MAX_VALUE;
|
||||
for (Entry<TItem, Integer> itemEntry : selectedItemPool) {
|
||||
for (final Entry<TItem, Integer> itemEntry : selectedItemPool) {
|
||||
if (itemEntry.getValue() < max) {
|
||||
max = itemEntry.getValue();
|
||||
}
|
||||
@@ -500,8 +496,8 @@ public abstract class ACEditorBase<TItem extends InventoryItem, TModel extends D
|
||||
return max;
|
||||
}
|
||||
|
||||
private void addItems(String verb, String dest, boolean toAlternate, int shortcutModifiers1, int shortcutModifiers2, int shortcutModifiers3) {
|
||||
int max = getMaxMoveQuantity();
|
||||
private void addItems(final String verb, final String dest, final boolean toAlternate, final int shortcutModifiers1, final int shortcutModifiers2, final int shortcutModifiers3) {
|
||||
final int max = getMaxMoveQuantity();
|
||||
if (max == 0) { return; }
|
||||
|
||||
addItem(verb, dest, toAlternate, 1, shortcutModifiers1);
|
||||
@@ -518,11 +514,11 @@ public abstract class ACEditorBase<TItem extends InventoryItem, TModel extends D
|
||||
addItem(verb, dest, toAlternate, -max, shortcutModifiers3); //pass -max as quantity to indicate to prompt for specific quantity
|
||||
}
|
||||
|
||||
public void addMoveItems(String verb, String dest) {
|
||||
public void addMoveItems(final String verb, final String dest) {
|
||||
addItems(verb, dest, false, 0, InputEvent.SHIFT_DOWN_MASK, InputEvent.ALT_MASK);
|
||||
}
|
||||
|
||||
public void addMoveAlternateItems(String verb, String dest) {
|
||||
public void addMoveAlternateItems(final String verb, final String dest) {
|
||||
if (this.menu.getComponentCount() > 0) {
|
||||
this.menu.addSeparator();
|
||||
}
|
||||
|
||||
@@ -1,30 +1,22 @@
|
||||
package forge.screens.deckeditor.controllers;
|
||||
|
||||
import forge.UiCommand;
|
||||
import forge.deck.DeckProxy;
|
||||
import forge.gui.framework.ICDoc;
|
||||
import forge.itemmanager.ItemManagerConfig;
|
||||
import forge.screens.deckeditor.views.VAllDecks;
|
||||
|
||||
/**
|
||||
/**
|
||||
* Controls the "all decks" panel in the deck editor UI.
|
||||
*
|
||||
*
|
||||
* <br><br><i>(C at beginning of class name denotes a control class.)</i>
|
||||
*
|
||||
*/
|
||||
public enum CAllDecks implements ICDoc {
|
||||
/** */
|
||||
SINGLETON_INSTANCE;
|
||||
|
||||
//========== Overridden methods
|
||||
private final VAllDecks view = VAllDecks.SINGLETON_INSTANCE;
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.framework.ICDoc#getCommandOnSelect()
|
||||
*/
|
||||
@Override
|
||||
public UiCommand getCommandOnSelect() {
|
||||
return null;
|
||||
}
|
||||
//========== Overridden methods
|
||||
|
||||
@Override
|
||||
public void register() {
|
||||
@@ -39,7 +31,7 @@ public enum CAllDecks implements ICDoc {
|
||||
}
|
||||
|
||||
public void refresh() {
|
||||
VAllDecks.SINGLETON_INSTANCE.getLstDecks().setPool(DeckProxy.getAllConstructedDecks());
|
||||
view.getLstDecks().setPool(DeckProxy.getAllConstructedDecks());
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@@ -47,6 +39,6 @@ public enum CAllDecks implements ICDoc {
|
||||
*/
|
||||
@Override
|
||||
public void update() {
|
||||
VAllDecks.SINGLETON_INSTANCE.getLstDecks().setup(ItemManagerConfig.CONSTRUCTED_DECKS);
|
||||
view.getLstDecks().setup(ItemManagerConfig.CONSTRUCTED_DECKS);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,11 +1,10 @@
|
||||
package forge.screens.deckeditor.controllers;
|
||||
|
||||
import forge.UiCommand;
|
||||
import forge.gui.framework.ICDoc;
|
||||
|
||||
/**
|
||||
/**
|
||||
* Controls the "card catalog" panel in the deck editor UI.
|
||||
*
|
||||
*
|
||||
* <br><br><i>(C at beginning of class name denotes a control class.)</i>
|
||||
*
|
||||
*/
|
||||
@@ -18,14 +17,6 @@ public enum CCardCatalog implements ICDoc {
|
||||
|
||||
//========== Overridden methods
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.framework.ICDoc#getCommandOnSelect()
|
||||
*/
|
||||
@Override
|
||||
public UiCommand getCommandOnSelect() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void register() {
|
||||
}
|
||||
@@ -36,7 +27,7 @@ public enum CCardCatalog implements ICDoc {
|
||||
@Override
|
||||
public void initialize() {
|
||||
}
|
||||
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.framework.ICDoc#update()
|
||||
*/
|
||||
|
||||
@@ -1,7 +1,16 @@
|
||||
package forge.screens.deckeditor.controllers;
|
||||
|
||||
import forge.UiCommand;
|
||||
import java.awt.Dialog.ModalityType;
|
||||
import java.awt.event.KeyAdapter;
|
||||
import java.awt.event.KeyEvent;
|
||||
import java.io.File;
|
||||
|
||||
import javax.swing.JFileChooser;
|
||||
import javax.swing.SwingUtilities;
|
||||
import javax.swing.filechooser.FileFilter;
|
||||
|
||||
import forge.Singletons;
|
||||
import forge.UiCommand;
|
||||
import forge.deck.Deck;
|
||||
import forge.deck.DeckBase;
|
||||
import forge.deck.io.DeckSerializer;
|
||||
@@ -14,45 +23,33 @@ import forge.screens.deckeditor.DeckImport;
|
||||
import forge.screens.deckeditor.SEditorIO;
|
||||
import forge.screens.deckeditor.views.VCurrentDeck;
|
||||
|
||||
import javax.swing.*;
|
||||
import javax.swing.filechooser.FileFilter;
|
||||
|
||||
import java.awt.Dialog.ModalityType;
|
||||
import java.awt.event.KeyAdapter;
|
||||
import java.awt.event.KeyEvent;
|
||||
import java.io.File;
|
||||
|
||||
/**
|
||||
/**
|
||||
* Controls the "current deck" panel in the deck editor UI.
|
||||
*
|
||||
*
|
||||
* <br><br><i>(C at beginning of class name denotes a control class.)</i>
|
||||
*
|
||||
*/
|
||||
public enum CCurrentDeck implements ICDoc {
|
||||
/** */
|
||||
SINGLETON_INSTANCE;
|
||||
|
||||
private static File previousDirectory;
|
||||
|
||||
private JFileChooser fileChooser = new JFileChooser(ForgeConstants.DECK_BASE_DIR);
|
||||
private final JFileChooser fileChooser = new JFileChooser(ForgeConstants.DECK_BASE_DIR);
|
||||
|
||||
//========== Overridden methods
|
||||
|
||||
private CCurrentDeck() {
|
||||
FileFilter[] defaultFilters = fileChooser.getChoosableFileFilters();
|
||||
for(FileFilter defFilter : defaultFilters)
|
||||
{
|
||||
final FileFilter[] defaultFilters = fileChooser.getChoosableFileFilters();
|
||||
for (final FileFilter defFilter : defaultFilters) {
|
||||
fileChooser.removeChoosableFileFilter(defFilter);
|
||||
}
|
||||
|
||||
FileFilter DCK_FILTER = new FileFilter() {
|
||||
@Override
|
||||
public boolean accept(final File f) {
|
||||
final FileFilter DCK_FILTER = new FileFilter() {
|
||||
@Override public final boolean accept(final File f) {
|
||||
return f.getName().endsWith(DeckStorage.FILE_EXTENSION) || f.isDirectory();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDescription() {
|
||||
@Override public final String getDescription() {
|
||||
return "Simple Deck File .dck";
|
||||
}
|
||||
};
|
||||
@@ -60,14 +57,6 @@ public enum CCurrentDeck implements ICDoc {
|
||||
fileChooser.addChoosableFileFilter(DCK_FILTER);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.framework.ICDoc#getCommandOnSelect()
|
||||
*/
|
||||
@Override
|
||||
public UiCommand getCommandOnSelect() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void register() {
|
||||
}
|
||||
@@ -117,7 +106,7 @@ public enum CCurrentDeck implements ICDoc {
|
||||
});
|
||||
VCurrentDeck.SINGLETON_INSTANCE.getTxfTitle().addKeyListener(new KeyAdapter() {
|
||||
@Override
|
||||
public void keyPressed(KeyEvent e) {
|
||||
public void keyPressed(final KeyEvent e) {
|
||||
if (Character.isLetterOrDigit(e.getKeyChar())) {
|
||||
CDeckEditorUI.SINGLETON_INSTANCE.getCurrentEditorController().getDeckController().notifyModelChanged();
|
||||
}
|
||||
@@ -204,7 +193,7 @@ public enum CCurrentDeck implements ICDoc {
|
||||
/** */
|
||||
@SuppressWarnings("unchecked")
|
||||
private void exportDeck() {
|
||||
DeckController<Deck> controller = (DeckController<Deck>)
|
||||
final DeckController<Deck> controller = (DeckController<Deck>)
|
||||
CDeckEditorUI.SINGLETON_INSTANCE.getCurrentEditorController().getDeckController();
|
||||
|
||||
final File filename = this.getExportFilename();
|
||||
@@ -215,7 +204,7 @@ public enum CCurrentDeck implements ICDoc {
|
||||
//create copy of deck to save under new name
|
||||
String name = filename.getName();
|
||||
name = name.substring(0, name.lastIndexOf(".")); //remove extension
|
||||
Deck deck = (Deck)controller.getModel().copyTo(name);
|
||||
final Deck deck = (Deck)controller.getModel().copyTo(name);
|
||||
|
||||
try {
|
||||
DeckSerializer.writeDeck(deck, filename);
|
||||
|
||||
@@ -4,15 +4,19 @@ import com.google.common.base.Predicate;
|
||||
import com.google.common.base.Predicates;
|
||||
import com.google.common.collect.Iterables;
|
||||
|
||||
import forge.UiCommand;
|
||||
import forge.Singletons;
|
||||
import forge.UiCommand;
|
||||
import forge.card.CardDb;
|
||||
import forge.card.CardRulesPredicates;
|
||||
import forge.card.MagicColor;
|
||||
import forge.deck.Deck;
|
||||
import forge.deck.DeckBase;
|
||||
import forge.deck.DeckFormat;
|
||||
import forge.deck.generation.*;
|
||||
import forge.deck.generation.DeckGenerator2Color;
|
||||
import forge.deck.generation.DeckGenerator3Color;
|
||||
import forge.deck.generation.DeckGenerator5Color;
|
||||
import forge.deck.generation.DeckGeneratorBase;
|
||||
import forge.deck.generation.DeckGeneratorMonoColor;
|
||||
import forge.gui.framework.ICDoc;
|
||||
import forge.item.InventoryItem;
|
||||
import forge.item.PaperCard;
|
||||
@@ -24,9 +28,9 @@ import forge.screens.deckeditor.views.VDeckgen;
|
||||
import forge.util.Aggregates;
|
||||
|
||||
|
||||
/**
|
||||
/**
|
||||
* Controls the "analysis" panel in the deck editor UI.
|
||||
*
|
||||
*
|
||||
* <br><br><i>(C at beginning of class name denotes a control class.)</i>
|
||||
*
|
||||
*/
|
||||
@@ -36,14 +40,6 @@ public enum CDeckgen implements ICDoc {
|
||||
|
||||
//========== Overridden methods
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.framework.ICDoc#getCommandOnSelect()
|
||||
*/
|
||||
@Override
|
||||
public UiCommand getCommandOnSelect() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void register() {
|
||||
}
|
||||
@@ -94,11 +90,11 @@ public enum CDeckgen implements ICDoc {
|
||||
|
||||
final Deck randomDeck = new Deck();
|
||||
|
||||
Predicate<PaperCard> notBasicLand = Predicates.not(Predicates.compose(CardRulesPredicates.Presets.IS_BASIC_LAND, PaperCard.FN_GET_RULES));
|
||||
Iterable<PaperCard> source = Iterables.filter(FModel.getMagicDb().getCommonCards().getUniqueCards(), notBasicLand);
|
||||
final Predicate<PaperCard> notBasicLand = Predicates.not(Predicates.compose(CardRulesPredicates.Presets.IS_BASIC_LAND, PaperCard.FN_GET_RULES));
|
||||
final Iterable<PaperCard> source = Iterables.filter(FModel.getMagicDb().getCommonCards().getUniqueCards(), notBasicLand);
|
||||
randomDeck.getMain().addAllFlat(Aggregates.random(source, 15 * 5));
|
||||
|
||||
for(String landName : MagicColor.Constant.BASIC_LANDS) {
|
||||
for(final String landName : MagicColor.Constant.BASIC_LANDS) {
|
||||
randomDeck.getMain().add(landName, 1);
|
||||
}
|
||||
randomDeck.getMain().add("Terramorphic Expanse", 1);
|
||||
@@ -114,15 +110,15 @@ public enum CDeckgen implements ICDoc {
|
||||
if (!SEditorIO.confirmSaveChanges(Singletons.getControl().getCurrentScreen(), true)) { return; }
|
||||
|
||||
final Deck genConstructed = new Deck();
|
||||
CardDb cardDb = FModel.getMagicDb().getCommonCards();
|
||||
final CardDb cardDb = FModel.getMagicDb().getCommonCards();
|
||||
DeckGeneratorBase gen = null;
|
||||
switch (colorCount0) {
|
||||
case 1: gen = new DeckGeneratorMonoColor(cardDb, DeckFormat.Constructed, null); break;
|
||||
case 2: gen = new DeckGenerator2Color(cardDb, DeckFormat.Constructed, null, null); break;
|
||||
case 3: gen = new DeckGenerator3Color(cardDb, DeckFormat.Constructed, null, null, null); break;
|
||||
case 5: gen = new DeckGenerator5Color(cardDb, DeckFormat.Constructed); break;
|
||||
case 1: gen = new DeckGeneratorMonoColor(cardDb, DeckFormat.Constructed, null); break;
|
||||
case 2: gen = new DeckGenerator2Color(cardDb, DeckFormat.Constructed, null, null); break;
|
||||
case 3: gen = new DeckGenerator3Color(cardDb, DeckFormat.Constructed, null, null, null); break;
|
||||
case 5: gen = new DeckGenerator5Color(cardDb, DeckFormat.Constructed); break;
|
||||
}
|
||||
|
||||
|
||||
if( null != gen ) {
|
||||
gen.setSingleton(FModel.getPreferences().getPrefBoolean(FPref.DECKGEN_SINGLETONS));
|
||||
gen.setUseArtifacts(!FModel.getPreferences().getPrefBoolean(FPref.DECKGEN_ARTIFACTS));
|
||||
|
||||
@@ -6,17 +6,23 @@
|
||||
* 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 forge.screens.deckeditor.controllers;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import com.google.common.base.Function;
|
||||
import com.google.common.base.Supplier;
|
||||
|
||||
@@ -42,21 +48,13 @@ import forge.screens.home.quest.CSubmenuQuestDecks;
|
||||
import forge.screens.match.controllers.CDetailPicture;
|
||||
import forge.util.ItemPool;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
//import forge.quest.data.QuestBoosterPack;
|
||||
|
||||
/**
|
||||
* Child controller for quest deck editor UI.
|
||||
* <br><br>
|
||||
* Card catalog and decks are drawn from a QuestController object.
|
||||
*
|
||||
*
|
||||
* <br><br><i>(C at beginning of class name denotes a control class.)</i>
|
||||
*
|
||||
*
|
||||
* @author Forge
|
||||
* @version $Id: CEditorQuest.java 24868 2014-02-17 05:08:05Z drdev $
|
||||
*/
|
||||
@@ -89,7 +87,7 @@ public final class CEditorQuest extends ACEditorBase<PaperCard, Deck> {
|
||||
* Child controller for quest deck editor UI.
|
||||
* <br><br>
|
||||
* Card catalog and decks are drawn from a QuestController object.
|
||||
*
|
||||
*
|
||||
* @param questData0   {@link forge.quest.QuestController}
|
||||
*/
|
||||
public CEditorQuest(final QuestController questData0, final CDetailPicture cDetailPicture) {
|
||||
@@ -121,16 +119,6 @@ public final class CEditorQuest extends ACEditorBase<PaperCard, Deck> {
|
||||
this.controller = new DeckController<Deck>(questData0.getMyDecks(), this, newCreator);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds any card to the catalog and data pool.
|
||||
*
|
||||
* @param card {@link forge.item.PaperCard}
|
||||
*/
|
||||
public void addCheatCard(final PaperCard card, int qty) {
|
||||
this.getCatalogManager().addItem(card, qty);
|
||||
this.questData.getCards().getCardpool().add(card, qty);
|
||||
}
|
||||
|
||||
// fills number of decks using each card
|
||||
private Map<PaperCard, Integer> countDecksForEachCard() {
|
||||
final Map<PaperCard, Integer> result = new HashMap<PaperCard, Integer>();
|
||||
@@ -158,7 +146,7 @@ public final class CEditorQuest extends ACEditorBase<PaperCard, Deck> {
|
||||
* @see forge.gui.deckeditor.ACEditorBase#onAddItems()
|
||||
*/
|
||||
@Override
|
||||
protected void onAddItems(Iterable<Entry<PaperCard, Integer>> items, boolean toAlternate) {
|
||||
protected void onAddItems(final Iterable<Entry<PaperCard, Integer>> items, final boolean toAlternate) {
|
||||
CEditorConstructed.onAddItems(this, items, toAlternate);
|
||||
}
|
||||
|
||||
@@ -166,7 +154,7 @@ public final class CEditorQuest extends ACEditorBase<PaperCard, Deck> {
|
||||
* @see forge.gui.deckeditor.ACEditorBase#onRemoveItems()
|
||||
*/
|
||||
@Override
|
||||
protected void onRemoveItems(Iterable<Entry<PaperCard, Integer>> items, boolean toAlternate) {
|
||||
protected void onRemoveItems(final Iterable<Entry<PaperCard, Integer>> items, final boolean toAlternate) {
|
||||
CEditorConstructed.onRemoveItems(this, items, toAlternate);
|
||||
}
|
||||
|
||||
@@ -174,7 +162,7 @@ public final class CEditorQuest extends ACEditorBase<PaperCard, Deck> {
|
||||
* @see forge.gui.deckeditor.ACEditorBase#buildAddContextMenu()
|
||||
*/
|
||||
@Override
|
||||
protected void buildAddContextMenu(EditorContextMenuBuilder cmb) {
|
||||
protected void buildAddContextMenu(final EditorContextMenuBuilder cmb) {
|
||||
CEditorConstructed.buildAddContextMenu(cmb, sectionMode);
|
||||
}
|
||||
|
||||
@@ -182,13 +170,13 @@ public final class CEditorQuest extends ACEditorBase<PaperCard, Deck> {
|
||||
* @see forge.gui.deckeditor.ACEditorBase#buildRemoveContextMenu()
|
||||
*/
|
||||
@Override
|
||||
protected void buildRemoveContextMenu(EditorContextMenuBuilder cmb) {
|
||||
protected void buildRemoveContextMenu(final EditorContextMenuBuilder cmb) {
|
||||
CEditorConstructed.buildRemoveContextMenu(cmb, sectionMode);
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
*
|
||||
* @see forge.gui.deckeditor.ACEditorBase#updateView()
|
||||
*/
|
||||
@Override
|
||||
@@ -212,7 +200,7 @@ public final class CEditorQuest extends ACEditorBase<PaperCard, Deck> {
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
*
|
||||
* @see forge.gui.deckeditor.ACEditorBase#getController()
|
||||
*/
|
||||
@Override
|
||||
@@ -263,18 +251,17 @@ public final class CEditorQuest extends ACEditorBase<PaperCard, Deck> {
|
||||
|
||||
this.getBtnCycleSection().setVisible(true);
|
||||
this.getBtnCycleSection().setCommand(new UiCommand() {
|
||||
@Override
|
||||
public void run() {
|
||||
@Override public void run() {
|
||||
cycleEditorMode();
|
||||
} });
|
||||
}
|
||||
});
|
||||
|
||||
deckGenParent = removeTab(VDeckgen.SINGLETON_INSTANCE);
|
||||
allDecksParent = removeTab(VAllDecks.SINGLETON_INSTANCE);
|
||||
|
||||
if (this.controller.getModel() == null) {
|
||||
this.getDeckController().setModel(new Deck());
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
this.controller.refreshModel();
|
||||
}
|
||||
}
|
||||
@@ -283,7 +270,7 @@ public final class CEditorQuest extends ACEditorBase<PaperCard, Deck> {
|
||||
* @see forge.gui.deckeditor.controllers.ACEditorBase#canSwitchAway()
|
||||
*/
|
||||
@Override
|
||||
public boolean canSwitchAway(boolean isClosing) {
|
||||
public boolean canSwitchAway(final boolean isClosing) {
|
||||
if (SEditorIO.confirmSaveChanges(FScreen.DECK_EDITOR_QUEST, isClosing)) {
|
||||
FModel.getQuest().save();
|
||||
return true;
|
||||
@@ -306,11 +293,4 @@ public final class CEditorQuest extends ACEditorBase<PaperCard, Deck> {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO: Write javadoc for this method.
|
||||
* @param d0
|
||||
*/
|
||||
public void load(Deck deck) {
|
||||
controller.setModel(deck);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,12 +6,12 @@
|
||||
* 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/>.
|
||||
*/
|
||||
@@ -48,15 +48,13 @@ import forge.screens.deckeditor.views.VDeckgen;
|
||||
import forge.screens.home.quest.CSubmenuQuestDecks;
|
||||
import forge.screens.match.controllers.CDetailPicture;
|
||||
|
||||
//import forge.quest.data.QuestBoosterPack;
|
||||
|
||||
/**
|
||||
* Child controller for quest deck editor UI.
|
||||
* <br><br>
|
||||
* Card catalog and decks are drawn from a QuestController object.
|
||||
*
|
||||
*
|
||||
* <br><br><i>(C at beginning of class name denotes a control class.)</i>
|
||||
*
|
||||
*
|
||||
* @author Forge
|
||||
* @version $Id: CEditorQuest.java 24868 2014-02-17 05:08:05Z drdev $
|
||||
*/
|
||||
@@ -89,7 +87,7 @@ public final class CEditorQuestLimited extends ACEditorBase<PaperCard, DeckGroup
|
||||
* Child controller for quest deck editor UI.
|
||||
* <br><br>
|
||||
* Card catalog and decks are drawn from a QuestController object.
|
||||
*
|
||||
*
|
||||
* @param questData0   {@link forge.quest.QuestController}
|
||||
*/
|
||||
public CEditorQuestLimited(final QuestController questData0, final CDetailPicture cDetailPicture) {
|
||||
@@ -107,7 +105,7 @@ public final class CEditorQuestLimited extends ACEditorBase<PaperCard, DeckGroup
|
||||
|
||||
catalogManager.setAlwaysNonUnique(true);
|
||||
deckManager.setAlwaysNonUnique(true);
|
||||
|
||||
|
||||
this.setCatalogManager(catalogManager);
|
||||
this.setDeckManager(deckManager);
|
||||
|
||||
@@ -117,21 +115,11 @@ public final class CEditorQuestLimited extends ACEditorBase<PaperCard, DeckGroup
|
||||
return new DeckGroup("");
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
this.controller = new DeckController<DeckGroup>(questData0.getDraftDecks(), this, newCreator);
|
||||
controller.getView().getDeckManager().setup(ItemManagerConfig.DRAFT_POOL);
|
||||
controller.setModel(questData0.getDraftDecks().get(QuestEventDraft.DECK_NAME));
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds any card to the catalog and data pool.
|
||||
*
|
||||
* @param card {@link forge.item.PaperCard}
|
||||
*/
|
||||
public void addCheatCard(final PaperCard card, int qty) {
|
||||
this.getCatalogManager().addItem(card, qty);
|
||||
this.questData.getCards().getCardpool().add(card, qty);
|
||||
}
|
||||
|
||||
// fills number of decks using each card
|
||||
@@ -161,8 +149,10 @@ public final class CEditorQuestLimited extends ACEditorBase<PaperCard, DeckGroup
|
||||
* @see forge.gui.deckeditor.ACEditorBase#onAddItems()
|
||||
*/
|
||||
@Override
|
||||
protected void onAddItems(Iterable<Entry<PaperCard, Integer>> items, boolean toAlternate) {
|
||||
if (toAlternate) { return; }
|
||||
protected void onAddItems(final Iterable<Entry<PaperCard, Integer>> items, final boolean toAlternate) {
|
||||
if (toAlternate) {
|
||||
return;
|
||||
}
|
||||
|
||||
// update view
|
||||
this.getDeckManager().addItems(items);
|
||||
@@ -174,8 +164,10 @@ public final class CEditorQuestLimited extends ACEditorBase<PaperCard, DeckGroup
|
||||
* @see forge.gui.deckeditor.ACEditorBase#onRemoveItems()
|
||||
*/
|
||||
@Override
|
||||
protected void onRemoveItems(Iterable<Entry<PaperCard, Integer>> items, boolean toAlternate) {
|
||||
if (toAlternate) { return; }
|
||||
protected void onRemoveItems(final Iterable<Entry<PaperCard, Integer>> items, final boolean toAlternate) {
|
||||
if (toAlternate) {
|
||||
return;
|
||||
}
|
||||
|
||||
// update view
|
||||
this.getCatalogManager().addItems(items);
|
||||
@@ -187,7 +179,7 @@ public final class CEditorQuestLimited extends ACEditorBase<PaperCard, DeckGroup
|
||||
* @see forge.gui.deckeditor.ACEditorBase#buildAddContextMenu()
|
||||
*/
|
||||
@Override
|
||||
protected void buildAddContextMenu(EditorContextMenuBuilder cmb) {
|
||||
protected void buildAddContextMenu(final EditorContextMenuBuilder cmb) {
|
||||
cmb.addMoveItems("Move", "to deck");
|
||||
}
|
||||
|
||||
@@ -195,17 +187,17 @@ public final class CEditorQuestLimited extends ACEditorBase<PaperCard, DeckGroup
|
||||
* @see forge.gui.deckeditor.ACEditorBase#buildRemoveContextMenu()
|
||||
*/
|
||||
@Override
|
||||
protected void buildRemoveContextMenu(EditorContextMenuBuilder cmb) {
|
||||
protected void buildRemoveContextMenu(final EditorContextMenuBuilder cmb) {
|
||||
cmb.addMoveItems("Move", "to sideboard");
|
||||
}
|
||||
|
||||
|
||||
private Deck getSelectedDeck(final DeckGroup model) {
|
||||
return model.getHumanDeck();
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
*
|
||||
* @see forge.gui.deckeditor.ACEditorBase#updateView()
|
||||
*/
|
||||
@Override
|
||||
@@ -219,7 +211,7 @@ public final class CEditorQuestLimited extends ACEditorBase<PaperCard, DeckGroup
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
*
|
||||
* @see forge.gui.deckeditor.ACEditorBase#getController()
|
||||
*/
|
||||
@Override
|
||||
@@ -229,10 +221,10 @@ public final class CEditorQuestLimited extends ACEditorBase<PaperCard, DeckGroup
|
||||
|
||||
@Override
|
||||
public void update() {
|
||||
|
||||
|
||||
this.getCatalogManager().setup(getScreen() == FScreen.DECK_EDITOR_DRAFT ? ItemManagerConfig.DRAFT_POOL : ItemManagerConfig.SEALED_POOL);
|
||||
this.getDeckManager().setup(ItemManagerConfig.DECK_EDITOR);
|
||||
|
||||
|
||||
this.decksUsingMyCards = this.countDecksForEachCard();
|
||||
|
||||
final Map<ColumnDef, ItemTableColumn> colOverridesCatalog = new HashMap<ColumnDef, ItemTableColumn>();
|
||||
@@ -253,7 +245,7 @@ public final class CEditorQuestLimited extends ACEditorBase<PaperCard, DeckGroup
|
||||
|
||||
deckGenParent = removeTab(VDeckgen.SINGLETON_INSTANCE);
|
||||
allDecksParent = removeTab(VAllDecks.SINGLETON_INSTANCE);
|
||||
|
||||
|
||||
if (this.controller.getModel() == null) {
|
||||
throw new RuntimeException("Expected deck group but found none!");
|
||||
}
|
||||
@@ -266,7 +258,7 @@ public final class CEditorQuestLimited extends ACEditorBase<PaperCard, DeckGroup
|
||||
* @see forge.gui.deckeditor.controllers.ACEditorBase#canSwitchAway()
|
||||
*/
|
||||
@Override
|
||||
public boolean canSwitchAway(boolean isClosing) {
|
||||
public boolean canSwitchAway(final boolean isClosing) {
|
||||
if (SEditorIO.confirmSaveChanges(FScreen.DECK_EDITOR_QUEST_TOURNAMENT, isClosing)) {
|
||||
FModel.getQuest().save();
|
||||
return true;
|
||||
@@ -290,11 +282,4 @@ public final class CEditorQuestLimited extends ACEditorBase<PaperCard, DeckGroup
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO: Write javadoc for this method.
|
||||
* @param d0
|
||||
*/
|
||||
/*public void load(Deck deck) {
|
||||
controller.setModel(deck);
|
||||
}*/
|
||||
}
|
||||
|
||||
@@ -1,5 +1,12 @@
|
||||
package forge.screens.deckeditor.controllers;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import forge.UiCommand;
|
||||
import forge.deck.DeckBase;
|
||||
import forge.gui.framework.ICDoc;
|
||||
@@ -10,11 +17,9 @@ import forge.screens.deckeditor.views.VProbabilities;
|
||||
import forge.util.ItemPool;
|
||||
import forge.util.MyRandom;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
/**
|
||||
* Controls the "analysis" panel in the deck editor UI.
|
||||
*
|
||||
*
|
||||
* <br><br><i>(C at beginning of class name denotes a control class.)</i>
|
||||
*
|
||||
*/
|
||||
@@ -24,14 +29,6 @@ public enum CProbabilities implements ICDoc {
|
||||
|
||||
//========== Overridden methods
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.framework.ICDoc#getCommandOnSelect()
|
||||
*/
|
||||
@Override
|
||||
public UiCommand getCommandOnSelect() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void register() {
|
||||
}
|
||||
@@ -65,7 +62,7 @@ public enum CProbabilities implements ICDoc {
|
||||
CDeckEditorUI.SINGLETON_INSTANCE.getCurrentEditorController();
|
||||
|
||||
if (ed == null) { return new ArrayList<String>(); }
|
||||
|
||||
|
||||
final ItemPool<PaperCard> deck = ItemPool.createFrom(ed.getDeckManager().getPool(), PaperCard.class);
|
||||
|
||||
final List<String> cardProbabilities = new ArrayList<String>();
|
||||
@@ -84,12 +81,11 @@ public enum CProbabilities implements ICDoc {
|
||||
// Formulas is (remaining instances of this card / total cards remaining)
|
||||
final Iterator<PaperCard> itr = shuffled.iterator();
|
||||
PaperCard tmp;
|
||||
// int prob;
|
||||
while (itr.hasNext()) {
|
||||
tmp = itr.next();
|
||||
|
||||
// prob = SEditorUtil.calculatePercentage(
|
||||
// cardTotals.get(tmp), shuffled.size());
|
||||
// int prob = SEditorUtil.calculatePercentage(
|
||||
// cardTotals.get(tmp), shuffled.size());
|
||||
|
||||
cardTotals.put(tmp, cardTotals.get(tmp) - 1);
|
||||
cardProbabilities.add(tmp.getName()); // + " (" + prob + "%)");
|
||||
|
||||
@@ -1,9 +1,12 @@
|
||||
package forge.screens.deckeditor.controllers;
|
||||
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import javax.swing.JLabel;
|
||||
|
||||
import com.google.common.base.Predicate;
|
||||
import com.google.common.base.Predicates;
|
||||
|
||||
import forge.UiCommand;
|
||||
import forge.card.CardRules;
|
||||
import forge.card.CardRulesPredicates;
|
||||
import forge.card.MagicColor;
|
||||
@@ -16,14 +19,9 @@ import forge.screens.deckeditor.CDeckEditorUI;
|
||||
import forge.screens.deckeditor.views.VStatistics;
|
||||
import forge.util.ItemPool;
|
||||
|
||||
import javax.swing.*;
|
||||
|
||||
import java.util.Map.Entry;
|
||||
|
||||
|
||||
/**
|
||||
/**
|
||||
* Controls the "analysis" panel in the deck editor UI.
|
||||
*
|
||||
*
|
||||
* <br><br><i>(C at beginning of class name denotes a control class.)</i>
|
||||
*
|
||||
*/
|
||||
@@ -33,14 +31,6 @@ public enum CStatistics implements ICDoc {
|
||||
|
||||
//========== Overridden methods
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.framework.ICDoc#getCommandOnSelect()
|
||||
*/
|
||||
@Override
|
||||
public UiCommand getCommandOnSelect() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void register() {
|
||||
}
|
||||
@@ -60,8 +50,8 @@ public enum CStatistics implements ICDoc {
|
||||
analyze();
|
||||
}
|
||||
|
||||
private void setLabelValue(JLabel label, ItemPool<PaperCard> deck, Predicate<CardRules> predicate, int total) {
|
||||
int tmp = deck.countAll(Predicates.compose(predicate, PaperCard.FN_GET_RULES));
|
||||
private void setLabelValue(final JLabel label, final ItemPool<PaperCard> deck, final Predicate<CardRules> predicate, final int total) {
|
||||
final int tmp = deck.countAll(Predicates.compose(predicate, PaperCard.FN_GET_RULES));
|
||||
label.setText(tmp + " (" + calculatePercentage(tmp, total) + "%)");
|
||||
}
|
||||
|
||||
@@ -76,7 +66,7 @@ public enum CStatistics implements ICDoc {
|
||||
final ItemPool<PaperCard> deck = ItemPool.createFrom(ed.getDeckManager().getPool(), PaperCard.class);
|
||||
|
||||
int total = deck.countAll();
|
||||
int[] shardCount = calculateShards(deck);
|
||||
final int[] shardCount = calculateShards(deck);
|
||||
|
||||
// Hack-ish: avoid /0 cases, but still populate labels :)
|
||||
if (total == 0) { total = 1; }
|
||||
@@ -115,7 +105,7 @@ public enum CStatistics implements ICDoc {
|
||||
for (final Entry<PaperCard, Integer> e : deck) {
|
||||
tmc += e.getKey().getRules().getManaCost().getCMC() * e.getValue();
|
||||
}
|
||||
double amc = Math.round((double) tmc / (double) total * 100) / 100.0d;
|
||||
final double amc = Math.round((double) tmc / (double) total * 100) / 100.0d;
|
||||
|
||||
VStatistics.SINGLETON_INSTANCE.getLblTotal().setText("TOTAL CARDS: " + deck.countAll());
|
||||
VStatistics.SINGLETON_INSTANCE.getLblTMC().setText("TOTAL MANA COST: " + tmc);
|
||||
@@ -124,7 +114,7 @@ public enum CStatistics implements ICDoc {
|
||||
|
||||
/**
|
||||
* Divides X by Y, multiplies by 100, rounds, returns.
|
||||
*
|
||||
*
|
||||
* @param x0   Numerator (int)
|
||||
* @param y0   Denominator (int)
|
||||
* @return rounded result (int)
|
||||
@@ -133,10 +123,10 @@ public enum CStatistics implements ICDoc {
|
||||
return (int) Math.round((double) (x0 * 100) / (double) y0);
|
||||
}
|
||||
|
||||
public static int[] calculateShards(ItemPool<PaperCard> deck) {
|
||||
int[] counts = new int[5]; // in WUBRG order
|
||||
for (PaperCard c : deck.toFlatList()) {
|
||||
int[] cShards = c.getRules().getManaCost().getColorShardCounts();
|
||||
public static int[] calculateShards(final ItemPool<PaperCard> deck) {
|
||||
final int[] counts = new int[5]; // in WUBRG order
|
||||
for (final PaperCard c : deck.toFlatList()) {
|
||||
final int[] cShards = c.getRules().getManaCost().getColorShardCounts();
|
||||
for (int i = 0; i < 5; i++) {
|
||||
counts[i] += cShards[i];
|
||||
}
|
||||
|
||||
@@ -6,12 +6,12 @@
|
||||
* 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/>.
|
||||
*/
|
||||
@@ -27,11 +27,6 @@ import forge.screens.deckeditor.views.VCurrentDeck;
|
||||
import forge.screens.home.sanctioned.VSubmenuConstructed;
|
||||
import forge.util.storage.IStorage;
|
||||
|
||||
/**
|
||||
* TODO: Write javadoc for this type.
|
||||
*
|
||||
* @param <T> the generic type
|
||||
*/
|
||||
public class DeckController<T extends DeckBase> {
|
||||
private T model;
|
||||
private boolean saved;
|
||||
@@ -99,8 +94,7 @@ public class DeckController<T extends DeckBase> {
|
||||
else {
|
||||
this.notifyModelChanged();
|
||||
}
|
||||
}
|
||||
else { //TODO: Make this smarter
|
||||
} else { //TODO: Make this smarter
|
||||
this.currentFolder = this.rootFolder;
|
||||
this.modelPath = "";
|
||||
this.setSaved(true);
|
||||
@@ -142,7 +136,7 @@ public class DeckController<T extends DeckBase> {
|
||||
}
|
||||
}
|
||||
|
||||
private void setSaved(boolean val) {
|
||||
private void setSaved(final boolean val) {
|
||||
saved = val;
|
||||
updateCaptions();
|
||||
}
|
||||
@@ -151,7 +145,7 @@ public class DeckController<T extends DeckBase> {
|
||||
* Reload current model
|
||||
*/
|
||||
public void reload() {
|
||||
String name = this.getModelName();
|
||||
final String name = this.getModelName();
|
||||
if (name.isEmpty()) {
|
||||
newModel();
|
||||
}
|
||||
@@ -178,7 +172,7 @@ public class DeckController<T extends DeckBase> {
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
private void load(final String name) {
|
||||
T newModel = this.currentFolder.get(name);
|
||||
final T newModel = this.currentFolder.get(name);
|
||||
if (newModel != null) {
|
||||
this.setModel((T) newModel.copyTo(name), true);
|
||||
}
|
||||
@@ -236,15 +230,6 @@ public class DeckController<T extends DeckBase> {
|
||||
return this.currentFolder.contains(deckName);
|
||||
}
|
||||
|
||||
/**
|
||||
* Import deck.
|
||||
*
|
||||
* @param newDeck the new deck
|
||||
*/
|
||||
public void importDeck(final T newDeck) {
|
||||
this.setModel(newDeck);
|
||||
}
|
||||
|
||||
/**
|
||||
* Refresh current model or create new one if none
|
||||
*/
|
||||
@@ -272,7 +257,7 @@ public class DeckController<T extends DeckBase> {
|
||||
|
||||
public void updateCaptions() {
|
||||
String tabCaption = "Current Deck";
|
||||
String title = this.getModelName();
|
||||
final String title = this.getModelName();
|
||||
String itemManagerCaption = title.isEmpty() ? "[Untitled]" : title;
|
||||
|
||||
if (!saved) {
|
||||
|
||||
@@ -1,5 +1,16 @@
|
||||
package forge.screens.deckeditor.controllers;
|
||||
|
||||
import java.io.BufferedWriter;
|
||||
import java.io.File;
|
||||
import java.io.FileWriter;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.TreeMap;
|
||||
|
||||
import forge.deck.Deck;
|
||||
import forge.item.PaperCard;
|
||||
import forge.properties.ForgeConstants;
|
||||
@@ -9,94 +20,87 @@ import freemarker.template.DefaultObjectWrapper;
|
||||
import freemarker.template.Template;
|
||||
import freemarker.template.TemplateException;
|
||||
|
||||
import java.io.BufferedWriter;
|
||||
import java.io.File;
|
||||
import java.io.FileWriter;
|
||||
import java.io.IOException;
|
||||
import java.util.*;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
public class DeckHtmlSerializer {
|
||||
public static void writeDeckHtml(final Deck d, final File f) {
|
||||
try {
|
||||
final BufferedWriter writer = new BufferedWriter(new FileWriter(f));
|
||||
writeDeckHtml(d, writer);
|
||||
writer.close();
|
||||
} catch (final IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
public static void writeDeckHtml(final Deck d, final File f) {
|
||||
try {
|
||||
final BufferedWriter writer = new BufferedWriter(new FileWriter(f));
|
||||
writeDeckHtml(d, writer);
|
||||
writer.close();
|
||||
} catch (final IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* writeDeck.
|
||||
* </p>
|
||||
*
|
||||
* @param d
|
||||
* a {@link forge.deck.Deck} object.
|
||||
* @param out
|
||||
* a {@link java.io.BufferedWriter} object.
|
||||
* @throws java.io.IOException
|
||||
* if any.
|
||||
*/
|
||||
private static void writeDeckHtml(final Deck d, final BufferedWriter out) throws IOException {
|
||||
Template temp = null;
|
||||
final int cardBorder = 0;
|
||||
final int height = 319;
|
||||
final int width = 222;
|
||||
|
||||
/* Create and adjust the configuration */
|
||||
final Configuration cfg = new Configuration();
|
||||
try {
|
||||
cfg.setClassForTemplateLoading(DeckHtmlSerializer.class, "/");
|
||||
cfg.setObjectWrapper(new DefaultObjectWrapper());
|
||||
|
||||
/*
|
||||
* ------------------------------------------------------------------
|
||||
* -
|
||||
*/
|
||||
/*
|
||||
* You usually do these for many times in the application
|
||||
* life-cycle:
|
||||
*/
|
||||
|
||||
/* Get or create a template */
|
||||
temp = cfg.getTemplate("proxy-template.ftl");
|
||||
|
||||
/* Create a data-model */
|
||||
final Map<String, Object> root = new HashMap<String, Object>();
|
||||
root.put("title", d.getName());
|
||||
final List<String> list = new ArrayList<String>();
|
||||
for (final Entry<PaperCard, Integer> card : d.getMain()) {
|
||||
// System.out.println(card.getSets().get(card.getSets().size() - 1).URL);
|
||||
for (int i = card.getValue().intValue(); i > 0; --i ) {
|
||||
PaperCard r = card.getKey();
|
||||
String url = ForgeConstants.URL_PIC_DOWNLOAD + ImageUtil.getDownloadUrl(r, false);
|
||||
list.add(url);
|
||||
}
|
||||
/**
|
||||
* <p>
|
||||
* writeDeck.
|
||||
* </p>
|
||||
*
|
||||
* @param d
|
||||
* a {@link forge.deck.Deck} object.
|
||||
* @param out
|
||||
* a {@link java.io.BufferedWriter} object.
|
||||
* @throws java.io.IOException
|
||||
* if any.
|
||||
*/
|
||||
private static void writeDeckHtml(final Deck d, final BufferedWriter out) {
|
||||
Template temp = null;
|
||||
final int cardBorder = 0;
|
||||
final int height = 319;
|
||||
final int width = 222;
|
||||
|
||||
/* Create and adjust the configuration */
|
||||
final Configuration cfg = new Configuration();
|
||||
try {
|
||||
cfg.setClassForTemplateLoading(DeckHtmlSerializer.class, "/");
|
||||
cfg.setObjectWrapper(new DefaultObjectWrapper());
|
||||
|
||||
/*
|
||||
* ------------------------------------------------------------------
|
||||
* -
|
||||
*/
|
||||
/*
|
||||
* You usually do these for many times in the application
|
||||
* life-cycle:
|
||||
*/
|
||||
|
||||
/* Get or create a template */
|
||||
temp = cfg.getTemplate("proxy-template.ftl");
|
||||
|
||||
/* Create a data-model */
|
||||
final Map<String, Object> root = new HashMap<String, Object>();
|
||||
root.put("title", d.getName());
|
||||
final List<String> list = new ArrayList<String>();
|
||||
for (final Entry<PaperCard, Integer> card : d.getMain()) {
|
||||
// System.out.println(card.getSets().get(card.getSets().size() - 1).URL);
|
||||
for (int i = card.getValue().intValue(); i > 0; --i ) {
|
||||
final PaperCard r = card.getKey();
|
||||
final String url = ForgeConstants.URL_PIC_DOWNLOAD + ImageUtil.getDownloadUrl(r, false);
|
||||
list.add(url);
|
||||
}
|
||||
|
||||
final TreeMap<String, Integer> map = new TreeMap<String, Integer>();
|
||||
for (final Entry<PaperCard, Integer> entry : d.getMain()) {
|
||||
map.put(entry.getKey().getName(), entry.getValue());
|
||||
// System.out.println(entry.getValue() + " " +
|
||||
// entry.getKey().getName());
|
||||
}
|
||||
|
||||
root.put("urls", list);
|
||||
root.put("cardBorder", cardBorder);
|
||||
root.put("height", height);
|
||||
root.put("width", width);
|
||||
root.put("cardlistWidth", width - 11);
|
||||
root.put("cardList", map);
|
||||
|
||||
/* Merge data-model with template */
|
||||
temp.process(root, out);
|
||||
out.flush();
|
||||
} catch (final IOException e) {
|
||||
System.out.println(e.toString());
|
||||
} catch (final TemplateException e) {
|
||||
System.out.println(e.toString());
|
||||
}
|
||||
|
||||
final TreeMap<String, Integer> map = new TreeMap<String, Integer>();
|
||||
for (final Entry<PaperCard, Integer> entry : d.getMain()) {
|
||||
map.put(entry.getKey().getName(), entry.getValue());
|
||||
// System.out.println(entry.getValue() + " " +
|
||||
// entry.getKey().getName());
|
||||
}
|
||||
|
||||
root.put("urls", list);
|
||||
root.put("cardBorder", cardBorder);
|
||||
root.put("height", height);
|
||||
root.put("width", width);
|
||||
root.put("cardlistWidth", width - 11);
|
||||
root.put("cardList", map);
|
||||
|
||||
/* Merge data-model with template */
|
||||
temp.process(root, out);
|
||||
out.flush();
|
||||
} catch (final IOException e) {
|
||||
System.out.println(e.toString());
|
||||
} catch (final TemplateException e) {
|
||||
System.out.println(e.toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,8 @@
|
||||
package forge.screens.deckeditor.views;
|
||||
|
||||
import javax.swing.JPanel;
|
||||
|
||||
import net.miginfocom.swing.MigLayout;
|
||||
import forge.gui.framework.DragCell;
|
||||
import forge.gui.framework.DragTab;
|
||||
import forge.gui.framework.EDocID;
|
||||
@@ -8,22 +11,16 @@ import forge.item.InventoryItem;
|
||||
import forge.itemmanager.ItemManager;
|
||||
import forge.itemmanager.ItemManagerContainer;
|
||||
import forge.screens.deckeditor.controllers.CCardCatalog;
|
||||
import net.miginfocom.swing.MigLayout;
|
||||
|
||||
import javax.swing.*;
|
||||
|
||||
/**
|
||||
/**
|
||||
* Assembles Swing components of card catalog in deck editor.
|
||||
*
|
||||
* <br><br><i>(V at beginning of class name denotes a view class.)</i>
|
||||
*
|
||||
*
|
||||
*/
|
||||
public enum VCardCatalog implements IVDoc<CCardCatalog> {
|
||||
/** */
|
||||
SINGLETON_INSTANCE;
|
||||
|
||||
public static final int SEARCH_MODE_INVERSE_INDEX = 1;
|
||||
|
||||
// Fields used with interface IVDoc
|
||||
private DragCell parentCell;
|
||||
private final DragTab tab = new DragTab("Card Catalog");
|
||||
@@ -54,7 +51,7 @@ public enum VCardCatalog implements IVDoc<CCardCatalog> {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setParentCell(DragCell cell0) {
|
||||
public void setParentCell(final DragCell cell0) {
|
||||
this.parentCell = cell0;
|
||||
}
|
||||
|
||||
@@ -65,7 +62,7 @@ public enum VCardCatalog implements IVDoc<CCardCatalog> {
|
||||
|
||||
@Override
|
||||
public void populate() {
|
||||
JPanel parentBody = parentCell.getBody();
|
||||
final JPanel parentBody = parentCell.getBody();
|
||||
parentBody.setLayout(new MigLayout("insets 5, gap 0, wrap, hidemode 3"));
|
||||
parentBody.add(itemManagerContainer, "push, grow");
|
||||
}
|
||||
|
||||
@@ -1,5 +1,9 @@
|
||||
package forge.screens.deckeditor.views;
|
||||
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.SwingConstants;
|
||||
|
||||
import net.miginfocom.swing.MigLayout;
|
||||
import forge.assets.FSkinProp;
|
||||
import forge.gui.framework.DragCell;
|
||||
import forge.gui.framework.DragTab;
|
||||
@@ -12,18 +16,13 @@ import forge.screens.deckeditor.controllers.CCurrentDeck;
|
||||
import forge.toolbox.FLabel;
|
||||
import forge.toolbox.FSkin;
|
||||
import forge.toolbox.FTextField;
|
||||
import net.miginfocom.swing.MigLayout;
|
||||
|
||||
import javax.swing.*;
|
||||
|
||||
|
||||
/**
|
||||
/**
|
||||
* Assembles Swing components of current deck being edited in deck editor.
|
||||
*
|
||||
* <br><br><i>(V at beginning of class name denotes a view class.)</i>
|
||||
*/
|
||||
public enum VCurrentDeck implements IVDoc<CCurrentDeck> {
|
||||
/** */
|
||||
SINGLETON_INSTANCE;
|
||||
|
||||
// Fields used with interface IVDoc
|
||||
@@ -157,11 +156,11 @@ public enum VCurrentDeck implements IVDoc<CCurrentDeck> {
|
||||
parentBody.add(pnlHeader, "pushx, growx");
|
||||
parentBody.add(itemManagerContainer, "push, grow");
|
||||
}
|
||||
|
||||
|
||||
public ItemManager<? extends InventoryItem> getItemManager() {
|
||||
return this.itemManager;
|
||||
}
|
||||
|
||||
|
||||
public void setItemManager(final ItemManager<? extends InventoryItem> itemManager0) {
|
||||
this.itemManager = itemManager0;
|
||||
itemManagerContainer.setItemManager(itemManager0);
|
||||
@@ -211,7 +210,6 @@ public enum VCurrentDeck implements IVDoc<CCurrentDeck> {
|
||||
* @return
|
||||
*/
|
||||
public FLabel getBtnImport() {
|
||||
// TODO Auto-generated method stub
|
||||
return (FLabel) btnImport;
|
||||
return btnImport;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,15 @@
|
||||
package forge.screens.deckeditor.views;
|
||||
|
||||
import java.awt.Font;
|
||||
import java.awt.event.MouseAdapter;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.util.List;
|
||||
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.SwingConstants;
|
||||
|
||||
import net.miginfocom.swing.MigLayout;
|
||||
import forge.deck.DeckBase;
|
||||
import forge.gui.framework.DragCell;
|
||||
import forge.gui.framework.DragTab;
|
||||
@@ -13,16 +23,8 @@ import forge.screens.deckeditor.controllers.CProbabilities;
|
||||
import forge.toolbox.FLabel;
|
||||
import forge.toolbox.FScrollPane;
|
||||
import forge.toolbox.FSkin;
|
||||
import net.miginfocom.swing.MigLayout;
|
||||
|
||||
import javax.swing.*;
|
||||
|
||||
import java.awt.*;
|
||||
import java.awt.event.MouseAdapter;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
/**
|
||||
* Assembles Swing components of deck editor analysis tab.
|
||||
*
|
||||
* <br><br><i>(V at beginning of class name denotes a view class.)</i>
|
||||
@@ -43,8 +45,8 @@ public enum VProbabilities implements IVDoc<CProbabilities> {
|
||||
.fontSize(12).text("SAMPLE HAND").opaque(true).build();
|
||||
private final FLabel lblRemainingDraws = new FLabel.Builder().fontStyle(Font.BOLD)
|
||||
.fontSize(12).text("REMAINING DRAWS").opaque(true).build();
|
||||
// private final JLabel lblExplanation = new FLabel.Builder()
|
||||
// .fontSize(11).text("XX % = frequency that card will appear at that position").build();
|
||||
// private final JLabel lblExplanation = new FLabel.Builder()
|
||||
// .fontSize(11).text("XX % = frequency that card will appear at that position").build();
|
||||
|
||||
// Layout containers
|
||||
private final JPanel pnlContent = new JPanel(new MigLayout("insets 0, gap 0, wrap"));
|
||||
@@ -61,14 +63,14 @@ public enum VProbabilities implements IVDoc<CProbabilities> {
|
||||
|
||||
lblSampleHand.setBorder(new FSkin.MatteSkinBorder(1, 0, 1, 0, FSkin.getColor(FSkin.Colors.CLR_BORDERS)));
|
||||
lblSampleHand.setBackground(FSkin.getColor(FSkin.Colors.CLR_THEME2));
|
||||
|
||||
|
||||
lblRemainingDraws.setBorder(new FSkin.MatteSkinBorder(1, 0, 1, 0, FSkin.getColor(FSkin.Colors.CLR_BORDERS)));
|
||||
lblRemainingDraws.setBackground(FSkin.getColor(FSkin.Colors.CLR_THEME2));
|
||||
|
||||
// Core layout
|
||||
pnlContent.add(lblReshuffle, "w 96%!, h 29px!, gap 2% 0 5px 5px");
|
||||
pnlContent.add(lblSampleHand, "w 96%!, h 25px!, gap 2% 0 0 0");
|
||||
// pnlContent.add(lblExplanation, "w 96%!, h 25px!, gap 2% 0 0 0");
|
||||
// pnlContent.add(lblExplanation, "w 96%!, h 25px!, gap 2% 0 0 0");
|
||||
pnlContent.add(pnlHand, "w 96%!, gap 2% 0 0 5px");
|
||||
pnlContent.add(lblRemainingDraws, "w 96%!, h 25px!, gap 2% 0 0 0");
|
||||
pnlContent.add(pnlLibrary, "w 96%!, gap 2% 0 5px 0");
|
||||
@@ -152,7 +154,7 @@ public enum VProbabilities implements IVDoc<CProbabilities> {
|
||||
pnlLibrary.validate();
|
||||
}
|
||||
|
||||
private <T extends InventoryItem, TModel extends DeckBase> JLabel buildLabel(final boolean zebra) {
|
||||
private static <T extends InventoryItem, TModel extends DeckBase> JLabel buildLabel(final boolean zebra) {
|
||||
final FLabel lbl = new FLabel.Builder().text("--")
|
||||
.fontAlign(SwingConstants.CENTER).fontSize(13)
|
||||
.build();
|
||||
@@ -168,7 +170,7 @@ public enum VProbabilities implements IVDoc<CProbabilities> {
|
||||
final String name1 = lbl.getText();
|
||||
String name2;
|
||||
|
||||
for (PaperCard c : cards) {
|
||||
for (final PaperCard c : cards) {
|
||||
name2 = c.getName();
|
||||
if (name2.length() > name1.length()) { continue; }
|
||||
|
||||
|
||||
@@ -1,5 +1,10 @@
|
||||
package forge.screens.deckeditor.views;
|
||||
|
||||
import java.awt.Font;
|
||||
|
||||
import javax.swing.JPanel;
|
||||
|
||||
import net.miginfocom.swing.MigLayout;
|
||||
import forge.gui.framework.DragCell;
|
||||
import forge.gui.framework.DragTab;
|
||||
import forge.gui.framework.EDocID;
|
||||
@@ -10,13 +15,8 @@ import forge.toolbox.FLabel;
|
||||
import forge.toolbox.FScrollPane;
|
||||
import forge.toolbox.FSkin;
|
||||
import forge.toolbox.FSkin.SkinImage;
|
||||
import net.miginfocom.swing.MigLayout;
|
||||
|
||||
import javax.swing.*;
|
||||
|
||||
import java.awt.*;
|
||||
|
||||
/**
|
||||
/**
|
||||
* Assembles Swing components of deck editor analysis tab.
|
||||
*
|
||||
* <br><br><i>(V at beginning of class name denotes a view class.)</i>
|
||||
@@ -279,7 +279,7 @@ public enum VStatistics implements IVDoc<CStatistics> {
|
||||
|
||||
//========== Other methods
|
||||
|
||||
private FLabel buildLabel(SkinImage icon, boolean zebra) {
|
||||
private static FLabel buildLabel(final SkinImage icon, final boolean zebra) {
|
||||
final FLabel lbl = new FLabel.Builder().text("0 (0%)")
|
||||
.icon(icon).iconScaleAuto(false)
|
||||
.fontSize(11).build();
|
||||
@@ -291,8 +291,8 @@ public enum VStatistics implements IVDoc<CStatistics> {
|
||||
|
||||
return lbl;
|
||||
}
|
||||
|
||||
private FLabel buildLabel(StatTypes statType, boolean zebra) {
|
||||
|
||||
private static FLabel buildLabel(final StatTypes statType, final boolean zebra) {
|
||||
return buildLabel(FSkin.getImage(statType.skinProp, 18, 18), zebra);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,7 +5,6 @@ import java.util.List;
|
||||
import javax.swing.JMenu;
|
||||
|
||||
import forge.Singletons;
|
||||
import forge.UiCommand;
|
||||
import forge.gui.framework.EDocID;
|
||||
import forge.gui.framework.ICDoc;
|
||||
import forge.menus.IMenuProvider;
|
||||
@@ -32,7 +31,7 @@ public enum CHomeUI implements ICDoc, IMenuProvider {
|
||||
|
||||
/** Programatically selects a menu item.
|
||||
* @param id0 {@link forge.gui.framework.EDocID} */
|
||||
public void itemClick(EDocID id0) {
|
||||
public void itemClick(final EDocID id0) {
|
||||
final ForgePreferences prefs = FModel.getPreferences();
|
||||
|
||||
if (lblSelected != null) {
|
||||
@@ -89,14 +88,6 @@ public enum CHomeUI implements ICDoc, IMenuProvider {
|
||||
public void update() {
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.view.home.ICDoc#getCommandOnSelect()
|
||||
*/
|
||||
@Override
|
||||
public UiCommand getCommandOnSelect() {
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Pulls previous menu selection from preferences
|
||||
* and clicks it programatically.
|
||||
|
||||
@@ -1,27 +0,0 @@
|
||||
package forge.screens.home;
|
||||
|
||||
/**
|
||||
* These are the identifiers for topics found in home screen submenus.
|
||||
*
|
||||
* <br><br><i>(E at beginning of class name denotes an enum.)</i>
|
||||
*
|
||||
*/
|
||||
public enum EMenuItem { /** */
|
||||
CONSTRUCTED, /** */
|
||||
LIMITED_DRAFT, /** */
|
||||
LIMITED_SEALED, /** */
|
||||
LIMITED_WINSTON,
|
||||
|
||||
QUEST_CHALLENGES, /** */
|
||||
QUEST_DUELS, /** */
|
||||
QUEST_DATA, /** */
|
||||
QUEST_DECKS, /** */
|
||||
QUEST_PREFS, /** */
|
||||
|
||||
SETTINGS_PREFS, /** */
|
||||
SETTINGS_AVATARS, /** */
|
||||
|
||||
UTILITIES_EDITOR, /** */
|
||||
UTILITIES_DOWNLOADS, /** */
|
||||
UTILITIES_EXIT
|
||||
}
|
||||
@@ -74,8 +74,8 @@ public class PlayerPanel extends FPanel {
|
||||
private FRadioButton radioOpen;
|
||||
private FCheckBox chkReady;
|
||||
|
||||
private FComboBoxWrapper<Object> teamComboBox = new FComboBoxWrapper<Object>();
|
||||
private FComboBoxWrapper<Object> aeTeamComboBox = new FComboBoxWrapper<Object>();
|
||||
private final FComboBoxWrapper<Object> teamComboBox = new FComboBoxWrapper<Object>();
|
||||
private final FComboBoxWrapper<Object> aeTeamComboBox = new FComboBoxWrapper<Object>();
|
||||
|
||||
private final FLabel closeBtn;
|
||||
private final FLabel deckBtn = new FLabel.ButtonBuilder().text("Select a deck").build();
|
||||
@@ -236,18 +236,18 @@ public class PlayerPanel extends FPanel {
|
||||
* Listens to name text fields and gives the appropriate player focus. Also
|
||||
* saves the name preference when leaving player one's text field.
|
||||
*/
|
||||
private FocusAdapter nameFocusListener = new FocusAdapter() {
|
||||
private final FocusAdapter nameFocusListener = new FocusAdapter() {
|
||||
@Override
|
||||
public void focusGained(FocusEvent e) {
|
||||
public void focusGained(final FocusEvent e) {
|
||||
lobby.changePlayerFocus(index);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void focusLost(FocusEvent e) {
|
||||
public void focusLost(final FocusEvent e) {
|
||||
final Object source = e.getSource();
|
||||
if (source instanceof FTextField) { // the text box
|
||||
FTextField nField = (FTextField)source;
|
||||
String newName = nField.getText().trim();
|
||||
final FTextField nField = (FTextField)source;
|
||||
final String newName = nField.getText().trim();
|
||||
if (index == 0 && !StringUtils.isBlank(newName)
|
||||
&& StringUtils.isAlphanumericSpace(newName) && prefs.getPref(FPref.PLAYER_NAME) != newName) {
|
||||
prefs.setPref(FPref.PLAYER_NAME, newName);
|
||||
@@ -259,14 +259,14 @@ public class PlayerPanel extends FPanel {
|
||||
};
|
||||
|
||||
/** Listens to avatar buttons and gives the appropriate player focus. */
|
||||
private FocusAdapter avatarFocusListener = new FocusAdapter() {
|
||||
private final FocusAdapter avatarFocusListener = new FocusAdapter() {
|
||||
@Override
|
||||
public void focusGained(FocusEvent e) {
|
||||
public void focusGained(final FocusEvent e) {
|
||||
lobby.changePlayerFocus(index);
|
||||
}
|
||||
};
|
||||
|
||||
private FMouseAdapter avatarMouseListener = new FMouseAdapter() {
|
||||
private final FMouseAdapter avatarMouseListener = new FMouseAdapter() {
|
||||
@Override public final void onLeftClick(final MouseEvent e) {
|
||||
if (!avatarLabel.isEnabled()) {
|
||||
return;
|
||||
@@ -297,6 +297,7 @@ public class PlayerPanel extends FPanel {
|
||||
|
||||
lobby.firePlayerChangeListener(index);
|
||||
}
|
||||
|
||||
@Override public final void onRightClick(final MouseEvent e) {
|
||||
if (!avatarLabel.isEnabled()) {
|
||||
return;
|
||||
@@ -314,13 +315,13 @@ public class PlayerPanel extends FPanel {
|
||||
};
|
||||
|
||||
private void updateVariantControlsVisibility() {
|
||||
boolean isCommanderApplied = mayEdit && (lobby.hasVariant(GameType.Commander) || lobby.hasVariant(GameType.TinyLeaders));
|
||||
boolean isPlanechaseApplied = mayEdit && lobby.hasVariant(GameType.Planechase);
|
||||
boolean isVanguardApplied = mayEdit && lobby.hasVariant(GameType.Vanguard);
|
||||
boolean isArchenemyApplied = mayEdit && lobby.hasVariant(GameType.Archenemy);
|
||||
boolean archenemyVisiblity = mayEdit && lobby.hasVariant(GameType.ArchenemyRumble) || (isArchenemyApplied && isArchenemy());
|
||||
final boolean isCommanderApplied = mayEdit && (lobby.hasVariant(GameType.Commander) || lobby.hasVariant(GameType.TinyLeaders));
|
||||
final boolean isPlanechaseApplied = mayEdit && lobby.hasVariant(GameType.Planechase);
|
||||
final boolean isVanguardApplied = mayEdit && lobby.hasVariant(GameType.Vanguard);
|
||||
final boolean isArchenemyApplied = mayEdit && lobby.hasVariant(GameType.Archenemy);
|
||||
final boolean archenemyVisiblity = mayEdit && lobby.hasVariant(GameType.ArchenemyRumble) || (isArchenemyApplied && isArchenemy());
|
||||
// Commander deck building replaces normal one, so hide it
|
||||
boolean isDeckBuildingAllowed = mayEdit && !isCommanderApplied && !lobby.hasVariant(GameType.MomirBasic);
|
||||
final boolean isDeckBuildingAllowed = mayEdit && !isCommanderApplied && !lobby.hasVariant(GameType.MomirBasic);
|
||||
|
||||
deckLabel.setVisible(isDeckBuildingAllowed);
|
||||
deckBtn.setVisible(isDeckBuildingAllowed);
|
||||
@@ -344,7 +345,7 @@ public class PlayerPanel extends FPanel {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void paintComponent(Graphics g) {
|
||||
public void paintComponent(final Graphics g) {
|
||||
super.paintComponent(g);
|
||||
if (!hasFocusInLobby()) {
|
||||
FSkin.setGraphicsColor(g, unfocusedPlayerOverlay);
|
||||
@@ -356,10 +357,6 @@ public class PlayerPanel extends FPanel {
|
||||
return lobby.hasFocus(index);
|
||||
}
|
||||
|
||||
int getIndex() {
|
||||
return index;
|
||||
}
|
||||
|
||||
LobbySlotType getType() {
|
||||
return type;
|
||||
}
|
||||
@@ -417,11 +414,11 @@ public class PlayerPanel extends FPanel {
|
||||
}
|
||||
}
|
||||
|
||||
public void setVanguardButtonText(String text) {
|
||||
public void setVanguardButtonText(final String text) {
|
||||
vgdSelectorBtn.setText(text);
|
||||
}
|
||||
|
||||
public void setDeckSelectorButtonText(String text) {
|
||||
public void setDeckSelectorButtonText(final String text) {
|
||||
deckBtn.setText(text);
|
||||
}
|
||||
|
||||
@@ -439,7 +436,7 @@ public class PlayerPanel extends FPanel {
|
||||
teamComboBox.setEnabled(true);
|
||||
}
|
||||
|
||||
private ActionListener teamListener = new ActionListener() {
|
||||
private final ActionListener teamListener = new ActionListener() {
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override public final void actionPerformed(final ActionEvent e) {
|
||||
final FComboBox<Object> cb = (FComboBox<Object>) e.getSource();
|
||||
@@ -460,7 +457,7 @@ public class PlayerPanel extends FPanel {
|
||||
// Archenemy buttons
|
||||
scmDeckSelectorBtn.setCommand(new Runnable() {
|
||||
@Override public final void run() {
|
||||
lobby.setCurrentGameMode(lobby.getVntArchenemy().isSelected() ? GameType.Archenemy : GameType.ArchenemyRumble);
|
||||
lobby.setCurrentGameMode(lobby.hasVariant(GameType.Archenemy) ? GameType.Archenemy : GameType.ArchenemyRumble);
|
||||
scmDeckSelectorBtn.requestFocusInWindow();
|
||||
lobby.changePlayerFocus(index);
|
||||
}
|
||||
@@ -469,8 +466,8 @@ public class PlayerPanel extends FPanel {
|
||||
scmDeckEditor.setCommand(new UiCommand() {
|
||||
@Override
|
||||
public void run() {
|
||||
lobby.setCurrentGameMode(lobby.getVntArchenemy().isSelected() ? GameType.Archenemy : GameType.ArchenemyRumble);
|
||||
Predicate<PaperCard> predSchemes = new Predicate<PaperCard>() {
|
||||
lobby.setCurrentGameMode(lobby.hasVariant(GameType.Archenemy) ? GameType.Archenemy : GameType.ArchenemyRumble);
|
||||
final Predicate<PaperCard> predSchemes = new Predicate<PaperCard>() {
|
||||
@Override public final boolean apply(final PaperCard arg0) {
|
||||
return arg0.getRules().getType().isScheme();
|
||||
}
|
||||
@@ -486,7 +483,7 @@ public class PlayerPanel extends FPanel {
|
||||
cmdDeckSelectorBtn.setCommand(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
lobby.setCurrentGameMode(lobby.getVntTinyLeaders().isSelected() ? GameType.TinyLeaders : GameType.Commander);
|
||||
lobby.setCurrentGameMode(lobby.hasVariant(GameType.TinyLeaders) ? GameType.TinyLeaders : GameType.Commander);
|
||||
cmdDeckSelectorBtn.requestFocusInWindow();
|
||||
lobby.changePlayerFocus(index);
|
||||
}
|
||||
@@ -495,7 +492,7 @@ public class PlayerPanel extends FPanel {
|
||||
cmdDeckEditor.setCommand(new UiCommand() {
|
||||
@Override
|
||||
public void run() {
|
||||
lobby.setCurrentGameMode(lobby.getVntTinyLeaders().isSelected() ? GameType.TinyLeaders : GameType.Commander);
|
||||
lobby.setCurrentGameMode(lobby.hasVariant(GameType.TinyLeaders) ? GameType.TinyLeaders : GameType.Commander);
|
||||
Singletons.getControl().setCurrentScreen(FScreen.DECK_EDITOR_COMMANDER);
|
||||
CDeckEditorUI.SINGLETON_INSTANCE.setEditorController(new CEditorCommander(CDeckEditorUI.SINGLETON_INSTANCE.getCDetailPicture()));
|
||||
}
|
||||
@@ -515,9 +512,9 @@ public class PlayerPanel extends FPanel {
|
||||
@Override
|
||||
public void run() {
|
||||
lobby.setCurrentGameMode(GameType.Planechase);
|
||||
Predicate<PaperCard> predPlanes = new Predicate<PaperCard>() {
|
||||
final Predicate<PaperCard> predPlanes = new Predicate<PaperCard>() {
|
||||
@Override
|
||||
public boolean apply(PaperCard arg0) {
|
||||
public boolean apply(final PaperCard arg0) {
|
||||
return arg0.getRules().getType().isPlane() || arg0.getRules().getType().isPhenomenon();
|
||||
}
|
||||
};
|
||||
@@ -600,7 +597,7 @@ public class PlayerPanel extends FPanel {
|
||||
newNameBtn.setCommand(new UiCommand() {
|
||||
@Override
|
||||
public void run() {
|
||||
String newName = lobby.getNewName();
|
||||
final String newName = lobby.getNewName();
|
||||
if (null == newName) {
|
||||
return;
|
||||
}
|
||||
@@ -656,7 +653,7 @@ public class PlayerPanel extends FPanel {
|
||||
}
|
||||
|
||||
private void createAvatar() {
|
||||
String[] currentPrefs = FModel.getPreferences().getPref(FPref.UI_AVATARS).split(",");
|
||||
final String[] currentPrefs = FModel.getPreferences().getPref(FPref.UI_AVATARS).split(",");
|
||||
if (index < currentPrefs.length) {
|
||||
avatarIndex = Integer.parseInt(currentPrefs[index]);
|
||||
avatarLabel.setIcon(FSkin.getAvatars().get(avatarIndex));
|
||||
@@ -690,7 +687,7 @@ public class PlayerPanel extends FPanel {
|
||||
private final FSkin.LineSkinBorder focusedBorder = new FSkin.LineSkinBorder(FSkin.getColor(FSkin.Colors.CLR_BORDERS).alphaColor(255), 3);
|
||||
private final FSkin.LineSkinBorder defaultBorder = new FSkin.LineSkinBorder(FSkin.getColor(FSkin.Colors.CLR_THEME).alphaColor(200), 2);
|
||||
|
||||
public void setFocused(boolean focused) {
|
||||
public void setFocused(final boolean focused) {
|
||||
avatarLabel.setBorder(focused ? focusedBorder : defaultBorder);
|
||||
}
|
||||
|
||||
|
||||
@@ -24,9 +24,7 @@ import com.google.common.collect.ImmutableList;
|
||||
import com.google.common.collect.Lists;
|
||||
|
||||
import forge.AIOption;
|
||||
import forge.GuiBase;
|
||||
import forge.UiCommand;
|
||||
import forge.assets.FSkinProp;
|
||||
import forge.deck.CardPool;
|
||||
import forge.deck.Deck;
|
||||
import forge.deck.DeckProxy;
|
||||
@@ -60,6 +58,7 @@ import forge.toolbox.FTextField;
|
||||
import forge.util.Aggregates;
|
||||
import forge.util.Lang;
|
||||
import forge.util.NameGenerator;
|
||||
import forge.util.gui.SOptionPane;
|
||||
import forge.util.storage.IStorage;
|
||||
|
||||
/**
|
||||
@@ -200,6 +199,7 @@ public class VLobby implements IUpdateable {
|
||||
getPlayerPanelWithFocus().focusOnAvatar();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update(final boolean fullUpdate) {
|
||||
activePlayersNum = lobby.getNumberOfSlots();
|
||||
addPlayerBtn.setEnabled(activePlayersNum < MAX_PLAYERS);
|
||||
@@ -275,7 +275,7 @@ public class VLobby implements IUpdateable {
|
||||
|
||||
void setReady(final int index, final boolean ready) {
|
||||
if (ready && decks[index] == null) {
|
||||
GuiBase.getInterface().showOptionDialog("Select a deck before readying!", "Error", FSkinProp.ICO_WARNING, new String[] { "Ok" }, 0);
|
||||
SOptionPane.showErrorDialog("Select a deck before readying!");
|
||||
update(false);
|
||||
return;
|
||||
}
|
||||
@@ -391,7 +391,7 @@ public class VLobby implements IUpdateable {
|
||||
planarDeckPanels.add(planarDeckPanel);
|
||||
|
||||
// Vanguard avatar list
|
||||
FPanel vgdDeckPanel = new FPanel();
|
||||
final FPanel vgdDeckPanel = new FPanel();
|
||||
vgdDeckPanel.setBorderToggle(false);
|
||||
|
||||
final FList<Object> vgdAvatarList = new FList<Object>();
|
||||
@@ -624,14 +624,6 @@ public class VLobby implements IUpdateable {
|
||||
/** Gets the random deck checkbox for Artifacts. */
|
||||
FCheckBox getCbArtifacts() { return cbArtifacts; }
|
||||
|
||||
FCheckBox getVntArchenemy() { return vntArchenemy; }
|
||||
FCheckBox getVntArchenemyRumble() { return vntArchenemyRumble; }
|
||||
FCheckBox getVntCommander() { return vntCommander; }
|
||||
FCheckBox getVntMomirBasic() { return vntMomirBasic; }
|
||||
FCheckBox getVntPlanechase() { return vntPlanechase; }
|
||||
FCheckBox getVntTinyLeaders() { return vntTinyLeaders; }
|
||||
FCheckBox getVntVanguard() { return vntVanguard; }
|
||||
|
||||
public final List<PlayerPanel> getPlayerPanels() {
|
||||
return playerPanels;
|
||||
}
|
||||
@@ -642,7 +634,7 @@ public class VLobby implements IUpdateable {
|
||||
return iPlayer == playerWithFocus;
|
||||
}
|
||||
|
||||
public final FDeckChooser getDeckChooser(int playernum) {
|
||||
public final FDeckChooser getDeckChooser(final int playernum) {
|
||||
return deckChoosers.get(playernum);
|
||||
}
|
||||
|
||||
@@ -663,7 +655,7 @@ public class VLobby implements IUpdateable {
|
||||
}
|
||||
|
||||
/** Revalidates the player and deck sections. Necessary after adding or hiding any panels. */
|
||||
private void refreshPanels(boolean refreshPlayerFrame, boolean refreshDeckFrame) {
|
||||
private void refreshPanels(final boolean refreshPlayerFrame, final boolean refreshDeckFrame) {
|
||||
if (refreshPlayerFrame) {
|
||||
playersScroll.validate();
|
||||
playersScroll.repaint();
|
||||
@@ -674,11 +666,11 @@ public class VLobby implements IUpdateable {
|
||||
}
|
||||
}
|
||||
|
||||
public void changePlayerFocus(int newFocusOwner) {
|
||||
public void changePlayerFocus(final int newFocusOwner) {
|
||||
changePlayerFocus(newFocusOwner, lobby.getGameType());
|
||||
}
|
||||
|
||||
void changePlayerFocus(int newFocusOwner, GameType gType) {
|
||||
void changePlayerFocus(final int newFocusOwner, final GameType gType) {
|
||||
final PlayerPanel oldFocus = getPlayerPanelWithFocus();
|
||||
if (oldFocus != null) {
|
||||
oldFocus.setFocused(false);
|
||||
@@ -695,15 +687,15 @@ public class VLobby implements IUpdateable {
|
||||
|
||||
/** Saves avatar prefs for players one and two. */
|
||||
void updateAvatarPrefs() {
|
||||
int pOneIndex = playerPanels.get(0).getAvatarIndex();
|
||||
int pTwoIndex = playerPanels.get(1).getAvatarIndex();
|
||||
final int pOneIndex = playerPanels.get(0).getAvatarIndex();
|
||||
final int pTwoIndex = playerPanels.get(1).getAvatarIndex();
|
||||
|
||||
prefs.setPref(FPref.UI_AVATARS, pOneIndex + "," + pTwoIndex);
|
||||
prefs.save();
|
||||
}
|
||||
|
||||
/** Adds a pre-styled FLabel component with the specified title. */
|
||||
FLabel newLabel(String title) {
|
||||
FLabel newLabel(final String title) {
|
||||
return new FLabel.Builder().text(title).fontSize(14).fontStyle(Font.ITALIC).build();
|
||||
}
|
||||
|
||||
@@ -735,7 +727,7 @@ public class VLobby implements IUpdateable {
|
||||
final String type = typeOptions[typeIndex];
|
||||
|
||||
String confirmMsg, newName;
|
||||
List<String> usedNames = getPlayerNames();
|
||||
final List<String> usedNames = getPlayerNames();
|
||||
do {
|
||||
newName = NameGenerator.getRandomName(gender, type, usedNames);
|
||||
confirmMsg = "Would you like to use the name \"" + newName + "\", or try again?";
|
||||
@@ -745,8 +737,8 @@ public class VLobby implements IUpdateable {
|
||||
}
|
||||
|
||||
List<String> getPlayerNames() {
|
||||
List<String> names = new ArrayList<String>();
|
||||
for (PlayerPanel pp : playerPanels) {
|
||||
final List<String> names = new ArrayList<String>();
|
||||
for (final PlayerPanel pp : playerPanels) {
|
||||
names.add(pp.getPlayerName());
|
||||
}
|
||||
return names;
|
||||
@@ -776,8 +768,8 @@ public class VLobby implements IUpdateable {
|
||||
|
||||
final ActionListener nameListener = new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
FTextField nField = (FTextField)e.getSource();
|
||||
public void actionPerformed(final ActionEvent e) {
|
||||
final FTextField nField = (FTextField)e.getSource();
|
||||
nField.transferFocus();
|
||||
}
|
||||
};
|
||||
@@ -812,7 +804,7 @@ public class VLobby implements IUpdateable {
|
||||
/** Return all the Vanguard avatars. */
|
||||
public Iterable<PaperCard> getAllAvatars() {
|
||||
if (vgdAllAvatars.isEmpty()) {
|
||||
for (PaperCard c : FModel.getMagicDb().getVariantCards().getAllCards()) {
|
||||
for (final PaperCard c : FModel.getMagicDb().getVariantCards().getAllCards()) {
|
||||
if (c.getRules().getType().isVanguard()) {
|
||||
vgdAllAvatars.add(c);
|
||||
}
|
||||
@@ -842,7 +834,7 @@ public class VLobby implements IUpdateable {
|
||||
humanListData.add("Random");
|
||||
aiListData.add("Use deck's default avatar (random if unavailable)");
|
||||
aiListData.add("Random");
|
||||
for (PaperCard cp : getAllAvatars()) {
|
||||
for (final PaperCard cp : getAllAvatars()) {
|
||||
humanListData.add(cp);
|
||||
if (!cp.getRules().getAiHints().getRemRandomDecks()) {
|
||||
nonRandomHumanAvatars.add(cp);
|
||||
@@ -858,9 +850,9 @@ public class VLobby implements IUpdateable {
|
||||
}
|
||||
|
||||
/** update vanguard list. */
|
||||
public void updateVanguardList(int playerIndex) {
|
||||
FList<Object> vgdList = getVanguardLists().get(playerIndex);
|
||||
Object lastSelection = vgdList.getSelectedValue();
|
||||
public void updateVanguardList(final int playerIndex) {
|
||||
final FList<Object> vgdList = getVanguardLists().get(playerIndex);
|
||||
final Object lastSelection = vgdList.getSelectedValue();
|
||||
vgdList.setListData(isPlayerAI(playerIndex) ? aiListData : humanListData);
|
||||
if (null != lastSelection) {
|
||||
vgdList.setSelectedValue(lastSelection, true);
|
||||
|
||||
@@ -1,5 +1,16 @@
|
||||
package forge.screens.home.gauntlet;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import javax.swing.JFileChooser;
|
||||
import javax.swing.ListSelectionModel;
|
||||
import javax.swing.SwingUtilities;
|
||||
import javax.swing.filechooser.FileFilter;
|
||||
|
||||
import org.apache.commons.lang3.ArrayUtils;
|
||||
|
||||
import forge.UiCommand;
|
||||
import forge.deck.Deck;
|
||||
import forge.gauntlet.GauntletData;
|
||||
@@ -8,18 +19,9 @@ import forge.gui.framework.ICDoc;
|
||||
import forge.properties.ForgeConstants;
|
||||
import forge.toolbox.FOptionPane;
|
||||
|
||||
import org.apache.commons.lang3.ArrayUtils;
|
||||
|
||||
import javax.swing.*;
|
||||
import javax.swing.filechooser.FileFilter;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
/**
|
||||
* Controls the "build gauntlet" submenu in the home UI.
|
||||
*
|
||||
*
|
||||
* <br><br><i>(C at beginning of class name denotes a control class.)</i>
|
||||
*
|
||||
*/
|
||||
@@ -30,7 +32,7 @@ public enum CSubmenuGauntletBuild implements ICDoc {
|
||||
|
||||
private final VSubmenuGauntletBuild view = VSubmenuGauntletBuild.SINGLETON_INSTANCE;
|
||||
private final List<Deck> workingDecks = new ArrayList<Deck>();
|
||||
private File openStartDir = new File(ForgeConstants.GAUNTLET_DIR.userPrefLoc);
|
||||
private final File openStartDir = new File(ForgeConstants.GAUNTLET_DIR.userPrefLoc);
|
||||
|
||||
private final FileFilter filterDAT = new FileFilter() {
|
||||
@Override
|
||||
@@ -39,7 +41,7 @@ public enum CSubmenuGauntletBuild implements ICDoc {
|
||||
return true;
|
||||
}
|
||||
|
||||
String filename = f.getName();
|
||||
final String filename = f.getName();
|
||||
return (!filename.startsWith(GauntletIO.PREFIX_QUICK) && filename.endsWith(GauntletIO.SUFFIX_DATA));
|
||||
}
|
||||
|
||||
@@ -49,29 +51,41 @@ public enum CSubmenuGauntletBuild implements ICDoc {
|
||||
}
|
||||
};
|
||||
|
||||
//private final KeyAdapter kadSearch = new KeyAdapter() { @Override
|
||||
//public void keyPressed(final KeyEvent e) { search(); } };
|
||||
|
||||
private final UiCommand cmdAddDeck = new UiCommand() { @Override
|
||||
public void run() { addDeck(); } };
|
||||
|
||||
private final UiCommand cmdRemoveDeck = new UiCommand() { @Override
|
||||
public void run() { removeDeck(); } };
|
||||
|
||||
private final UiCommand cmdDeckUp = new UiCommand() { @Override
|
||||
public void run() { deckUp(); } };
|
||||
|
||||
private final UiCommand cmdDeckDown = new UiCommand() { @Override
|
||||
public void run() { deckDown(); } };
|
||||
|
||||
private final UiCommand cmdSave = new UiCommand() { @Override
|
||||
public void run() { saveGauntlet(); } };
|
||||
|
||||
private final UiCommand cmdNew = new UiCommand() { @Override
|
||||
public void run() { newGauntlet(); } };
|
||||
|
||||
private final UiCommand cmdOpen = new UiCommand() { @Override
|
||||
public void run() { openGauntlet(); } };
|
||||
private final UiCommand cmdAddDeck = new UiCommand() {
|
||||
@Override public void run() {
|
||||
addDeck();
|
||||
}
|
||||
};
|
||||
private final UiCommand cmdRemoveDeck = new UiCommand() {
|
||||
@Override public void run() {
|
||||
removeDeck();
|
||||
}
|
||||
};
|
||||
private final UiCommand cmdDeckUp = new UiCommand() {
|
||||
@Override public void run() {
|
||||
deckUp();
|
||||
}
|
||||
};
|
||||
private final UiCommand cmdDeckDown = new UiCommand() {
|
||||
@Override public void run() {
|
||||
deckDown();
|
||||
}
|
||||
};
|
||||
private final UiCommand cmdSave = new UiCommand() {
|
||||
@Override public void run() {
|
||||
saveGauntlet();
|
||||
}
|
||||
};
|
||||
private final UiCommand cmdNew = new UiCommand() {
|
||||
@Override public void run() {
|
||||
newGauntlet();
|
||||
}
|
||||
};
|
||||
private final UiCommand cmdOpen = new UiCommand() {
|
||||
@Override public void run() {
|
||||
openGauntlet();
|
||||
}
|
||||
};
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.home.ICSubmenu#initialize()
|
||||
@@ -102,23 +116,16 @@ public enum CSubmenuGauntletBuild implements ICDoc {
|
||||
view.getBtnSave().setCommand(cmdSave);
|
||||
view.getBtnOpen().setCommand(cmdOpen);
|
||||
view.getBtnNew().setCommand(cmdNew);
|
||||
|
||||
|
||||
view.getLstLeft().initialize();
|
||||
// updateDecks();
|
||||
// updateDecks();
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.framework.ICDoc#getCommandOnSelect()
|
||||
*/
|
||||
@Override
|
||||
public UiCommand getCommandOnSelect() {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
private void addDeck() {
|
||||
final Deck deckToAdd = view.getLstLeft().getPlayer().getDeck();
|
||||
if ( null == deckToAdd ) return;
|
||||
if ( null == deckToAdd ) {
|
||||
return;
|
||||
}
|
||||
workingDecks.add(deckToAdd);
|
||||
view.getLblSave().setVisible(false);
|
||||
dumpDecksIntoList();
|
||||
@@ -189,7 +196,7 @@ public enum CSubmenuGauntletBuild implements ICDoc {
|
||||
if (f.exists()) {
|
||||
if (!FOptionPane.showConfirmDialog(
|
||||
"There is already a gauntlet named '" + name + "'.\n"
|
||||
+ "All progress and data will be overwritten. Continue?",
|
||||
+ "All progress and data will be overwritten. Continue?",
|
||||
"Overwrite Gauntlet?")) { return false; }
|
||||
|
||||
gd = GauntletIO.loadGauntlet(f);
|
||||
|
||||
@@ -1,7 +1,14 @@
|
||||
package forge.screens.home.gauntlet;
|
||||
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import javax.swing.SwingUtilities;
|
||||
|
||||
import forge.GuiBase;
|
||||
import forge.UiCommand;
|
||||
import forge.deck.Deck;
|
||||
import forge.game.GameType;
|
||||
import forge.game.player.RegisteredPlayer;
|
||||
@@ -13,22 +20,13 @@ import forge.match.HostedMatch;
|
||||
import forge.model.FModel;
|
||||
import forge.player.GamePlayerUtil;
|
||||
|
||||
import javax.swing.*;
|
||||
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
/**
|
||||
* Controls the "gauntlet contests" submenu in the home UI.
|
||||
*
|
||||
*
|
||||
* <br><br><i>(C at beginning of class name denotes a control class.)</i>
|
||||
*
|
||||
*/
|
||||
|
||||
@SuppressWarnings("serial")
|
||||
public enum CSubmenuGauntletContests implements ICDoc {
|
||||
/** */
|
||||
SINGLETON_INSTANCE;
|
||||
@@ -37,7 +35,7 @@ public enum CSubmenuGauntletContests implements ICDoc {
|
||||
|
||||
private final ActionListener actStartGame = new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent arg0) {
|
||||
public void actionPerformed(final ActionEvent arg0) {
|
||||
startGame();
|
||||
}
|
||||
};
|
||||
@@ -73,7 +71,7 @@ public enum CSubmenuGauntletContests implements ICDoc {
|
||||
final File[] files = GauntletIO.getGauntletFilesLocked();
|
||||
final List<GauntletData> data = new ArrayList<GauntletData>();
|
||||
for (final File f : files) {
|
||||
GauntletData gd = GauntletIO.loadGauntlet(f);
|
||||
final GauntletData gd = GauntletIO.loadGauntlet(f);
|
||||
if (gd != null) {
|
||||
data.add(gd);
|
||||
}
|
||||
@@ -124,16 +122,4 @@ public enum CSubmenuGauntletContests implements ICDoc {
|
||||
});
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.framework.ICDoc#getCommandOnSelect()
|
||||
*/
|
||||
@Override
|
||||
public UiCommand getCommandOnSelect() {
|
||||
return new UiCommand() {
|
||||
@Override
|
||||
public void run() {
|
||||
updateData();
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,14 @@
|
||||
package forge.screens.home.gauntlet;
|
||||
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import javax.swing.JButton;
|
||||
import javax.swing.SwingUtilities;
|
||||
|
||||
import forge.GuiBase;
|
||||
import forge.UiCommand;
|
||||
import forge.deck.Deck;
|
||||
@@ -15,25 +24,20 @@ import forge.match.HostedMatch;
|
||||
import forge.model.FModel;
|
||||
import forge.player.GamePlayerUtil;
|
||||
|
||||
import javax.swing.*;
|
||||
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
/**
|
||||
* Controls the "quick gauntlet" submenu in the home UI.
|
||||
*
|
||||
*
|
||||
* <br><br><i>(C at beginning of class name denotes a control class.)</i>
|
||||
*
|
||||
*/
|
||||
public enum CSubmenuGauntletLoad implements ICDoc {
|
||||
SINGLETON_INSTANCE;
|
||||
|
||||
private final ActionListener actStartGame = new ActionListener() { @Override
|
||||
public void actionPerformed(ActionEvent arg0) { startGame(); } };
|
||||
private final ActionListener actStartGame = new ActionListener() {
|
||||
@Override public final void actionPerformed(final ActionEvent arg0) {
|
||||
startGame();
|
||||
}
|
||||
};
|
||||
|
||||
private final VSubmenuGauntletLoad view = VSubmenuGauntletLoad.SINGLETON_INSTANCE;
|
||||
|
||||
@@ -49,7 +53,7 @@ public enum CSubmenuGauntletLoad implements ICDoc {
|
||||
|
||||
SwingUtilities.invokeLater(new Runnable() {
|
||||
@Override public void run() {
|
||||
JButton btnStart = view.getBtnStart();
|
||||
final JButton btnStart = view.getBtnStart();
|
||||
if (btnStart.isEnabled()) {
|
||||
view.getBtnStart().requestFocusInWindow();
|
||||
}
|
||||
@@ -94,7 +98,7 @@ public enum CSubmenuGauntletLoad implements ICDoc {
|
||||
final List<GauntletData> data = new ArrayList<GauntletData>();
|
||||
|
||||
for (final File f : files) {
|
||||
GauntletData gd = GauntletIO.loadGauntlet(f);
|
||||
final GauntletData gd = GauntletIO.loadGauntlet(f);
|
||||
if (gd != null) {
|
||||
data.add(gd);
|
||||
}
|
||||
@@ -153,17 +157,4 @@ public enum CSubmenuGauntletLoad implements ICDoc {
|
||||
});
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.framework.ICDoc#getCommandOnSelect()
|
||||
*/
|
||||
@Override
|
||||
@SuppressWarnings("serial")
|
||||
public UiCommand getCommandOnSelect() {
|
||||
return new UiCommand() {
|
||||
@Override
|
||||
public void run() {
|
||||
updateData();
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,12 @@
|
||||
package forge.screens.home.gauntlet;
|
||||
|
||||
import forge.UiCommand;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import javax.swing.SwingUtilities;
|
||||
|
||||
import forge.deck.DeckType;
|
||||
import forge.game.player.RegisteredPlayer;
|
||||
import forge.gauntlet.GauntletData;
|
||||
@@ -9,16 +15,9 @@ import forge.gui.SOverlayUtils;
|
||||
import forge.gui.framework.ICDoc;
|
||||
import forge.player.GamePlayerUtil;
|
||||
|
||||
import javax.swing.*;
|
||||
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
/**
|
||||
* Controls the "quick gauntlet" submenu in the home UI.
|
||||
*
|
||||
*
|
||||
* <br><br><i>(C at beginning of class name denotes a control class.)</i>
|
||||
*
|
||||
*/
|
||||
@@ -27,8 +26,11 @@ public enum CSubmenuGauntletQuick implements ICDoc {
|
||||
/** */
|
||||
SINGLETON_INSTANCE;
|
||||
|
||||
private final ActionListener actStartGame = new ActionListener() { @Override
|
||||
public void actionPerformed(ActionEvent arg0) { startGame(); } };
|
||||
private final ActionListener actStartGame = new ActionListener() {
|
||||
@Override public void actionPerformed(final ActionEvent arg0) {
|
||||
startGame();
|
||||
}
|
||||
};
|
||||
|
||||
private final VSubmenuGauntletQuick view = VSubmenuGauntletQuick.SINGLETON_INSTANCE;
|
||||
|
||||
@@ -90,11 +92,4 @@ public enum CSubmenuGauntletQuick implements ICDoc {
|
||||
});
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.framework.ICDoc#getCommandOnSelect()
|
||||
*/
|
||||
@Override
|
||||
public UiCommand getCommandOnSelect() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,17 +1,6 @@
|
||||
package forge.screens.home.gauntlet;
|
||||
|
||||
|
||||
import forge.UiCommand;
|
||||
import forge.gauntlet.GauntletData;
|
||||
import forge.gauntlet.GauntletIO;
|
||||
import forge.toolbox.FLabel;
|
||||
import forge.toolbox.FSkin;
|
||||
import forge.toolbox.FSkin.SkinnedPanel;
|
||||
import net.miginfocom.swing.MigLayout;
|
||||
|
||||
import javax.swing.*;
|
||||
|
||||
import java.awt.*;
|
||||
import java.awt.Color;
|
||||
import java.awt.event.MouseAdapter;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.util.ArrayList;
|
||||
@@ -19,7 +8,18 @@ import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.SwingConstants;
|
||||
|
||||
import net.miginfocom.swing.MigLayout;
|
||||
import forge.UiCommand;
|
||||
import forge.gauntlet.GauntletData;
|
||||
import forge.gauntlet.GauntletIO;
|
||||
import forge.toolbox.FLabel;
|
||||
import forge.toolbox.FSkin;
|
||||
import forge.toolbox.FSkin.SkinnedPanel;
|
||||
|
||||
/**
|
||||
* Creates file list/table for quick deleting, editing, and basic info.
|
||||
*
|
||||
*/
|
||||
@@ -31,7 +31,6 @@ public class ContestGauntletLister extends JPanel {
|
||||
private final Color clrDefault;
|
||||
private final FSkin.SkinColor clrHover, clrActive, clrBorders;
|
||||
|
||||
/** */
|
||||
public ContestGauntletLister() {
|
||||
super();
|
||||
this.clrDefault = new Color(0, 0, 0, 0);
|
||||
@@ -43,12 +42,11 @@ public class ContestGauntletLister extends JPanel {
|
||||
this.setLayout(new MigLayout("insets 0, gap 0, wrap"));
|
||||
}
|
||||
|
||||
/** @param gd0   {@link forge.gauntlet.GauntletData}[] */
|
||||
public void setGauntlets(List<GauntletData> gd0) {
|
||||
public void setGauntlets(final List<GauntletData> gd0) {
|
||||
this.removeAll();
|
||||
List<RowPanel> tempRows = new ArrayList<RowPanel>();
|
||||
List<GauntletData> sorted = new ArrayList<GauntletData>();
|
||||
for (GauntletData gd : gd0) { sorted.add(gd); }
|
||||
final List<RowPanel> tempRows = new ArrayList<RowPanel>();
|
||||
final List<GauntletData> sorted = new ArrayList<GauntletData>();
|
||||
for (final GauntletData gd : gd0) { sorted.add(gd); }
|
||||
Collections.sort(sorted, new Comparator<GauntletData>() {
|
||||
@Override
|
||||
public int compare(final GauntletData x, final GauntletData y) {
|
||||
@@ -77,7 +75,7 @@ public class ContestGauntletLister extends JPanel {
|
||||
RowPanel row;
|
||||
String name;
|
||||
String progress;
|
||||
for (GauntletData gd : sorted) {
|
||||
for (final GauntletData gd : sorted) {
|
||||
name = gd.getName();
|
||||
name = name.substring(GauntletIO.PREFIX_LOCKED.length());
|
||||
|
||||
@@ -109,7 +107,6 @@ public class ContestGauntletLister extends JPanel {
|
||||
revalidate();
|
||||
}
|
||||
|
||||
/** @return {@link forge.deck.Deck} */
|
||||
public GauntletData getSelectedGauntlet() {
|
||||
if (previousSelect == null) {
|
||||
return null;
|
||||
@@ -121,9 +118,9 @@ public class ContestGauntletLister extends JPanel {
|
||||
|
||||
private class RowPanel extends SkinnedPanel {
|
||||
private boolean selected = false;
|
||||
private GauntletData gauntletData;
|
||||
private final GauntletData gauntletData;
|
||||
|
||||
public RowPanel(GauntletData gd0) {
|
||||
public RowPanel(final GauntletData gd0) {
|
||||
super();
|
||||
setOpaque(false);
|
||||
setBackground(new Color(0, 0, 0, 0));
|
||||
@@ -133,27 +130,27 @@ public class ContestGauntletLister extends JPanel {
|
||||
|
||||
this.addMouseListener(new MouseAdapter() {
|
||||
@Override
|
||||
public void mouseEntered(MouseEvent e) {
|
||||
public void mouseEntered(final MouseEvent e) {
|
||||
if (!selected) {
|
||||
RowPanel.this.setBackground(clrHover);
|
||||
RowPanel.this.setOpaque(true);
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public void mouseExited(MouseEvent e) {
|
||||
public void mouseExited(final MouseEvent e) {
|
||||
if (!selected) {
|
||||
RowPanel.this.setBackground(clrDefault);
|
||||
RowPanel.this.setOpaque(false);
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public void mousePressed(MouseEvent e) {
|
||||
public void mousePressed(final MouseEvent e) {
|
||||
selectHandler(RowPanel.this);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void setSelected(boolean b0) {
|
||||
public void setSelected(final boolean b0) {
|
||||
selected = b0;
|
||||
setOpaque(b0);
|
||||
this.setBackground(b0 ? clrActive : clrHover);
|
||||
@@ -168,7 +165,6 @@ public class ContestGauntletLister extends JPanel {
|
||||
}
|
||||
}
|
||||
|
||||
/** @return {@link java.lang.Integer} */
|
||||
public int getSelectedIndex() {
|
||||
for (int i = 0; i < rows.length; i++) {
|
||||
if (rows[i].isSelected()) { return i; }
|
||||
@@ -180,32 +176,18 @@ public class ContestGauntletLister extends JPanel {
|
||||
* @param i0   int
|
||||
* @return boolean success
|
||||
*/
|
||||
public boolean setSelectedIndex(int i0) {
|
||||
public boolean setSelectedIndex(final int i0) {
|
||||
if (i0 >= rows.length) { return false; }
|
||||
selectHandler(rows[i0]);
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param qd0   Gauntlet data object to select (if exists in list)
|
||||
* @return boolean success
|
||||
*/
|
||||
public boolean setSelectedGauntletData(GauntletData qd0) {
|
||||
/*for (RowPanel r : rows) {
|
||||
if (r.getQuestData().getName().equals(qd0.getName())) {
|
||||
selectHandler(r);
|
||||
return true;
|
||||
}
|
||||
}*/
|
||||
return false;
|
||||
}
|
||||
|
||||
/** @param c0   {@link forge.UiCommand} command executed on row select. */
|
||||
public void setSelectCommand(UiCommand c0) {
|
||||
public void setSelectCommand(final UiCommand c0) {
|
||||
this.cmdRowSelect = c0;
|
||||
}
|
||||
|
||||
private void selectHandler(RowPanel r0) {
|
||||
private void selectHandler(final RowPanel r0) {
|
||||
if (previousSelect != null) {
|
||||
previousSelect.setSelected(false);
|
||||
}
|
||||
|
||||
@@ -1,5 +1,18 @@
|
||||
package forge.screens.home.gauntlet;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.SwingConstants;
|
||||
import javax.swing.border.Border;
|
||||
|
||||
import net.miginfocom.swing.MigLayout;
|
||||
import forge.UiCommand;
|
||||
import forge.assets.FSkinProp;
|
||||
import forge.gauntlet.GauntletData;
|
||||
@@ -12,26 +25,13 @@ import forge.toolbox.FSkin;
|
||||
import forge.toolbox.FSkin.SkinIcon;
|
||||
import forge.toolbox.FSkin.SkinnedButton;
|
||||
import forge.toolbox.FSkin.SkinnedPanel;
|
||||
import net.miginfocom.swing.MigLayout;
|
||||
|
||||
import javax.swing.*;
|
||||
import javax.swing.border.Border;
|
||||
|
||||
import java.awt.*;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
/**
|
||||
* Creates file list/table for quick deleting, editing, and basic info.
|
||||
*
|
||||
*/
|
||||
@SuppressWarnings("serial")
|
||||
public class QuickGauntletLister extends JPanel {
|
||||
private SkinIcon icoDelete, icoDeleteOver, icoEdit, icoEditOver;
|
||||
private final SkinIcon icoDelete, icoDeleteOver, icoEdit, icoEditOver;
|
||||
private RowPanel previousSelect;
|
||||
private RowPanel[] rows;
|
||||
private UiCommand cmdRowSelect, cmdRowDelete, cmdRowActivate;
|
||||
@@ -39,7 +39,6 @@ public class QuickGauntletLister extends JPanel {
|
||||
private final FSkin.SkinColor clrHover, clrActive, clrBorders;
|
||||
private List<GauntletData> gauntlets;
|
||||
|
||||
/** */
|
||||
public QuickGauntletLister() {
|
||||
super();
|
||||
|
||||
@@ -57,17 +56,16 @@ public class QuickGauntletLister extends JPanel {
|
||||
icoEditOver = FSkin.getIcon(FSkinProp.ICO_EDIT_OVER);
|
||||
}
|
||||
|
||||
/** @param gd0   {@link forge.gauntlet.GauntletData}[] */
|
||||
public void setGauntlets(List<GauntletData> gd0) {
|
||||
public void setGauntlets(final List<GauntletData> gd0) {
|
||||
gauntlets = gd0;
|
||||
refresh();
|
||||
}
|
||||
|
||||
public void refresh() {
|
||||
this.removeAll();
|
||||
List<RowPanel> tempRows = new ArrayList<RowPanel>();
|
||||
List<GauntletData> sorted = new ArrayList<GauntletData>();
|
||||
for (GauntletData gd : gauntlets) { sorted.add(gd); }
|
||||
final List<RowPanel> tempRows = new ArrayList<RowPanel>();
|
||||
final List<GauntletData> sorted = new ArrayList<GauntletData>();
|
||||
for (final GauntletData gd : gauntlets) { sorted.add(gd); }
|
||||
Collections.sort(sorted, new Comparator<GauntletData>() {
|
||||
@Override
|
||||
public int compare(final GauntletData x, final GauntletData y) {
|
||||
@@ -95,7 +93,7 @@ public class QuickGauntletLister extends JPanel {
|
||||
|
||||
RowPanel row;
|
||||
String name;
|
||||
for (GauntletData gd : sorted) {
|
||||
for (final GauntletData gd : sorted) {
|
||||
name = gd.getName();
|
||||
|
||||
row = new RowPanel(gd);
|
||||
@@ -124,7 +122,6 @@ public class QuickGauntletLister extends JPanel {
|
||||
revalidate();
|
||||
}
|
||||
|
||||
/** @return {@link forge.deck.Deck} */
|
||||
public File getSelectedGauntletFile() {
|
||||
if (previousSelect == null) {
|
||||
return null;
|
||||
@@ -149,21 +146,21 @@ public class QuickGauntletLister extends JPanel {
|
||||
|
||||
this.addMouseListener(new FMouseAdapter() {
|
||||
@Override
|
||||
public void onMouseEnter(MouseEvent e) {
|
||||
public void onMouseEnter(final MouseEvent e) {
|
||||
if (!r0.selected) {
|
||||
r0.setBackground(clrHover);
|
||||
r0.setOpaque(true);
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public void onMouseExit(MouseEvent e) {
|
||||
public void onMouseExit(final MouseEvent e) {
|
||||
if (!r0.selected) {
|
||||
r0.setBackground(clrDefault);
|
||||
r0.setOpaque(false);
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public void onLeftClick(MouseEvent e) {
|
||||
public void onLeftClick(final MouseEvent e) {
|
||||
deleteFile(r0);
|
||||
}
|
||||
});
|
||||
@@ -185,21 +182,21 @@ public class QuickGauntletLister extends JPanel {
|
||||
|
||||
this.addMouseListener(new FMouseAdapter() {
|
||||
@Override
|
||||
public void onMouseEnter(MouseEvent e) {
|
||||
public void onMouseEnter(final MouseEvent e) {
|
||||
if (!r0.selected) {
|
||||
r0.setBackground(clrHover);
|
||||
r0.setOpaque(true);
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public void onMouseExit(MouseEvent e) {
|
||||
public void onMouseExit(final MouseEvent e) {
|
||||
if (!r0.selected) {
|
||||
r0.setBackground(clrDefault);
|
||||
r0.setOpaque(false);
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public void onLeftClick(MouseEvent e) {
|
||||
public void onLeftClick(final MouseEvent e) {
|
||||
renameGauntlet(r0.getGauntletData());
|
||||
}
|
||||
});
|
||||
@@ -209,9 +206,9 @@ public class QuickGauntletLister extends JPanel {
|
||||
private class RowPanel extends SkinnedPanel {
|
||||
private boolean selected = false;
|
||||
private boolean hovered = false;
|
||||
private GauntletData gauntletData;
|
||||
private final GauntletData gauntletData;
|
||||
|
||||
public RowPanel(GauntletData gd0) {
|
||||
public RowPanel(final GauntletData gd0) {
|
||||
super();
|
||||
setOpaque(false);
|
||||
setBackground(new Color(0, 0, 0, 0));
|
||||
@@ -267,7 +264,6 @@ public class QuickGauntletLister extends JPanel {
|
||||
}
|
||||
}
|
||||
|
||||
/** @return {@link java.lang.Integer} */
|
||||
public int getSelectedIndex() {
|
||||
for (int i = 0; i < rows.length; i++) {
|
||||
if (rows[i].isSelected()) { return i; }
|
||||
@@ -279,42 +275,28 @@ public class QuickGauntletLister extends JPanel {
|
||||
* @param i0   int
|
||||
* @return boolean success
|
||||
*/
|
||||
public boolean setSelectedIndex(int i0) {
|
||||
public boolean setSelectedIndex(final int i0) {
|
||||
if (i0 >= rows.length) { return false; }
|
||||
selectHandler(rows[Math.max(0, i0)]);
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param qd0   Gauntlet data object to select (if exists in list)
|
||||
* @return boolean success
|
||||
*/
|
||||
public boolean setSelectedGauntletData(GauntletData qd0) {
|
||||
/*for (RowPanel r : rows) {
|
||||
if (r.getQuestData().getName().equals(qd0.getName())) {
|
||||
selectHandler(r);
|
||||
return true;
|
||||
}
|
||||
}*/
|
||||
return false;
|
||||
}
|
||||
|
||||
/** @param c0   {@link forge.UiCommand} command executed on row select. */
|
||||
public void setCmdSelect(UiCommand c0) {
|
||||
public void setCmdSelect(final UiCommand c0) {
|
||||
this.cmdRowSelect = c0;
|
||||
}
|
||||
|
||||
/** @param c0   {@link forge.UiCommand} command executed on row delete. */
|
||||
public void setCmdDelete(UiCommand c0) {
|
||||
public void setCmdDelete(final UiCommand c0) {
|
||||
this.cmdRowDelete = c0;
|
||||
}
|
||||
|
||||
/** @param c0   {@link forge.UiCommand} command executed on row activate. */
|
||||
public void setCmdActivate(UiCommand c0) {
|
||||
public void setCmdActivate(final UiCommand c0) {
|
||||
this.cmdRowActivate = c0;
|
||||
}
|
||||
|
||||
private void selectHandler(RowPanel r0) {
|
||||
private void selectHandler(final RowPanel r0) {
|
||||
if (previousSelect != null) {
|
||||
previousSelect.setSelected(false);
|
||||
}
|
||||
@@ -324,9 +306,9 @@ public class QuickGauntletLister extends JPanel {
|
||||
if (cmdRowSelect != null) { cmdRowSelect.run(); }
|
||||
}
|
||||
|
||||
private void renameGauntlet(GauntletData gauntlet) {
|
||||
private void renameGauntlet(final GauntletData gauntlet) {
|
||||
String gauntletName;
|
||||
String oldGauntletName = gauntlet.getName();
|
||||
final String oldGauntletName = gauntlet.getName();
|
||||
while (true) {
|
||||
gauntletName = FOptionPane.showInputDialog("Rename gauntlet to:", "Gauntlet Rename", null, oldGauntletName);
|
||||
if (gauntletName == null) { return; }
|
||||
@@ -340,7 +322,7 @@ public class QuickGauntletLister extends JPanel {
|
||||
}
|
||||
|
||||
boolean exists = false;
|
||||
for (RowPanel r : rows) {
|
||||
for (final RowPanel r : rows) {
|
||||
if (r.getGauntletData().getName().equalsIgnoreCase(gauntletName)) {
|
||||
exists = true;
|
||||
break;
|
||||
@@ -357,7 +339,7 @@ public class QuickGauntletLister extends JPanel {
|
||||
refresh();
|
||||
}
|
||||
|
||||
private void deleteFile(RowPanel r0) {
|
||||
private void deleteFile(final RowPanel r0) {
|
||||
final GauntletData gd = r0.getGauntletData();
|
||||
|
||||
if (!FOptionPane.showConfirmDialog(
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
package forge.screens.home.online;
|
||||
|
||||
import forge.UiCommand;
|
||||
import forge.gui.framework.ICDoc;
|
||||
import forge.screens.home.CLobby;
|
||||
import forge.screens.home.VLobby;
|
||||
@@ -10,7 +9,7 @@ public enum COnlineLobby implements ICDoc {
|
||||
|
||||
private CLobby lobby;
|
||||
|
||||
void setLobby(VLobby lobbyView) {
|
||||
void setLobby(final VLobby lobbyView) {
|
||||
lobby = new CLobby(lobbyView);
|
||||
initialize();
|
||||
}
|
||||
@@ -39,12 +38,4 @@ public enum COnlineLobby implements ICDoc {
|
||||
}
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.framework.ICDoc#getCommandOnSelect()
|
||||
*/
|
||||
@Override
|
||||
public UiCommand getCommandOnSelect() {
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -5,9 +5,10 @@ import java.util.List;
|
||||
|
||||
import javax.swing.JMenu;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import forge.GuiBase;
|
||||
import forge.Singletons;
|
||||
import forge.UiCommand;
|
||||
import forge.assets.FSkinProp;
|
||||
import forge.gui.FNetOverlay;
|
||||
import forge.gui.framework.FScreen;
|
||||
@@ -29,6 +30,7 @@ import forge.net.event.NetEvent;
|
||||
import forge.net.event.UpdateLobbyPlayerEvent;
|
||||
import forge.net.server.FServerManager;
|
||||
import forge.net.server.ServerGameLobby;
|
||||
import forge.player.GamePlayerUtil;
|
||||
import forge.properties.ForgePreferences.FPref;
|
||||
import forge.screens.home.VLobby;
|
||||
import forge.screens.home.sanctioned.ConstructedGameMenu;
|
||||
@@ -38,6 +40,8 @@ public enum CSubmenuOnlineLobby implements ICDoc, IMenuProvider {
|
||||
SINGLETON_INSTANCE;
|
||||
|
||||
final void host(final int portNumber) {
|
||||
promptNameIfNeeded();
|
||||
|
||||
final FServerManager server = FServerManager.getInstance();
|
||||
final ServerGameLobby lobby = new ServerGameLobby();
|
||||
final VLobby view = VOnlineLobby.SINGLETON_INSTANCE.setLobby(lobby);
|
||||
@@ -91,11 +95,13 @@ public enum CSubmenuOnlineLobby implements ICDoc, IMenuProvider {
|
||||
}
|
||||
|
||||
final void join(final String hostname, final int port) {
|
||||
promptNameIfNeeded();
|
||||
|
||||
final IGuiGame gui = GuiBase.getInterface().getNewGuiGame();
|
||||
final FGameClient client = new FGameClient(FModel.getPreferences().getPref(FPref.PLAYER_NAME), "0", gui);
|
||||
VOnlineLobby.SINGLETON_INSTANCE.setClient(client);
|
||||
FNetOverlay.SINGLETON_INSTANCE.setGameClient(client);
|
||||
final ClientGameLobby lobby = new ClientGameLobby();
|
||||
final ClientGameLobby lobby = new ClientGameLobby();
|
||||
final VLobby view = VOnlineLobby.SINGLETON_INSTANCE.setLobby(lobby);
|
||||
lobby.setListener(view);
|
||||
client.addLobbyListener(new ILobbyListener() {
|
||||
@@ -123,6 +129,13 @@ public enum CSubmenuOnlineLobby implements ICDoc, IMenuProvider {
|
||||
FNetOverlay.SINGLETON_INSTANCE.showUp(String.format("Connected to %s:%d", hostname, port));
|
||||
}
|
||||
|
||||
private static void promptNameIfNeeded() {
|
||||
//prompt user for player one name if needed
|
||||
if (StringUtils.isBlank(FModel.getPreferences().getPref(FPref.PLAYER_NAME))) {
|
||||
GamePlayerUtil.setPlayerName();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void register() {
|
||||
}
|
||||
@@ -142,20 +155,12 @@ public enum CSubmenuOnlineLobby implements ICDoc, IMenuProvider {
|
||||
public void initialize() {
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.framework.ICDoc#getCommandOnSelect()
|
||||
*/
|
||||
@Override
|
||||
public UiCommand getCommandOnSelect() {
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.menubar.IMenuProvider#getMenus()
|
||||
*/
|
||||
@Override
|
||||
public List<JMenu> getMenus() {
|
||||
List<JMenu> menus = new ArrayList<JMenu>();
|
||||
final List<JMenu> menus = new ArrayList<JMenu>();
|
||||
menus.add(ConstructedGameMenu.getMenu());
|
||||
return menus;
|
||||
}
|
||||
|
||||
@@ -34,9 +34,6 @@ public enum VOnlineLobby implements IVDoc<COnlineLobby>, IVTopLevelUI {
|
||||
private VOnlineLobby() {
|
||||
}
|
||||
|
||||
VLobby getLobby() {
|
||||
return lobby;
|
||||
}
|
||||
VLobby setLobby(final GameLobby lobby) {
|
||||
this.lobby = new VLobby(lobby);
|
||||
getLayoutControl().setLobby(this.lobby);
|
||||
|
||||
@@ -1,8 +1,22 @@
|
||||
package forge.screens.home.quest;
|
||||
|
||||
import forge.UiCommand;
|
||||
import java.awt.Color;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.awt.event.KeyAdapter;
|
||||
import java.awt.event.KeyEvent;
|
||||
import java.awt.event.MouseAdapter;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import javax.swing.JRadioButton;
|
||||
import javax.swing.SwingConstants;
|
||||
import javax.swing.SwingUtilities;
|
||||
import javax.swing.border.EmptyBorder;
|
||||
|
||||
import forge.Singletons;
|
||||
import forge.gui.framework.EDocID;
|
||||
import forge.UiCommand;
|
||||
import forge.gui.framework.ICDoc;
|
||||
import forge.model.FModel;
|
||||
import forge.quest.QuestController;
|
||||
@@ -10,21 +24,12 @@ import forge.quest.QuestEventChallenge;
|
||||
import forge.quest.QuestUtil;
|
||||
import forge.quest.bazaar.QuestItemType;
|
||||
import forge.quest.bazaar.QuestPetController;
|
||||
import forge.screens.home.CHomeUI;
|
||||
import forge.toolbox.FLabel;
|
||||
import forge.toolbox.JXButtonPanel;
|
||||
|
||||
import javax.swing.*;
|
||||
import javax.swing.border.EmptyBorder;
|
||||
|
||||
import java.awt.*;
|
||||
import java.awt.event.*;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
/**
|
||||
* Controls the quest challenges submenu in the home UI.
|
||||
*
|
||||
*
|
||||
* <br><br><i>(C at beginning of class name denotes a control class.)</i>
|
||||
*
|
||||
*/
|
||||
@@ -62,9 +67,9 @@ public enum CSubmenuChallenges implements ICDoc {
|
||||
|
||||
view.getBtnStart().addActionListener(
|
||||
new ActionListener() { @Override
|
||||
public void actionPerformed(final ActionEvent e) { QuestUtil.startGame(); } });
|
||||
public void actionPerformed(final ActionEvent e) { QuestUtil.startGame(); } });
|
||||
|
||||
((FLabel) view.getLblZep()).setCommand(
|
||||
view.getLblZep().setCommand(
|
||||
new UiCommand() {
|
||||
@Override
|
||||
public void run() {
|
||||
@@ -80,7 +85,7 @@ public enum CSubmenuChallenges implements ICDoc {
|
||||
final QuestController quest = FModel.getQuest();
|
||||
view.getCbPlant().addActionListener(new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent arg0) {
|
||||
public void actionPerformed(final ActionEvent arg0) {
|
||||
quest.selectPet(0, view.getCbPlant().isSelected() ? "Plant" : null);
|
||||
quest.save();
|
||||
}
|
||||
@@ -88,28 +93,28 @@ public enum CSubmenuChallenges implements ICDoc {
|
||||
|
||||
view.getCbxPet().addActionListener(new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent arg0) {
|
||||
public void actionPerformed(final ActionEvent arg0) {
|
||||
final int slot = 1;
|
||||
final int index = view.getCbxPet().getSelectedIndex();
|
||||
List<QuestPetController> pets = quest.getPetsStorage().getAvaliablePets(slot, quest.getAssets());
|
||||
String petName = index <= 0 || index > pets.size() ? null : pets.get(index - 1).getName();
|
||||
final List<QuestPetController> pets = quest.getPetsStorage().getAvaliablePets(slot, quest.getAssets());
|
||||
final String petName = index <= 0 || index > pets.size() ? null : pets.get(index - 1).getName();
|
||||
quest.selectPet(slot, petName);
|
||||
quest.save();
|
||||
}
|
||||
});
|
||||
|
||||
view.getCbCharm().addActionListener(new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent arg0) {
|
||||
quest.setCharmState(view.getCbCharm().isSelected());
|
||||
quest.save();
|
||||
}
|
||||
@Override
|
||||
public void actionPerformed(final ActionEvent arg0) {
|
||||
quest.setCharmState(view.getCbCharm().isSelected());
|
||||
quest.save();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private final KeyAdapter _startOnEnter = new KeyAdapter() {
|
||||
@Override
|
||||
public void keyPressed(KeyEvent e) {
|
||||
public void keyPressed(final KeyEvent e) {
|
||||
if (KeyEvent.VK_ENTER == e.getKeyChar()) {
|
||||
VSubmenuChallenges.SINGLETON_INSTANCE.getBtnStart().doClick();
|
||||
}
|
||||
@@ -117,7 +122,7 @@ public enum CSubmenuChallenges implements ICDoc {
|
||||
};
|
||||
private final MouseAdapter _startOnDblClick = new MouseAdapter() {
|
||||
@Override
|
||||
public void mouseClicked(MouseEvent e) {
|
||||
public void mouseClicked(final MouseEvent e) {
|
||||
if (MouseEvent.BUTTON1 == e.getButton() && 2 == e.getClickCount()) {
|
||||
VSubmenuChallenges.SINGLETON_INSTANCE.getBtnStart().doClick();
|
||||
}
|
||||
@@ -134,21 +139,23 @@ public enum CSubmenuChallenges implements ICDoc {
|
||||
final VSubmenuChallenges view = VSubmenuChallenges.SINGLETON_INSTANCE;
|
||||
final QuestController qCtrl = FModel.getQuest();
|
||||
|
||||
if (qCtrl.getAchievements() == null) return;
|
||||
if (qCtrl.getAchievements() == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
view.getLblTitle().setText("Challenges: " + qCtrl.getRank());
|
||||
|
||||
view.getPnlChallenges().removeAll();
|
||||
qCtrl.regenerateChallenges();
|
||||
final List<QuestEventChallenge> challenges = new ArrayList<QuestEventChallenge>();
|
||||
for(Object id : qCtrl.getAchievements().getCurrentChallenges()) {
|
||||
for(final Object id : qCtrl.getAchievements().getCurrentChallenges()) {
|
||||
challenges.add(qCtrl.getChallenges().get(id.toString()));
|
||||
}
|
||||
|
||||
JXButtonPanel grpPanel = new JXButtonPanel();
|
||||
final JXButtonPanel grpPanel = new JXButtonPanel();
|
||||
|
||||
boolean haveAnyChallenges = true;
|
||||
for (QuestEventChallenge qc : challenges) {
|
||||
for (final QuestEventChallenge qc : challenges) {
|
||||
final PnlEvent temp = new PnlEvent(qc);
|
||||
final JRadioButton rad = temp.getRad();
|
||||
if (haveAnyChallenges) {
|
||||
@@ -166,8 +173,8 @@ public enum CSubmenuChallenges implements ICDoc {
|
||||
|
||||
if (!haveAnyChallenges) {
|
||||
final FLabel lbl = new FLabel.Builder()
|
||||
.text(VSubmenuChallenges.SINGLETON_INSTANCE.getLblNextChallengeInWins().getText())
|
||||
.fontAlign(SwingConstants.CENTER).build();
|
||||
.text(VSubmenuChallenges.SINGLETON_INSTANCE.getLblNextChallengeInWins().getText())
|
||||
.fontAlign(SwingConstants.CENTER).build();
|
||||
lbl.setForeground(Color.red);
|
||||
lbl.setBackground(Color.white);
|
||||
lbl.setBorder(new EmptyBorder(10, 10, 10, 10));
|
||||
@@ -182,20 +189,4 @@ public enum CSubmenuChallenges implements ICDoc {
|
||||
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.framework.ICDoc#getCommandOnSelect()
|
||||
*/
|
||||
@SuppressWarnings("serial")
|
||||
@Override
|
||||
public UiCommand getCommandOnSelect() {
|
||||
final QuestController qc = FModel.getQuest();
|
||||
return new UiCommand() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (qc.getAchievements() == null) {
|
||||
CHomeUI.SINGLETON_INSTANCE.itemClick(EDocID.HOME_QUESTDATA);
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,24 +1,28 @@
|
||||
package forge.screens.home.quest;
|
||||
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.awt.event.KeyAdapter;
|
||||
import java.awt.event.KeyEvent;
|
||||
import java.awt.event.MouseAdapter;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.util.List;
|
||||
|
||||
import javax.swing.JRadioButton;
|
||||
import javax.swing.SwingUtilities;
|
||||
|
||||
import forge.UiCommand;
|
||||
import forge.gui.framework.EDocID;
|
||||
import forge.gui.framework.ICDoc;
|
||||
import forge.model.FModel;
|
||||
import forge.quest.QuestController;
|
||||
import forge.quest.QuestEventDuel;
|
||||
import forge.quest.QuestUtil;
|
||||
import forge.quest.bazaar.QuestPetController;
|
||||
import forge.screens.home.CHomeUI;
|
||||
import forge.toolbox.JXButtonPanel;
|
||||
|
||||
import javax.swing.*;
|
||||
|
||||
import java.awt.event.*;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
/**
|
||||
* Controls the quest duels submenu in the home UI.
|
||||
*
|
||||
*
|
||||
* <br><br><i>(C at beginning of class name denotes a control class.)</i>
|
||||
*
|
||||
*/
|
||||
@@ -56,12 +60,12 @@ public enum CSubmenuDuels implements ICDoc {
|
||||
|
||||
view.getBtnStart().addActionListener(
|
||||
new ActionListener() { @Override
|
||||
public void actionPerformed(final ActionEvent e) { QuestUtil.startGame(); } });
|
||||
public void actionPerformed(final ActionEvent e) { QuestUtil.startGame(); } });
|
||||
|
||||
final QuestController quest = FModel.getQuest();
|
||||
view.getCbPlant().addActionListener(new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent arg0) {
|
||||
public void actionPerformed(final ActionEvent arg0) {
|
||||
quest.selectPet(0, view.getCbPlant().isSelected() ? "Plant" : null);
|
||||
quest.save();
|
||||
}
|
||||
@@ -69,7 +73,7 @@ public enum CSubmenuDuels implements ICDoc {
|
||||
|
||||
view.getCbCharm().addActionListener(new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent arg0) {
|
||||
public void actionPerformed(final ActionEvent arg0) {
|
||||
quest.setCharmState(view.getCbCharm().isSelected());
|
||||
quest.save();
|
||||
}
|
||||
@@ -77,11 +81,11 @@ public enum CSubmenuDuels implements ICDoc {
|
||||
|
||||
view.getCbxPet().addActionListener(new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent arg0) {
|
||||
public void actionPerformed(final ActionEvent arg0) {
|
||||
final int slot = 1;
|
||||
final int index = view.getCbxPet().getSelectedIndex();
|
||||
List<QuestPetController> pets = quest.getPetsStorage().getAvaliablePets(slot, quest.getAssets());
|
||||
String petName = index <= 0 || index > pets.size() ? null : pets.get(index - 1).getName();
|
||||
final List<QuestPetController> pets = quest.getPetsStorage().getAvaliablePets(slot, quest.getAssets());
|
||||
final String petName = index <= 0 || index > pets.size() ? null : pets.get(index - 1).getName();
|
||||
quest.selectPet(slot, petName);
|
||||
quest.save();
|
||||
}
|
||||
@@ -89,7 +93,7 @@ public enum CSubmenuDuels implements ICDoc {
|
||||
|
||||
view.getBtnRandomOpponent().setCommand(new UiCommand() {
|
||||
@Override
|
||||
public void run() {
|
||||
public void run() {
|
||||
if (QuestUtil.canStartGame()) {
|
||||
FModel.getQuest().getDuelsManager().randomizeOpponents();
|
||||
final List<QuestEventDuel> duels = FModel.getQuest().getDuelsManager().generateDuels();
|
||||
@@ -98,12 +102,12 @@ public enum CSubmenuDuels implements ICDoc {
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
}
|
||||
|
||||
private final KeyAdapter _startOnEnter = new KeyAdapter() {
|
||||
@Override
|
||||
public void keyPressed(KeyEvent e) {
|
||||
public void keyPressed(final KeyEvent e) {
|
||||
if (KeyEvent.VK_ENTER == e.getKeyChar()) {
|
||||
VSubmenuDuels.SINGLETON_INSTANCE.getBtnStart().doClick();
|
||||
}
|
||||
@@ -111,7 +115,7 @@ public enum CSubmenuDuels implements ICDoc {
|
||||
};
|
||||
private final MouseAdapter _startOnDblClick = new MouseAdapter() {
|
||||
@Override
|
||||
public void mouseClicked(MouseEvent e) {
|
||||
public void mouseClicked(final MouseEvent e) {
|
||||
if (MouseEvent.BUTTON1 == e.getButton() && 2 == e.getClickCount()) {
|
||||
VSubmenuDuels.SINGLETON_INSTANCE.getBtnStart().doClick();
|
||||
}
|
||||
@@ -133,7 +137,7 @@ public enum CSubmenuDuels implements ICDoc {
|
||||
view.getPnlDuels().removeAll();
|
||||
final List<QuestEventDuel> duels = FModel.getQuest().getDuelsManager().generateDuels();
|
||||
|
||||
JXButtonPanel grpPanel = new JXButtonPanel();
|
||||
final JXButtonPanel grpPanel = new JXButtonPanel();
|
||||
|
||||
for (int i = 0; i < duels.size(); i++) {
|
||||
final PnlEvent temp = new PnlEvent(duels.get(i));
|
||||
@@ -152,20 +156,4 @@ public enum CSubmenuDuels implements ICDoc {
|
||||
}
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.framework.ICDoc#getCommandOnSelect()
|
||||
*/
|
||||
@SuppressWarnings("serial")
|
||||
@Override
|
||||
public UiCommand getCommandOnSelect() {
|
||||
final QuestController qc = FModel.getQuest();
|
||||
return new UiCommand() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (qc.getAchievements() == null) {
|
||||
CHomeUI.SINGLETON_INSTANCE.itemClick(EDocID.HOME_QUESTDATA);
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,17 @@
|
||||
package forge.screens.home.quest;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FilenameFilter;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.Set;
|
||||
|
||||
import javax.swing.SwingUtilities;
|
||||
|
||||
import forge.UiCommand;
|
||||
import forge.deck.Deck;
|
||||
import forge.deck.DeckSection;
|
||||
@@ -8,29 +20,26 @@ import forge.gui.framework.ICDoc;
|
||||
import forge.item.PaperCard;
|
||||
import forge.model.FModel;
|
||||
import forge.properties.ForgeConstants;
|
||||
import forge.quest.*;
|
||||
import forge.quest.QuestController;
|
||||
import forge.quest.QuestMode;
|
||||
import forge.quest.QuestUtil;
|
||||
import forge.quest.QuestWorld;
|
||||
import forge.quest.StartingPoolPreferences;
|
||||
import forge.quest.StartingPoolType;
|
||||
import forge.quest.data.GameFormatQuest;
|
||||
import forge.quest.data.QuestData;
|
||||
import forge.quest.data.QuestPreferences.QPref;
|
||||
import forge.quest.io.QuestDataIO;
|
||||
import forge.toolbox.FOptionPane;
|
||||
|
||||
import javax.swing.*;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FilenameFilter;
|
||||
import java.util.*;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
/**
|
||||
/**
|
||||
* Controls the quest data submenu in the home UI.
|
||||
*
|
||||
*
|
||||
* <br><br><i>(C at beginning of class name denotes a control class.)</i>
|
||||
*
|
||||
*/
|
||||
@SuppressWarnings("serial")
|
||||
public enum CSubmenuQuestData implements ICDoc {
|
||||
/** */
|
||||
SINGLETON_INSTANCE;
|
||||
|
||||
private final Map<String, QuestData> arrQuests = new HashMap<String, QuestData>();
|
||||
@@ -39,11 +48,16 @@ public enum CSubmenuQuestData implements ICDoc {
|
||||
private final List<String> customFormatCodes = new ArrayList<String>();
|
||||
private final List<String> customPrizeFormatCodes = new ArrayList<String>();
|
||||
|
||||
private final UiCommand cmdQuestSelect = new UiCommand() { @Override
|
||||
public void run() { changeQuest(); } };
|
||||
|
||||
private final UiCommand cmdQuestUpdate = new UiCommand() { @Override
|
||||
public void run() { update(); } };
|
||||
private final UiCommand cmdQuestSelect = new UiCommand() {
|
||||
@Override public final void run() {
|
||||
changeQuest();
|
||||
}
|
||||
};
|
||||
private final UiCommand cmdQuestUpdate = new UiCommand() {
|
||||
@Override public final void run() {
|
||||
update();
|
||||
}
|
||||
};
|
||||
|
||||
@Override
|
||||
public void register() {
|
||||
@@ -99,15 +113,15 @@ public enum CSubmenuQuestData implements ICDoc {
|
||||
final QuestController qc = FModel.getQuest();
|
||||
|
||||
// Iterate over files and load quest data for each.
|
||||
FilenameFilter takeDatFiles = new FilenameFilter() {
|
||||
final FilenameFilter takeDatFiles = new FilenameFilter() {
|
||||
@Override
|
||||
public boolean accept(final File dir, final String name) {
|
||||
return name.endsWith(".dat");
|
||||
}
|
||||
};
|
||||
File[] arrFiles = dirQuests.listFiles(takeDatFiles);
|
||||
final File[] arrFiles = dirQuests.listFiles(takeDatFiles);
|
||||
arrQuests.clear();
|
||||
for (File f : arrFiles) {
|
||||
for (final File f : arrFiles) {
|
||||
arrQuests.put(f.getName(), QuestDataIO.loadData(f));
|
||||
}
|
||||
|
||||
@@ -147,15 +161,15 @@ public enum CSubmenuQuestData implements ICDoc {
|
||||
*/
|
||||
private void newQuest() {
|
||||
final VSubmenuQuestData view = VSubmenuQuestData.SINGLETON_INSTANCE;
|
||||
int difficulty = view.getSelectedDifficulty();
|
||||
final int difficulty = view.getSelectedDifficulty();
|
||||
|
||||
final QuestMode mode = view.isFantasy() ? QuestMode.Fantasy : QuestMode.Classic;
|
||||
|
||||
Deck dckStartPool = null;
|
||||
GameFormat fmtStartPool = null;
|
||||
QuestWorld startWorld = FModel.getWorlds().get(view.getStartingWorldName());
|
||||
final QuestWorld startWorld = FModel.getWorlds().get(view.getStartingWorldName());
|
||||
|
||||
GameFormat worldFormat = (startWorld == null ? null : startWorld.getFormat());
|
||||
final GameFormat worldFormat = (startWorld == null ? null : startWorld.getFormat());
|
||||
|
||||
if (worldFormat == null) {
|
||||
switch(view.getStartingPoolType()) {
|
||||
@@ -200,16 +214,16 @@ public enum CSubmenuQuestData implements ICDoc {
|
||||
|
||||
// The starting QuestWorld format should NOT affect what you get if you travel to a world that doesn't have one...
|
||||
// if (worldFormat == null) {
|
||||
StartingPoolType prizedPoolType = view.getPrizedPoolType();
|
||||
final StartingPoolType prizedPoolType = view.getPrizedPoolType();
|
||||
if (null == prizedPoolType) {
|
||||
fmtPrizes = fmtStartPool;
|
||||
if (null == fmtPrizes && dckStartPool != null) { // build it form deck
|
||||
Set<String> sets = new HashSet<String>();
|
||||
for (Entry<PaperCard, Integer> c : dckStartPool.getMain()) {
|
||||
final Set<String> sets = new HashSet<String>();
|
||||
for (final Entry<PaperCard, Integer> c : dckStartPool.getMain()) {
|
||||
sets.add(c.getKey().getEdition());
|
||||
}
|
||||
if (dckStartPool.has(DeckSection.Sideboard)) {
|
||||
for (Entry<PaperCard, Integer> c : dckStartPool.get(DeckSection.Sideboard)) {
|
||||
for (final Entry<PaperCard, Integer> c : dckStartPool.get(DeckSection.Sideboard)) {
|
||||
sets.add(c.getKey().getEdition());
|
||||
}
|
||||
}
|
||||
@@ -258,8 +272,8 @@ public enum CSubmenuQuestData implements ICDoc {
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
QuestController qc = FModel.getQuest();
|
||||
|
||||
final QuestController qc = FModel.getQuest();
|
||||
|
||||
qc.newGame(questName, difficulty, mode, fmtPrizes, view.isUnlockSetsAllowed(), dckStartPool, fmtStartPool, view.getStartingWorldName(), userPrefs);
|
||||
FModel.getQuest().save();
|
||||
@@ -294,11 +308,4 @@ public enum CSubmenuQuestData implements ICDoc {
|
||||
return arrQuests;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.framework.ICDoc#getCommandOnSelect()
|
||||
*/
|
||||
@Override
|
||||
public UiCommand getCommandOnSelect() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,7 +5,6 @@ import javax.swing.SwingUtilities;
|
||||
import forge.Singletons;
|
||||
import forge.UiCommand;
|
||||
import forge.deck.DeckProxy;
|
||||
import forge.gui.framework.EDocID;
|
||||
import forge.gui.framework.FScreen;
|
||||
import forge.gui.framework.ICDoc;
|
||||
import forge.itemmanager.ItemManagerConfig;
|
||||
@@ -15,11 +14,10 @@ import forge.quest.QuestUtil;
|
||||
import forge.quest.data.QuestPreferences.QPref;
|
||||
import forge.screens.deckeditor.CDeckEditorUI;
|
||||
import forge.screens.deckeditor.controllers.CEditorQuest;
|
||||
import forge.screens.home.CHomeUI;
|
||||
|
||||
/**
|
||||
/**
|
||||
* Controls the quest decks submenu in the home UI.
|
||||
*
|
||||
*
|
||||
* <br><br><i>(C at beginning of class name denotes a control class.)</i>
|
||||
*/
|
||||
@SuppressWarnings("serial")
|
||||
@@ -30,7 +28,7 @@ public enum CSubmenuQuestDecks implements ICDoc {
|
||||
private final UiCommand cmdDeckSelect = new UiCommand() {
|
||||
@Override
|
||||
public void run() {
|
||||
DeckProxy deck = VSubmenuQuestDecks.SINGLETON_INSTANCE.getLstDecks().getSelectedItem();
|
||||
final DeckProxy deck = VSubmenuQuestDecks.SINGLETON_INSTANCE.getLstDecks().getSelectedItem();
|
||||
if (deck != null) {
|
||||
FModel.getQuestPreferences().setPref(QPref.CURRENT_DECK, deck.toString());
|
||||
}
|
||||
@@ -80,7 +78,7 @@ public enum CSubmenuQuestDecks implements ICDoc {
|
||||
view.getLstDecks().setDeleteCommand(null);
|
||||
|
||||
final QuestController qData = FModel.getQuest();
|
||||
boolean hasQuest = qData.getAssets() != null;
|
||||
final boolean hasQuest = qData.getAssets() != null;
|
||||
// Retrieve and set all decks
|
||||
view.getLstDecks().setPool(DeckProxy.getAllQuestDecks(hasQuest ? qData.getMyDecks() : null));
|
||||
view.getLstDecks().setup(ItemManagerConfig.QUEST_DECKS);
|
||||
@@ -106,19 +104,4 @@ public enum CSubmenuQuestDecks implements ICDoc {
|
||||
});
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.framework.ICDoc#getCommandOnSelect()
|
||||
*/
|
||||
@Override
|
||||
public UiCommand getCommandOnSelect() {
|
||||
final QuestController qc = FModel.getQuest();
|
||||
return new UiCommand() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (qc.getAchievements() == null) {
|
||||
CHomeUI.SINGLETON_INSTANCE.itemClick(EDocID.HOME_QUESTDATA);
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,7 +23,6 @@ import forge.gui.BoxedProductCardListViewer;
|
||||
import forge.gui.CardListChooser;
|
||||
import forge.gui.CardListViewer;
|
||||
import forge.gui.GuiChoose;
|
||||
import forge.gui.framework.EDocID;
|
||||
import forge.gui.framework.FScreen;
|
||||
import forge.gui.framework.ICDoc;
|
||||
import forge.interfaces.IGuiGame;
|
||||
@@ -34,7 +33,6 @@ import forge.limited.BoosterDraft;
|
||||
import forge.model.CardBlock;
|
||||
import forge.model.FModel;
|
||||
import forge.properties.ForgePreferences.FPref;
|
||||
import forge.quest.QuestController;
|
||||
import forge.quest.QuestDraftUtils;
|
||||
import forge.quest.QuestEventDraft;
|
||||
import forge.quest.QuestUtil;
|
||||
@@ -43,7 +41,6 @@ import forge.screens.deckeditor.CDeckEditorUI;
|
||||
import forge.screens.deckeditor.controllers.CEditorQuestDraftingProcess;
|
||||
import forge.screens.deckeditor.controllers.CEditorQuestLimited;
|
||||
import forge.screens.deckeditor.views.VCurrentDeck;
|
||||
import forge.screens.home.CHomeUI;
|
||||
import forge.screens.home.quest.VSubmenuQuestDraft.Mode;
|
||||
import forge.screens.home.sanctioned.CSubmenuDraft;
|
||||
import forge.screens.match.controllers.CDetailPicture;
|
||||
@@ -52,255 +49,259 @@ import forge.toolbox.FSkin;
|
||||
import forge.toolbox.FSkin.SkinImage;
|
||||
import forge.toolbox.JXButtonPanel;
|
||||
|
||||
/**
|
||||
/**
|
||||
* Controls the quest draft submenu in the home UI.
|
||||
*
|
||||
*
|
||||
* <br><br><i>(C at beginning of class name denotes a control class.)</i>
|
||||
*
|
||||
*/
|
||||
public enum CSubmenuQuestDraft implements ICDoc {
|
||||
|
||||
SINGLETON_INSTANCE;
|
||||
|
||||
|
||||
private static final DecimalFormat NUMBER_FORMATTER = new DecimalFormat("#,###");
|
||||
|
||||
|
||||
private boolean drafting = false;
|
||||
private IGuiGame gui = null;
|
||||
|
||||
@Override
|
||||
public void register() {
|
||||
}
|
||||
|
||||
|
||||
@SuppressWarnings("serial")
|
||||
@Override
|
||||
public void initialize() {
|
||||
|
||||
final VSubmenuQuestDraft view = VSubmenuQuestDraft.SINGLETON_INSTANCE;
|
||||
|
||||
|
||||
view.getBtnStartDraft().addActionListener(selectTournamentStart);
|
||||
view.getBtnStartTournament().addActionListener(prepareDeckStart);
|
||||
view.getBtnStartMatch().addActionListener(nextMatchStart);
|
||||
|
||||
view.getBtnStartMatchSmall().setCommand(
|
||||
new UiCommand() { @Override
|
||||
public void run() { CSubmenuQuestDraft.this.startNextMatch(); } });
|
||||
|
||||
view.getBtnSpendToken().setCommand(
|
||||
new UiCommand() { @Override
|
||||
public void run() { CSubmenuQuestDraft.this.spendToken(); } });
|
||||
|
||||
view.getBtnEditDeck().setCommand(
|
||||
new UiCommand() { @Override
|
||||
public void run() { CSubmenuQuestDraft.this.editDeck(); } });
|
||||
|
||||
view.getBtnLeaveTournament().setCommand(
|
||||
new UiCommand() { @Override
|
||||
public void run() { CSubmenuQuestDraft.this.endTournamentAndAwardPrizes(); } });
|
||||
|
||||
QuestAchievements achievements = FModel.getQuest().getAchievements();
|
||||
|
||||
view.getBtnStartMatchSmall().setCommand(new UiCommand() {
|
||||
@Override public void run() {
|
||||
CSubmenuQuestDraft.this.startNextMatch();
|
||||
}
|
||||
});
|
||||
view.getBtnSpendToken().setCommand(new UiCommand() {
|
||||
@Override public void run() {
|
||||
CSubmenuQuestDraft.this.spendToken();
|
||||
}
|
||||
});
|
||||
view.getBtnEditDeck().setCommand(new UiCommand() {
|
||||
@Override public void run() {
|
||||
CSubmenuQuestDraft.this.editDeck();
|
||||
}
|
||||
});
|
||||
view.getBtnLeaveTournament().setCommand(new UiCommand() {
|
||||
@Override public void run() {
|
||||
CSubmenuQuestDraft.this.endTournamentAndAwardPrizes();
|
||||
}
|
||||
});
|
||||
|
||||
final QuestAchievements achievements = FModel.getQuest().getAchievements();
|
||||
FModel.getQuest().getDraftDecks();
|
||||
|
||||
|
||||
if (achievements == null) {
|
||||
|
||||
|
||||
view.setMode(Mode.EMPTY);
|
||||
|
||||
|
||||
} else if (achievements.getDraftEvents() == null || achievements.getDraftEvents().isEmpty()) {
|
||||
|
||||
|
||||
achievements.generateDrafts();
|
||||
|
||||
|
||||
if (achievements.getDraftEvents().isEmpty()) {
|
||||
view.setMode(Mode.EMPTY);
|
||||
} else {
|
||||
view.setMode(Mode.SELECT_TOURNAMENT);
|
||||
}
|
||||
|
||||
|
||||
} else if (FModel.getQuest().getDraftDecks() == null || !FModel.getQuest().getDraftDecks().contains(QuestEventDraft.DECK_NAME)) {
|
||||
|
||||
achievements.generateDrafts();
|
||||
achievements.generateDrafts();
|
||||
view.setMode(Mode.SELECT_TOURNAMENT);
|
||||
|
||||
|
||||
} else if (!achievements.getCurrentDraft().isStarted()) {
|
||||
|
||||
|
||||
view.setMode(Mode.PREPARE_DECK);
|
||||
|
||||
|
||||
} else {
|
||||
|
||||
|
||||
view.setMode(Mode.TOURNAMENT_ACTIVE);
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
private void endTournamentAndAwardPrizes() {
|
||||
QuestEventDraft draft = FModel.getQuest().getAchievements().getCurrentDraft();
|
||||
|
||||
final QuestEventDraft draft = FModel.getQuest().getAchievements().getCurrentDraft();
|
||||
|
||||
if (!draft.isStarted()) {
|
||||
|
||||
boolean shouldQuit = FOptionPane.showOptionDialog("If you leave now, this tournament will be forever gone."
|
||||
|
||||
final boolean shouldQuit = FOptionPane.showOptionDialog("If you leave now, this tournament will be forever gone."
|
||||
+ "\nYou will keep the cards you drafted, but will receive no other prizes."
|
||||
+ "\n\nWould you still like to quit the tournament?", "Really Quit?", FSkin.getImage(FSkinProp.ICO_WARNING).scale(2.0), new String[] { "Yes", "No" }, 1) == 0;
|
||||
if (!shouldQuit) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
} else {
|
||||
|
||||
|
||||
if (draft.playerHasMatchesLeft()) {
|
||||
boolean shouldQuit = FOptionPane.showOptionDialog("You have matches left to play!\nLeaving the tournament early will forfeit your potential future winnings."
|
||||
final boolean shouldQuit = FOptionPane.showOptionDialog("You have matches left to play!\nLeaving the tournament early will forfeit your potential future winnings."
|
||||
+ "\nYou will still receive winnings as if you conceded your next match and you will keep the cards you drafted."
|
||||
+ "\n\nWould you still like to quit the tournament?", "Really Quit?", FSkin.getImage(FSkinProp.ICO_WARNING).scale(2.0), new String[] { "Yes", "No" }, 1) == 0;
|
||||
if (!shouldQuit) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
String placement = draft.getPlacementString();
|
||||
|
||||
QuestEventDraft.QuestDraftPrizes prizes = draft.collectPrizes();
|
||||
|
||||
|
||||
final String placement = draft.getPlacementString();
|
||||
|
||||
final QuestEventDraft.QuestDraftPrizes prizes = draft.collectPrizes();
|
||||
|
||||
if (prizes.hasCredits()) {
|
||||
FOptionPane.showMessageDialog("For placing " + placement + ", you have been awarded " + prizes.credits + " credits!", "Credits Awarded", FSkin.getImage(FSkinProp.ICO_QUEST_GOLD));
|
||||
}
|
||||
|
||||
|
||||
if (prizes.hasIndividualCards()) {
|
||||
final CardListViewer c = new CardListViewer("Tournament Reward", "For participating in the tournament, you have been awarded the following promotional card:", prizes.individualCards);
|
||||
c.setVisible(true);
|
||||
c.dispose();
|
||||
final CardListViewer c = new CardListViewer("Tournament Reward", "For participating in the tournament, you have been awarded the following promotional card:", prizes.individualCards);
|
||||
c.setVisible(true);
|
||||
c.dispose();
|
||||
}
|
||||
|
||||
|
||||
if (prizes.hasBoosterPacks()) {
|
||||
|
||||
String packPlural = (prizes.boosterPacks.size() == 1) ? "" : "s";
|
||||
|
||||
FOptionPane.showMessageDialog("For placing " + placement + ", you have been awarded " + prizes.boosterPacks.size() + " booster pack" + packPlural + "!", "Booster Pack" + packPlural + " Awarded", FSkin.getImage(FSkinProp.ICO_QUEST_BOX));
|
||||
|
||||
if (FModel.getPreferences().getPrefBoolean(FPref.UI_OPEN_PACKS_INDIV) && prizes.boosterPacks.size() > 1) {
|
||||
|
||||
boolean skipTheRest = false;
|
||||
List<PaperCard> remainingCards = new ArrayList<>();
|
||||
int totalPacks = prizes.boosterPacks.size();
|
||||
int currentPack = 0;
|
||||
|
||||
while (prizes.boosterPacks.size() > 0) {
|
||||
|
||||
BoosterPack pack = prizes.boosterPacks.remove(0);
|
||||
currentPack++;
|
||||
|
||||
if (skipTheRest) {
|
||||
remainingCards.addAll(pack.getCards());
|
||||
continue;
|
||||
}
|
||||
|
||||
final BoxedProductCardListViewer c = new BoxedProductCardListViewer(pack.getName(), "You have found the following cards inside (Booster Pack " + currentPack + " of " + totalPacks + "):", pack.getCards());
|
||||
c.setVisible(true);
|
||||
c.dispose();
|
||||
skipTheRest = c.skipTheRest();
|
||||
|
||||
}
|
||||
|
||||
if (skipTheRest && !remainingCards.isEmpty()) {
|
||||
final CardListViewer c = new CardListViewer("Tournament Reward", "You have found the following cards inside:", remainingCards);
|
||||
c.setVisible(true);
|
||||
c.dispose();
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
List<PaperCard> cards = new ArrayList<>();
|
||||
|
||||
while (prizes.boosterPacks.size() > 0) {
|
||||
BoosterPack pack = prizes.boosterPacks.remove(0);
|
||||
cards.addAll(pack.getCards());
|
||||
}
|
||||
|
||||
final CardListViewer c = new CardListViewer("Tournament Reward", "You have found the following cards inside:", cards);
|
||||
c.setVisible(true);
|
||||
c.dispose();
|
||||
|
||||
}
|
||||
|
||||
|
||||
final String packPlural = (prizes.boosterPacks.size() == 1) ? "" : "s";
|
||||
|
||||
FOptionPane.showMessageDialog("For placing " + placement + ", you have been awarded " + prizes.boosterPacks.size() + " booster pack" + packPlural + "!", "Booster Pack" + packPlural + " Awarded", FSkin.getImage(FSkinProp.ICO_QUEST_BOX));
|
||||
|
||||
if (FModel.getPreferences().getPrefBoolean(FPref.UI_OPEN_PACKS_INDIV) && prizes.boosterPacks.size() > 1) {
|
||||
|
||||
boolean skipTheRest = false;
|
||||
final List<PaperCard> remainingCards = new ArrayList<>();
|
||||
final int totalPacks = prizes.boosterPacks.size();
|
||||
int currentPack = 0;
|
||||
|
||||
while (prizes.boosterPacks.size() > 0) {
|
||||
|
||||
final BoosterPack pack = prizes.boosterPacks.remove(0);
|
||||
currentPack++;
|
||||
|
||||
if (skipTheRest) {
|
||||
remainingCards.addAll(pack.getCards());
|
||||
continue;
|
||||
}
|
||||
|
||||
final BoxedProductCardListViewer c = new BoxedProductCardListViewer(pack.getName(), "You have found the following cards inside (Booster Pack " + currentPack + " of " + totalPacks + "):", pack.getCards());
|
||||
c.setVisible(true);
|
||||
c.dispose();
|
||||
skipTheRest = c.skipTheRest();
|
||||
|
||||
}
|
||||
|
||||
if (skipTheRest && !remainingCards.isEmpty()) {
|
||||
final CardListViewer c = new CardListViewer("Tournament Reward", "You have found the following cards inside:", remainingCards);
|
||||
c.setVisible(true);
|
||||
c.dispose();
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
final List<PaperCard> cards = new ArrayList<>();
|
||||
|
||||
while (prizes.boosterPacks.size() > 0) {
|
||||
final BoosterPack pack = prizes.boosterPacks.remove(0);
|
||||
cards.addAll(pack.getCards());
|
||||
}
|
||||
|
||||
final CardListViewer c = new CardListViewer("Tournament Reward", "You have found the following cards inside:", cards);
|
||||
c.setVisible(true);
|
||||
c.dispose();
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
if (prizes.selectRareFromSets()) {
|
||||
|
||||
|
||||
FOptionPane.showMessageDialog("For placing " + placement + ", you may select a rare or mythic rare card from the drafted block.", "Rare Awarded", FSkin.getImage(FSkinProp.ICO_QUEST_STAKES));
|
||||
|
||||
CardListChooser cardListChooser = new CardListChooser("Select a Card", "Select a card to keep:", prizes.selectRareCards);
|
||||
final CardListChooser cardListChooser = new CardListChooser("Select a Card", "Select a card to keep:", prizes.selectRareCards);
|
||||
cardListChooser.setVisible(true);
|
||||
cardListChooser.dispose();
|
||||
prizes.addSelectedCard(cardListChooser.getSelectedCard());
|
||||
|
||||
|
||||
FOptionPane.showMessageDialog("'" + cardListChooser.getSelectedCard().getName() + "' has been added to your collection!", "Card Added", FSkin.getImage(FSkinProp.ICO_QUEST_STAKES));
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
if (draft.getPlayerPlacement() == 1) {
|
||||
FOptionPane.showMessageDialog("For placing " + placement + ", you have been awarded a token!\nUse tokens to create new drafts to play.", "Bonus Token", FSkin.getImage(FSkinProp.ICO_QUEST_NOTES));
|
||||
FModel.getQuest().getAchievements().addDraftToken();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
boolean saveDraft = FOptionPane.showOptionDialog("Would you like to save this draft to the regular draft mode?", "Save Draft?", FSkin.getImage(FSkinProp.ICO_QUESTION).scale(2.0), new String[] { "Yes", "No" }, 0) == 0;
|
||||
|
||||
|
||||
final boolean saveDraft = FOptionPane.showOptionDialog("Would you like to save this draft to the regular draft mode?", "Save Draft?", FSkin.getImage(FSkinProp.ICO_QUESTION).scale(2.0), new String[] { "Yes", "No" }, 0) == 0;
|
||||
|
||||
if (saveDraft) {
|
||||
draft.saveToRegularDraft();
|
||||
CSubmenuDraft.SINGLETON_INSTANCE.update();
|
||||
}
|
||||
|
||||
|
||||
draft.addToQuestDecks();
|
||||
|
||||
VSubmenuQuestDraft view = VSubmenuQuestDraft.SINGLETON_INSTANCE;
|
||||
|
||||
final VSubmenuQuestDraft view = VSubmenuQuestDraft.SINGLETON_INSTANCE;
|
||||
CSubmenuQuestDraft.SINGLETON_INSTANCE.update();
|
||||
view.populate();
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
private final ActionListener selectTournamentStart = new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent event) {
|
||||
public void actionPerformed(final ActionEvent event) {
|
||||
CSubmenuQuestDraft.this.startDraft();
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
private final ActionListener prepareDeckStart = new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent event) {
|
||||
public void actionPerformed(final ActionEvent event) {
|
||||
CSubmenuQuestDraft.this.startTournament();
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
private final ActionListener nextMatchStart = new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent event) {
|
||||
public void actionPerformed(final ActionEvent event) {
|
||||
CSubmenuQuestDraft.this.startNextMatch();
|
||||
}
|
||||
};
|
||||
|
||||
private final KeyAdapter startOnEnter = new KeyAdapter() {
|
||||
@Override
|
||||
public void keyPressed(KeyEvent e) {
|
||||
public void keyPressed(final KeyEvent e) {
|
||||
if (KeyEvent.VK_ENTER == e.getKeyChar()) {
|
||||
VSubmenuQuestDraft.SINGLETON_INSTANCE.getBtnStartDraft().doClick();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
private final MouseAdapter startOnDblClick = new MouseAdapter() {
|
||||
@Override
|
||||
public void mouseClicked(MouseEvent e) {
|
||||
public void mouseClicked(final MouseEvent e) {
|
||||
if (MouseEvent.BUTTON1 == e.getButton() && 2 == e.getClickCount()) {
|
||||
VSubmenuQuestDraft.SINGLETON_INSTANCE.getBtnStartDraft().doClick();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
private void spendToken() {
|
||||
|
||||
QuestAchievements achievements = FModel.getQuest().getAchievements();
|
||||
|
||||
|
||||
final QuestAchievements achievements = FModel.getQuest().getAchievements();
|
||||
|
||||
if (achievements != null) {
|
||||
|
||||
final CardBlock block = GuiChoose.oneOrNone("Choose Draft Format", QuestEventDraft.getAvailableBlocks(FModel.getQuest()));
|
||||
@@ -313,82 +314,82 @@ public enum CSubmenuQuestDraft implements ICDoc {
|
||||
VSubmenuQuestDraft.SINGLETON_INSTANCE.populate();
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void update() {
|
||||
|
||||
VSubmenuQuestDraft view = VSubmenuQuestDraft.SINGLETON_INSTANCE;
|
||||
|
||||
|
||||
final VSubmenuQuestDraft view = VSubmenuQuestDraft.SINGLETON_INSTANCE;
|
||||
|
||||
if (FModel.getQuest().getAchievements() == null) {
|
||||
view.setMode(Mode.EMPTY);
|
||||
return;
|
||||
}
|
||||
|
||||
QuestAchievements achievements = FModel.getQuest().getAchievements();
|
||||
|
||||
final QuestAchievements achievements = FModel.getQuest().getAchievements();
|
||||
achievements.generateDrafts();
|
||||
|
||||
|
||||
if (FModel.getQuest().getAchievements().getDraftEvents().isEmpty()) {
|
||||
view.setMode(Mode.EMPTY);
|
||||
updatePlacementLabelsText();
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if ((FModel.getQuest().getDraftDecks() == null
|
||||
|| !FModel.getQuest().getDraftDecks().contains(QuestEventDraft.DECK_NAME)
|
||||
|| FModel.getQuest().getAchievements().getCurrentDraftIndex() == -1)) {
|
||||
|| !FModel.getQuest().getDraftDecks().contains(QuestEventDraft.DECK_NAME)
|
||||
|| FModel.getQuest().getAchievements().getCurrentDraftIndex() == -1)) {
|
||||
view.setMode(Mode.SELECT_TOURNAMENT);
|
||||
} else if (!FModel.getQuest().getAchievements().getCurrentDraft().isStarted()) {
|
||||
view.setMode(Mode.PREPARE_DECK);
|
||||
} else {
|
||||
view.setMode(Mode.TOURNAMENT_ACTIVE);
|
||||
}
|
||||
|
||||
|
||||
QuestDraftUtils.update(gui);
|
||||
|
||||
|
||||
switch (view.getMode()) {
|
||||
|
||||
case SELECT_TOURNAMENT:
|
||||
updateSelectTournament();
|
||||
break;
|
||||
|
||||
case PREPARE_DECK:
|
||||
updatePrepareDeck();
|
||||
break;
|
||||
|
||||
case TOURNAMENT_ACTIVE:
|
||||
updateTournamentActive();
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
|
||||
|
||||
case SELECT_TOURNAMENT:
|
||||
updateSelectTournament();
|
||||
break;
|
||||
|
||||
case PREPARE_DECK:
|
||||
updatePrepareDeck();
|
||||
break;
|
||||
|
||||
case TOURNAMENT_ACTIVE:
|
||||
updateTournamentActive();
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
private void updateSelectTournament() {
|
||||
|
||||
VSubmenuQuestDraft view = VSubmenuQuestDraft.SINGLETON_INSTANCE;
|
||||
|
||||
final VSubmenuQuestDraft view = VSubmenuQuestDraft.SINGLETON_INSTANCE;
|
||||
|
||||
view.getLblCredits().setText("Available Credits: " + NUMBER_FORMATTER.format(FModel.getQuest().getAssets().getCredits()));
|
||||
|
||||
QuestAchievements achievements = FModel.getQuest().getAchievements();
|
||||
|
||||
final QuestAchievements achievements = FModel.getQuest().getAchievements();
|
||||
achievements.generateDrafts();
|
||||
|
||||
view.getPnlTournaments().removeAll();
|
||||
JXButtonPanel grpPanel = new JXButtonPanel();
|
||||
|
||||
final JXButtonPanel grpPanel = new JXButtonPanel();
|
||||
|
||||
boolean firstPanel = true;
|
||||
|
||||
for (QuestEventDraft draft : FModel.getQuest().getAchievements().getDraftEvents()) {
|
||||
|
||||
PnlDraftEvent draftPanel = new PnlDraftEvent(draft);
|
||||
|
||||
for (final QuestEventDraft draft : FModel.getQuest().getAchievements().getDraftEvents()) {
|
||||
|
||||
final PnlDraftEvent draftPanel = new PnlDraftEvent(draft);
|
||||
final JRadioButton button = draftPanel.getRadioButton();
|
||||
|
||||
|
||||
if (firstPanel) {
|
||||
button.setSelected(true);
|
||||
SwingUtilities.invokeLater(new Runnable() {
|
||||
@@ -396,112 +397,112 @@ public enum CSubmenuQuestDraft implements ICDoc {
|
||||
});
|
||||
firstPanel = false;
|
||||
}
|
||||
|
||||
|
||||
grpPanel.add(draftPanel, button, "w 100%!, h 135px!, gapy 15px");
|
||||
|
||||
|
||||
button.addKeyListener(startOnEnter);
|
||||
button.addMouseListener(startOnDblClick);
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
view.getPnlTournaments().add(grpPanel, "w 100%!");
|
||||
|
||||
|
||||
updatePlacementLabelsText();
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
private void updatePlacementLabelsText() {
|
||||
|
||||
VSubmenuQuestDraft view = VSubmenuQuestDraft.SINGLETON_INSTANCE;
|
||||
QuestAchievements achievements = FModel.getQuest().getAchievements();
|
||||
|
||||
final VSubmenuQuestDraft view = VSubmenuQuestDraft.SINGLETON_INSTANCE;
|
||||
final QuestAchievements achievements = FModel.getQuest().getAchievements();
|
||||
|
||||
if (view.getMode().equals(Mode.EMPTY)) {
|
||||
view.getPnlTournaments().removeAll();
|
||||
}
|
||||
|
||||
view.getLblFirst().setText("1st Place: " + achievements.getWinsForPlace(1) + " time" + (achievements.getWinsForPlace(1) == 1 ? "" : "s"));
|
||||
view.getLblSecond().setText("2nd Place: " + achievements.getWinsForPlace(2) + " time" + (achievements.getWinsForPlace(2) == 1 ? "" : "s"));
|
||||
view.getLblThird().setText("3rd Place: " + achievements.getWinsForPlace(3) + " time" + (achievements.getWinsForPlace(3) == 1 ? "" : "s"));
|
||||
|
||||
view.getLblFirst().setText("1st Place: " + achievements.getWinsForPlace(1) + " time" + (achievements.getWinsForPlace(1) == 1 ? "" : "s"));
|
||||
view.getLblSecond().setText("2nd Place: " + achievements.getWinsForPlace(2) + " time" + (achievements.getWinsForPlace(2) == 1 ? "" : "s"));
|
||||
view.getLblThird().setText("3rd Place: " + achievements.getWinsForPlace(3) + " time" + (achievements.getWinsForPlace(3) == 1 ? "" : "s"));
|
||||
view.getLblFourth().setText("4th Place: " + achievements.getWinsForPlace(4) + " time" + (achievements.getWinsForPlace(4) == 1 ? "" : "s"));
|
||||
|
||||
|
||||
view.getLblTokens().setText("Tokens: " + achievements.getDraftTokens());
|
||||
view.getBtnSpendToken().setEnabled(achievements.getDraftTokens() > 0);
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
private void updatePrepareDeck() {
|
||||
}
|
||||
|
||||
|
||||
private void updateTournamentActive() {
|
||||
|
||||
VSubmenuQuestDraft view = VSubmenuQuestDraft.SINGLETON_INSTANCE;
|
||||
|
||||
|
||||
final VSubmenuQuestDraft view = VSubmenuQuestDraft.SINGLETON_INSTANCE;
|
||||
|
||||
if (FModel.getQuest().getAchievements().getCurrentDraft() == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
for (int i = 0; i < 15; i++) {
|
||||
|
||||
|
||||
String playerID = FModel.getQuest().getAchievements().getCurrentDraft().getStandings()[i];
|
||||
|
||||
int iconID = 0;
|
||||
|
||||
switch (playerID) {
|
||||
case QuestEventDraft.HUMAN:
|
||||
playerID = FModel.getPreferences().getPref(FPref.PLAYER_NAME);
|
||||
if (FModel.getPreferences().getPref(FPref.UI_AVATARS).split(",").length > 0) {
|
||||
iconID = Integer.parseInt(FModel.getPreferences().getPref(FPref.UI_AVATARS).split(",")[0]);
|
||||
}
|
||||
break;
|
||||
case QuestEventDraft.UNDETERMINED:
|
||||
playerID = "Undetermined";
|
||||
iconID = GuiBase.getInterface().getAvatarCount() - 1;
|
||||
break;
|
||||
default:
|
||||
iconID = FModel.getQuest().getAchievements().getCurrentDraft().getAIIcons()[Integer.parseInt(playerID) - 1];
|
||||
playerID = FModel.getQuest().getAchievements().getCurrentDraft().getAINames()[Integer.parseInt(playerID) - 1];
|
||||
break;
|
||||
case QuestEventDraft.HUMAN:
|
||||
playerID = FModel.getPreferences().getPref(FPref.PLAYER_NAME);
|
||||
if (FModel.getPreferences().getPref(FPref.UI_AVATARS).split(",").length > 0) {
|
||||
iconID = Integer.parseInt(FModel.getPreferences().getPref(FPref.UI_AVATARS).split(",")[0]);
|
||||
}
|
||||
break;
|
||||
case QuestEventDraft.UNDETERMINED:
|
||||
playerID = "Undetermined";
|
||||
iconID = GuiBase.getInterface().getAvatarCount() - 1;
|
||||
break;
|
||||
default:
|
||||
iconID = FModel.getQuest().getAchievements().getCurrentDraft().getAIIcons()[Integer.parseInt(playerID) - 1];
|
||||
playerID = FModel.getQuest().getAchievements().getCurrentDraft().getAINames()[Integer.parseInt(playerID) - 1];
|
||||
break;
|
||||
}
|
||||
|
||||
boolean first = i % 2 == 0;
|
||||
int box = i / 2;
|
||||
|
||||
|
||||
final boolean first = i % 2 == 0;
|
||||
final int box = i / 2;
|
||||
|
||||
SkinImage icon = FSkin.getAvatars().get(iconID);
|
||||
|
||||
|
||||
if (icon == null) {
|
||||
icon = FSkin.getAvatars().get(0);
|
||||
}
|
||||
|
||||
|
||||
if (first) {
|
||||
view.getLblsMatchups()[box].setPlayerOne(playerID, icon);
|
||||
} else {
|
||||
view.getLblsMatchups()[box].setPlayerTwo(playerID, icon);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
if (FModel.getQuest().getAchievements().getCurrentDraft().playerHasMatchesLeft()) {
|
||||
view.getBtnLeaveTournament().setText("Leave Tournament");
|
||||
} else {
|
||||
view.getBtnLeaveTournament().setText("Collect Prizes");
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
public void setCompletedDraft(DeckGroup finishedDraft) {
|
||||
|
||||
QuestDraftUtils.completeDraft(finishedDraft);
|
||||
|
||||
public void setCompletedDraft(final DeckGroup finishedDraft) {
|
||||
|
||||
QuestDraftUtils.completeDraft(finishedDraft);
|
||||
|
||||
Singletons.getControl().setCurrentScreen(FScreen.DECK_EDITOR_QUEST_TOURNAMENT);
|
||||
CDeckEditorUI.SINGLETON_INSTANCE.setEditorController(new CEditorQuestLimited(FModel.getQuest(), CDeckEditorUI.SINGLETON_INSTANCE.getCDetailPicture()));
|
||||
|
||||
|
||||
drafting = false;
|
||||
|
||||
VSubmenuQuestDraft.SINGLETON_INSTANCE.setMode(Mode.PREPARE_DECK);
|
||||
VSubmenuQuestDraft.SINGLETON_INSTANCE.populate();
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
private void editDeck() {
|
||||
final CDetailPicture cDetailPicture = CDeckEditorUI.SINGLETON_INSTANCE.getCDetailPicture();
|
||||
VCurrentDeck.SINGLETON_INSTANCE.setItemManager(new DeckManager(GameType.Draft, cDetailPicture));
|
||||
@@ -509,60 +510,60 @@ public enum CSubmenuQuestDraft implements ICDoc {
|
||||
CDeckEditorUI.SINGLETON_INSTANCE.setEditorController(new CEditorQuestLimited(FModel.getQuest(), cDetailPicture));
|
||||
FModel.getQuest().save();
|
||||
}
|
||||
|
||||
|
||||
private void startDraft() {
|
||||
|
||||
|
||||
if (drafting) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
final QuestEventDraft draftEvent = QuestUtil.getDraftEvent();
|
||||
|
||||
|
||||
final long creditsAvailable = FModel.getQuest().getAssets().getCredits();
|
||||
if (draftEvent.canEnter()) {
|
||||
FOptionPane.showMessageDialog("You need " + NUMBER_FORMATTER.format(draftEvent.getEntryFee() - creditsAvailable) + " more credits to enter this tournament.", "Not Enough Credits", FSkin.getImage(FSkinProp.ICO_WARNING).scale(2.0));
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
final boolean okayToEnter = FOptionPane.showOptionDialog("This tournament costs " + draftEvent.getEntryFee() + " credits to enter.\nAre you sure you wish to enter?", "Enter Draft Tournament?", FSkin.getImage(FSkinProp.ICO_QUEST_GOLD), new String[] { "Yes", "No" }, 1) == 0;
|
||||
|
||||
|
||||
if (!okayToEnter) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
drafting = true;
|
||||
|
||||
final BoosterDraft draft = draftEvent.enter();
|
||||
|
||||
|
||||
final CEditorQuestDraftingProcess draftController = new CEditorQuestDraftingProcess(CDeckEditorUI.SINGLETON_INSTANCE.getCDetailPicture());
|
||||
draftController.showGui(draft);
|
||||
|
||||
draftController.setDraftQuest(CSubmenuQuestDraft.this);
|
||||
|
||||
|
||||
Singletons.getControl().setCurrentScreen(FScreen.DRAFTING_PROCESS);
|
||||
CDeckEditorUI.SINGLETON_INSTANCE.setEditorController(draftController);
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
private void startTournament() {
|
||||
|
||||
|
||||
FModel.getQuest().save();
|
||||
|
||||
String message = GameType.QuestDraft.getDeckFormat().getDeckConformanceProblem(FModel.getQuest().getAssets().getDraftDeckStorage().get(QuestEventDraft.DECK_NAME).getHumanDeck());
|
||||
|
||||
final String message = GameType.QuestDraft.getDeckFormat().getDeckConformanceProblem(FModel.getQuest().getAssets().getDraftDeckStorage().get(QuestEventDraft.DECK_NAME).getHumanDeck());
|
||||
if (message != null && FModel.getPreferences().getPrefBoolean(FPref.ENFORCE_DECK_LEGALITY)) {
|
||||
FOptionPane.showMessageDialog(message, "Deck Invalid");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
FModel.getQuest().getAchievements().getCurrentDraft().start();
|
||||
|
||||
|
||||
VSubmenuQuestDraft.SINGLETON_INSTANCE.setMode(Mode.TOURNAMENT_ACTIVE);
|
||||
VSubmenuQuestDraft.SINGLETON_INSTANCE.populate();
|
||||
|
||||
|
||||
update();
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
private void startNextMatch() {
|
||||
|
||||
final String message = QuestDraftUtils.getDeckLegality();
|
||||
@@ -574,21 +575,7 @@ public enum CSubmenuQuestDraft implements ICDoc {
|
||||
|
||||
gui = GuiBase.getInterface().getNewGuiGame();
|
||||
QuestDraftUtils.startNextMatch(gui);
|
||||
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public UiCommand getCommandOnSelect() {
|
||||
final QuestController qc = FModel.getQuest();
|
||||
return new UiCommand() {
|
||||
private static final long serialVersionUID = 6153589785507038445L;
|
||||
@Override
|
||||
public void run() {
|
||||
if (qc.getAchievements() == null) {
|
||||
CHomeUI.SINGLETON_INSTANCE.itemClick(EDocID.HOME_QUESTDATA);
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -4,7 +4,6 @@ import javax.swing.SwingUtilities;
|
||||
|
||||
import com.google.common.primitives.Ints;
|
||||
|
||||
import forge.UiCommand;
|
||||
import forge.gui.framework.ICDoc;
|
||||
import forge.model.FModel;
|
||||
import forge.quest.data.QuestPreferences;
|
||||
@@ -43,7 +42,7 @@ public enum CSubmenuQuestPrefs implements ICDoc {
|
||||
/**
|
||||
* Checks validity of values entered into quest preference input text
|
||||
* fields.
|
||||
*
|
||||
*
|
||||
* @param i0
|
||||
* the input.
|
||||
*/
|
||||
@@ -102,11 +101,4 @@ public enum CSubmenuQuestPrefs implements ICDoc {
|
||||
view.getLblErrShop().setVisible(false);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.framework.ICDoc#getCommandOnSelect()
|
||||
*/
|
||||
@Override
|
||||
public UiCommand getCommandOnSelect() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,394 +0,0 @@
|
||||
package forge.screens.home.quest;
|
||||
|
||||
import forge.assets.FSkinProp;
|
||||
import forge.model.FModel;
|
||||
import forge.quest.data.QuestPreferences;
|
||||
import forge.quest.data.QuestPreferences.QPref;
|
||||
import forge.toolbox.FLabel;
|
||||
import forge.toolbox.FSkin;
|
||||
import forge.toolbox.FSkin.SkinnedPanel;
|
||||
import forge.toolbox.FSkin.SkinnedTextField;
|
||||
import net.miginfocom.swing.MigLayout;
|
||||
|
||||
import javax.swing.*;
|
||||
import javax.swing.border.Border;
|
||||
|
||||
import java.awt.*;
|
||||
import java.awt.event.FocusAdapter;
|
||||
import java.awt.event.FocusEvent;
|
||||
import java.awt.event.MouseAdapter;
|
||||
import java.awt.event.MouseEvent;
|
||||
|
||||
|
||||
@SuppressWarnings("serial")
|
||||
public class QuestPreferencesHandler extends SkinnedPanel {
|
||||
private final QuestPreferences prefs;
|
||||
private final JPanel pnlDifficulty, pnlBooster, pnlRewards, pnlShop;
|
||||
private final FLabel lblErrRewards, lblErrBooster, lblErrDifficulty, lblErrShop;
|
||||
private String constraints1, constraints2;
|
||||
|
||||
private enum ErrType {
|
||||
REWARDS,
|
||||
DIFFICULTY,
|
||||
BOOSTER,
|
||||
SHOP
|
||||
}
|
||||
|
||||
/** */
|
||||
public QuestPreferencesHandler() {
|
||||
this.setOpaque(false);
|
||||
this.setLayout(new MigLayout("insets 0, gap 0, wrap"));
|
||||
this.prefs = FModel.getQuestPreferences();
|
||||
|
||||
pnlRewards = new JPanel();
|
||||
pnlDifficulty = new JPanel();
|
||||
pnlBooster = new JPanel();
|
||||
pnlShop = new JPanel();
|
||||
|
||||
lblErrRewards = new FLabel.Builder().text("Rewards Error").fontStyle(Font.BOLD).build();
|
||||
lblErrDifficulty = new FLabel.Builder().text("Difficulty Error").fontStyle(Font.BOLD).build();
|
||||
lblErrBooster = new FLabel.Builder().text("Booster Error").fontStyle(Font.BOLD).build();
|
||||
lblErrShop = new FLabel.Builder().text("Shop Error").fontStyle(Font.BOLD).build();
|
||||
|
||||
lblErrRewards.setForeground(Color.red);
|
||||
lblErrDifficulty.setForeground(Color.red);
|
||||
lblErrBooster.setForeground(Color.red);
|
||||
lblErrShop.setForeground(Color.red);
|
||||
|
||||
// Rewards panel
|
||||
pnlRewards.setOpaque(false);
|
||||
pnlRewards.setLayout(new MigLayout("insets 0, gap 0, wrap 2"));
|
||||
|
||||
pnlRewards.add(new FLabel.Builder().text("Rewards")
|
||||
.icon(FSkin.getImage(FSkinProp.ICO_QUEST_COIN)).build(),
|
||||
"w 100%!, h 30px!, span 2 1");
|
||||
pnlRewards.add(lblErrRewards, "w 100%!, h 30px!, span 2 1");
|
||||
|
||||
constraints1 = "w 60px, h 26px!";
|
||||
constraints2 = "w 150px!, h 26px!";
|
||||
|
||||
pnlRewards.add(new FLabel.Builder().text("Base winnings").build(), constraints2);
|
||||
pnlRewards.add(new PrefInput(QPref.REWARDS_BASE, ErrType.REWARDS), constraints1);
|
||||
|
||||
pnlRewards.add(new FLabel.Builder().text("No losses").build(), constraints2);
|
||||
pnlRewards.add(new PrefInput(QPref.REWARDS_UNDEFEATED, ErrType.REWARDS), constraints1);
|
||||
|
||||
pnlRewards.add(new FLabel.Builder().text("Poison win").build(), constraints2);
|
||||
pnlRewards.add(new PrefInput(QPref.REWARDS_POISON, ErrType.REWARDS), constraints1);
|
||||
|
||||
pnlRewards.add(new FLabel.Builder().text("Milling win").build(), constraints2);
|
||||
pnlRewards.add(new PrefInput(QPref.REWARDS_MILLED, ErrType.REWARDS), constraints1);
|
||||
|
||||
pnlRewards.add(new FLabel.Builder().text("Mulligan 0 win").build(), constraints2);
|
||||
pnlRewards.add(new PrefInput(QPref.REWARDS_MULLIGAN0, ErrType.REWARDS), constraints1);
|
||||
|
||||
pnlRewards.add(new FLabel.Builder().text("Alternative win").build(), constraints2);
|
||||
pnlRewards.add(new PrefInput(QPref.REWARDS_ALTERNATIVE, ErrType.REWARDS), constraints1);
|
||||
|
||||
pnlRewards.add(new FLabel.Builder().text("Win by turn 15").build(), constraints2);
|
||||
pnlRewards.add(new PrefInput(QPref.REWARDS_TURN15, ErrType.REWARDS), constraints1);
|
||||
|
||||
pnlRewards.add(new FLabel.Builder().text("Win by turn 10").build(), constraints2);
|
||||
pnlRewards.add(new PrefInput(QPref.REWARDS_TURN10, ErrType.REWARDS), constraints1);
|
||||
|
||||
pnlRewards.add(new FLabel.Builder().text("Win by turn 5").build(), constraints2);
|
||||
pnlRewards.add(new PrefInput(QPref.REWARDS_TURN5, ErrType.REWARDS), constraints1);
|
||||
|
||||
pnlRewards.add(new FLabel.Builder().text("First turn win").build(), constraints2);
|
||||
pnlRewards.add(new PrefInput(QPref.REWARDS_TURN1, ErrType.REWARDS), constraints1);
|
||||
|
||||
// Difficulty table panel
|
||||
pnlDifficulty.setOpaque(false);
|
||||
pnlDifficulty.setLayout(new MigLayout("insets 0, gap 0, wrap 5"));
|
||||
|
||||
pnlDifficulty.add(new FLabel.Builder().text("Difficulty Adjustments").icon(FSkin.getImage(FSkinProp.ICO_QUEST_NOTES)).build(), "w 100%!, h 30px!, span 5 1");
|
||||
pnlDifficulty.add(lblErrDifficulty, "w 100%!, h 30px!, span 5 1");
|
||||
|
||||
constraints1 = "w 60px!, h 26px!";
|
||||
constraints2 = "w 150px!, h 26px!";
|
||||
|
||||
pnlDifficulty.add(new FLabel.Builder().text("").build(), constraints2);
|
||||
pnlDifficulty.add(new FLabel.Builder().text("Easy").build(), constraints1);
|
||||
pnlDifficulty.add(new FLabel.Builder().text("Medium").build(), constraints1);
|
||||
pnlDifficulty.add(new FLabel.Builder().text("Hard").build(), constraints1);
|
||||
pnlDifficulty.add(new FLabel.Builder().text("Expert").build(), constraints1);
|
||||
|
||||
pnlDifficulty.add(new FLabel.Builder().text("Wins For Booster").build(), constraints2);
|
||||
pnlDifficulty.add(new PrefInput(QPref.WINS_BOOSTER_EASY, ErrType.DIFFICULTY), constraints1);
|
||||
pnlDifficulty.add(new PrefInput(QPref.WINS_BOOSTER_MEDIUM, ErrType.DIFFICULTY), constraints1);
|
||||
pnlDifficulty.add(new PrefInput(QPref.WINS_BOOSTER_HARD, ErrType.DIFFICULTY), constraints1);
|
||||
pnlDifficulty.add(new PrefInput(QPref.WINS_BOOSTER_EXPERT, ErrType.DIFFICULTY), constraints1);
|
||||
|
||||
pnlDifficulty.add(new FLabel.Builder().text("Wins For Rank Increase").build(), constraints2);
|
||||
pnlDifficulty.add(new PrefInput(QPref.WINS_RANKUP_EASY, ErrType.DIFFICULTY), constraints1);
|
||||
pnlDifficulty.add(new PrefInput(QPref.WINS_RANKUP_MEDIUM, ErrType.DIFFICULTY), constraints1);
|
||||
pnlDifficulty.add(new PrefInput(QPref.WINS_RANKUP_HARD, ErrType.DIFFICULTY), constraints1);
|
||||
pnlDifficulty.add(new PrefInput(QPref.WINS_RANKUP_EXPERT, ErrType.DIFFICULTY), constraints1);
|
||||
|
||||
pnlDifficulty.add(new FLabel.Builder().text("Wins For Medium AI").build(), constraints2);
|
||||
pnlDifficulty.add(new PrefInput(QPref.WINS_MEDIUMAI_EASY, ErrType.DIFFICULTY), constraints1);
|
||||
pnlDifficulty.add(new PrefInput(QPref.WINS_MEDIUMAI_MEDIUM, ErrType.DIFFICULTY), constraints1);
|
||||
pnlDifficulty.add(new PrefInput(QPref.WINS_MEDIUMAI_HARD, ErrType.DIFFICULTY), constraints1);
|
||||
pnlDifficulty.add(new PrefInput(QPref.WINS_MEDIUMAI_EXPERT, ErrType.DIFFICULTY), constraints1);
|
||||
|
||||
pnlDifficulty.add(new FLabel.Builder().text("Wins For Hard AI").build(), constraints2);
|
||||
pnlDifficulty.add(new PrefInput(QPref.WINS_HARDAI_EASY, ErrType.DIFFICULTY), constraints1);
|
||||
pnlDifficulty.add(new PrefInput(QPref.WINS_HARDAI_MEDIUM, ErrType.DIFFICULTY), constraints1);
|
||||
pnlDifficulty.add(new PrefInput(QPref.WINS_HARDAI_HARD, ErrType.DIFFICULTY), constraints1);
|
||||
pnlDifficulty.add(new PrefInput(QPref.WINS_HARDAI_EXPERT, ErrType.DIFFICULTY), constraints1);
|
||||
|
||||
pnlDifficulty.add(new FLabel.Builder().text("Wins For Expert AI").build(), constraints2);
|
||||
pnlDifficulty.add(new PrefInput(QPref.WINS_EXPERTAI_EASY, ErrType.DIFFICULTY), constraints1);
|
||||
pnlDifficulty.add(new PrefInput(QPref.WINS_EXPERTAI_MEDIUM, ErrType.DIFFICULTY), constraints1);
|
||||
pnlDifficulty.add(new PrefInput(QPref.WINS_EXPERTAI_HARD, ErrType.DIFFICULTY), constraints1);
|
||||
pnlDifficulty.add(new PrefInput(QPref.WINS_EXPERTAI_EXPERT, ErrType.DIFFICULTY), constraints1);
|
||||
|
||||
pnlDifficulty.add(new FLabel.Builder().text("Starting commons").build(), constraints2);
|
||||
pnlDifficulty.add(new PrefInput(QPref.STARTING_COMMONS_EASY, ErrType.DIFFICULTY), constraints1);
|
||||
pnlDifficulty.add(new PrefInput(QPref.STARTING_COMMONS_MEDIUM, ErrType.DIFFICULTY), constraints1);
|
||||
pnlDifficulty.add(new PrefInput(QPref.STARTING_COMMONS_HARD, ErrType.DIFFICULTY), constraints1);
|
||||
pnlDifficulty.add(new PrefInput(QPref.STARTING_COMMONS_EXPERT, ErrType.DIFFICULTY), constraints1);
|
||||
|
||||
pnlDifficulty.add(new FLabel.Builder().text("Starting uncommons").build(), constraints2);
|
||||
pnlDifficulty.add(new PrefInput(QPref.STARTING_UNCOMMONS_EASY, ErrType.DIFFICULTY), constraints1);
|
||||
pnlDifficulty.add(new PrefInput(QPref.STARTING_UNCOMMONS_MEDIUM, ErrType.DIFFICULTY), constraints1);
|
||||
pnlDifficulty.add(new PrefInput(QPref.STARTING_UNCOMMONS_HARD, ErrType.DIFFICULTY), constraints1);
|
||||
pnlDifficulty.add(new PrefInput(QPref.STARTING_UNCOMMONS_EXPERT, ErrType.DIFFICULTY), constraints1);
|
||||
|
||||
pnlDifficulty.add(new FLabel.Builder().text("Starting rares").build(), constraints2);
|
||||
pnlDifficulty.add(new PrefInput(QPref.STARTING_RARES_EASY, ErrType.DIFFICULTY), constraints1);
|
||||
pnlDifficulty.add(new PrefInput(QPref.STARTING_RARES_MEDIUM, ErrType.DIFFICULTY), constraints1);
|
||||
pnlDifficulty.add(new PrefInput(QPref.STARTING_RARES_HARD, ErrType.DIFFICULTY), constraints1);
|
||||
pnlDifficulty.add(new PrefInput(QPref.STARTING_RARES_EXPERT, ErrType.DIFFICULTY), constraints1);
|
||||
|
||||
pnlDifficulty.add(new FLabel.Builder().text("Starting credits").build(), constraints2);
|
||||
pnlDifficulty.add(new PrefInput(QPref.STARTING_CREDITS_EASY, ErrType.DIFFICULTY), constraints1);
|
||||
pnlDifficulty.add(new PrefInput(QPref.STARTING_CREDITS_MEDIUM, ErrType.DIFFICULTY), constraints1);
|
||||
pnlDifficulty.add(new PrefInput(QPref.STARTING_CREDITS_HARD, ErrType.DIFFICULTY), constraints1);
|
||||
pnlDifficulty.add(new PrefInput(QPref.STARTING_CREDITS_EXPERT, ErrType.DIFFICULTY), constraints1);
|
||||
|
||||
pnlDifficulty.add(new FLabel.Builder().text("Starting basic lands").build(), constraints2);
|
||||
pnlDifficulty.add(new PrefInput(QPref.STARTING_BASIC_LANDS, ErrType.DIFFICULTY), constraints1 + ", wrap");
|
||||
|
||||
pnlDifficulty.add(new FLabel.Builder().text("Starting snow lands").build(), constraints2);
|
||||
pnlDifficulty.add(new PrefInput(QPref.STARTING_SNOW_LANDS, ErrType.DIFFICULTY), constraints1 + ", wrap");
|
||||
|
||||
pnlDifficulty.add(new FLabel.Builder().text("Color bias (1-10)").build(), constraints2);
|
||||
pnlDifficulty.add(new PrefInput(QPref.STARTING_POOL_COLOR_BIAS, ErrType.DIFFICULTY), constraints1 + ", wrap");
|
||||
|
||||
pnlDifficulty.add(new FLabel.Builder().text("Penalty for loss").build(), constraints2);
|
||||
pnlDifficulty.add(new PrefInput(QPref.PENALTY_LOSS, ErrType.DIFFICULTY), constraints1 + ", wrap");
|
||||
|
||||
// Booster breakdown panel
|
||||
pnlBooster.setOpaque(false);
|
||||
pnlBooster.setLayout(new MigLayout("insets 0, gap 0, wrap 2"));
|
||||
|
||||
pnlBooster.add(new FLabel.Builder().text("Booster Pack Ratios")
|
||||
.icon(FSkin.getImage(FSkinProp.ICO_QUEST_BOOK)).build(),
|
||||
"w 100%!, h 30px!, span 2 1");
|
||||
pnlBooster.add(lblErrBooster, "w 100%!, h 30px!, span 2 1");
|
||||
|
||||
constraints1 = "w 60px!, h 26px!";
|
||||
constraints2 = "w 150px!, h 26px!";
|
||||
pnlBooster.add(new FLabel.Builder().text("Common").build(), constraints2);
|
||||
pnlBooster.add(new PrefInput(QPref.BOOSTER_COMMONS, ErrType.BOOSTER), constraints1);
|
||||
|
||||
pnlBooster.add(new FLabel.Builder().text("Uncommon").build(), constraints2);
|
||||
pnlBooster.add(new PrefInput(QPref.BOOSTER_UNCOMMONS, ErrType.BOOSTER), constraints1);
|
||||
|
||||
pnlBooster.add(new FLabel.Builder().text("Rare").build(), constraints2);
|
||||
pnlBooster.add(new PrefInput(QPref.BOOSTER_RARES, ErrType.BOOSTER), constraints1);
|
||||
|
||||
// Shop panel
|
||||
pnlShop.setOpaque(false);
|
||||
pnlShop.setLayout(new MigLayout("insets 0, gap 0, wrap 2"));
|
||||
|
||||
pnlShop.add(new FLabel.Builder().text("Shop Preferences")
|
||||
.icon(FSkin.getImage(FSkinProp.ICO_QUEST_COIN)).build(), "w 100%!, h 30px!, span 2 1");
|
||||
pnlShop.add(lblErrShop, "w 100%!, h 30px!, span 2 1");
|
||||
|
||||
constraints1 = "w 60px, h 26px!";
|
||||
constraints2 = "w 150px!, h 26px!";
|
||||
|
||||
pnlShop.add(new FLabel.Builder().text("Maximum Packs").build(), constraints2);
|
||||
pnlShop.add(new PrefInput(QPref.SHOP_MAX_PACKS, ErrType.SHOP), constraints1);
|
||||
|
||||
pnlShop.add(new FLabel.Builder().text("Minimum Packs").build(), constraints2);
|
||||
pnlShop.add(new PrefInput(QPref.SHOP_MIN_PACKS, ErrType.SHOP), constraints1);
|
||||
|
||||
pnlShop.add(new FLabel.Builder().text("Starting Packs").build(), constraints2);
|
||||
pnlShop.add(new PrefInput(QPref.SHOP_STARTING_PACKS, ErrType.SHOP), constraints1);
|
||||
|
||||
pnlShop.add(new FLabel.Builder().text("Wins for Pack").build(), constraints2);
|
||||
pnlShop.add(new PrefInput(QPref.SHOP_WINS_FOR_ADDITIONAL_PACK, ErrType.SHOP), constraints1);
|
||||
|
||||
pnlShop.add(new FLabel.Builder().text("Wins per Set Unlock").build(), constraints2);
|
||||
pnlShop.add(new PrefInput(QPref.WINS_UNLOCK_SET, ErrType.SHOP), constraints1);
|
||||
|
||||
pnlShop.add(new FLabel.Builder().text("Common Singles").build(), constraints2);
|
||||
pnlShop.add(new PrefInput(QPref.SHOP_SINGLES_COMMON, ErrType.SHOP), constraints1);
|
||||
|
||||
pnlShop.add(new FLabel.Builder().text("Uncommon Singles").build(), constraints2);
|
||||
pnlShop.add(new PrefInput(QPref.SHOP_SINGLES_UNCOMMON, ErrType.SHOP), constraints1);
|
||||
|
||||
pnlShop.add(new FLabel.Builder().text("Rare Singles").build(), constraints2);
|
||||
pnlShop.add(new PrefInput(QPref.SHOP_SINGLES_RARE, ErrType.SHOP), constraints1);
|
||||
|
||||
pnlShop.add(new FLabel.Builder().text("Card Sale Price Cap").build(), constraints2);
|
||||
pnlShop.add(new PrefInput(QPref.SHOP_MAX_SELLING_PRICE, ErrType.SHOP), constraints1);
|
||||
|
||||
pnlShop.add(new FLabel.Builder().text("Wins to Uncap Sale Price").build(), constraints2);
|
||||
pnlShop.add(new PrefInput(QPref.SHOP_WINS_FOR_NO_SELL_LIMIT, ErrType.SHOP), constraints1);
|
||||
|
||||
pnlShop.add(new FLabel.Builder().text("Item Level Restriction").build(), constraints2);
|
||||
pnlShop.add(new PrefInput(QPref.ITEM_LEVEL_RESTRICTION, ErrType.SHOP), constraints1);
|
||||
|
||||
constraints1 = "w 100%!, gap 0 0 20px 0";
|
||||
this.add(pnlRewards, constraints1);
|
||||
this.add(pnlDifficulty, constraints1);
|
||||
this.add(pnlBooster, constraints1);
|
||||
this.add(pnlShop, constraints1);
|
||||
|
||||
resetErrors();
|
||||
}
|
||||
|
||||
private class PrefInput extends SkinnedTextField {
|
||||
private final QPref qpref;
|
||||
private final ErrType err;
|
||||
private final FSkin.SkinColor clrHover, clrActive, clrText;
|
||||
private boolean isFocus = false;
|
||||
private String previousText = "";
|
||||
|
||||
/**
|
||||
* @param qp1   {@link forge.quest.data.QuestPreferences.QPref}
|
||||
* preferences ident enum
|
||||
* @param e0   {@link forge.view.home.ViewQuestPreference.ErrType}
|
||||
* where error should display to
|
||||
*/
|
||||
public PrefInput(QPref qp0, ErrType e0) {
|
||||
super();
|
||||
|
||||
this.qpref = qp0;
|
||||
this.err = e0;
|
||||
this.clrHover = FSkin.getColor(FSkin.Colors.CLR_HOVER);
|
||||
this.clrActive = FSkin.getColor(FSkin.Colors.CLR_ACTIVE);
|
||||
this.clrText = FSkin.getColor(FSkin.Colors.CLR_TEXT);
|
||||
|
||||
this.setOpaque(false);
|
||||
this.setBorder((Border)null);
|
||||
this.setFont(FSkin.getFont(13));
|
||||
this.setForeground(clrText);
|
||||
this.setCaretColor(clrText);
|
||||
this.setBackground(clrHover);
|
||||
this.setHorizontalAlignment(SwingConstants.CENTER);
|
||||
this.setText(prefs.getPref(qpref));
|
||||
this.setPreviousText(prefs.getPref(qpref));
|
||||
|
||||
this.addMouseListener(new MouseAdapter() {
|
||||
@Override
|
||||
public void mouseEntered(MouseEvent e) {
|
||||
if (isFocus) { return; }
|
||||
setOpaque(true);
|
||||
repaint();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void mouseExited(MouseEvent e) {
|
||||
if (isFocus) { return; }
|
||||
setOpaque(false);
|
||||
repaint();
|
||||
}
|
||||
});
|
||||
|
||||
this.addFocusListener(new FocusAdapter() {
|
||||
@Override
|
||||
public void focusGained(FocusEvent e) {
|
||||
isFocus = true;
|
||||
setOpaque(true);
|
||||
setBackground(clrActive);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void focusLost(FocusEvent e) {
|
||||
isFocus = false;
|
||||
setOpaque(false);
|
||||
setBackground(clrHover);
|
||||
|
||||
// TODO for slight performance improvement
|
||||
// check if value has changed before validating
|
||||
validateAndSave(PrefInput.this);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public QPref getQPref() {
|
||||
return this.qpref;
|
||||
}
|
||||
|
||||
public ErrType getErrType() {
|
||||
return this.err;
|
||||
}
|
||||
|
||||
public String getPreviousText() {
|
||||
return this.previousText;
|
||||
}
|
||||
|
||||
public void setPreviousText(String s0) {
|
||||
this.previousText = s0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Checks validity of values entered into prefInputs.
|
||||
* @param i0   a PrefInput object
|
||||
*/
|
||||
private void validateAndSave(PrefInput i0) {
|
||||
if (i0.getText().equals(i0.getPreviousText())) { return; }
|
||||
|
||||
int val = Integer.parseInt(i0.getText());
|
||||
resetErrors();
|
||||
|
||||
String validationError = prefs.validatePreference(i0.getQPref(), val);
|
||||
if (validationError != null) {
|
||||
showError(i0, validationError);
|
||||
return;
|
||||
}
|
||||
|
||||
prefs.setPref(i0.getQPref(), i0.getText());
|
||||
prefs.save();
|
||||
i0.setPreviousText(i0.getText());
|
||||
}
|
||||
|
||||
private void showError(PrefInput i0, String s0) {
|
||||
String s = "Save failed: " + s0;
|
||||
switch(i0.getErrType()) {
|
||||
case BOOSTER:
|
||||
lblErrBooster.setVisible(true);
|
||||
lblErrBooster.setText(s);
|
||||
break;
|
||||
case DIFFICULTY:
|
||||
lblErrDifficulty.setVisible(true);
|
||||
lblErrDifficulty.setText(s);
|
||||
break;
|
||||
case REWARDS:
|
||||
lblErrRewards.setVisible(true);
|
||||
lblErrRewards.setText(s);
|
||||
break;
|
||||
case SHOP:
|
||||
lblErrShop.setVisible(true);
|
||||
lblErrShop.setText(s);
|
||||
break;
|
||||
default:
|
||||
}
|
||||
|
||||
i0.setText(i0.getPreviousText());
|
||||
}
|
||||
|
||||
private void resetErrors() {
|
||||
lblErrBooster.setVisible(false);
|
||||
lblErrDifficulty.setVisible(false);
|
||||
lblErrRewards.setVisible(false);
|
||||
lblErrShop.setVisible(false);
|
||||
}
|
||||
}
|
||||
@@ -1,17 +1,29 @@
|
||||
package forge.screens.home.quest;
|
||||
|
||||
import java.awt.Font;
|
||||
|
||||
import javax.swing.JButton;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.ScrollPaneConstants;
|
||||
import javax.swing.SwingConstants;
|
||||
|
||||
import net.miginfocom.swing.MigLayout;
|
||||
import forge.assets.FSkinProp;
|
||||
import forge.gui.framework.DragCell;
|
||||
import forge.gui.framework.DragTab;
|
||||
import forge.gui.framework.EDocID;
|
||||
import forge.quest.IVQuestStats;
|
||||
import forge.screens.home.*;
|
||||
import forge.toolbox.*;
|
||||
import net.miginfocom.swing.MigLayout;
|
||||
|
||||
import javax.swing.*;
|
||||
|
||||
import java.awt.*;
|
||||
import forge.screens.home.EMenuGroup;
|
||||
import forge.screens.home.IVSubmenu;
|
||||
import forge.screens.home.LblHeader;
|
||||
import forge.screens.home.StartButton;
|
||||
import forge.screens.home.VHomeUI;
|
||||
import forge.toolbox.FCheckBox;
|
||||
import forge.toolbox.FComboBoxWrapper;
|
||||
import forge.toolbox.FLabel;
|
||||
import forge.toolbox.FScrollPanel;
|
||||
import forge.toolbox.FSkin;
|
||||
|
||||
/**
|
||||
* Assembles Swing components of quest challenges submenu singleton.
|
||||
@@ -268,7 +280,7 @@ public enum VSubmenuChallenges implements IVSubmenu<CSubmenuChallenges>, IVQuest
|
||||
* @see forge.gui.framework.IVDoc#setParentCell(forge.gui.framework.DragCell)
|
||||
*/
|
||||
@Override
|
||||
public void setParentCell(DragCell cell0) {
|
||||
public void setParentCell(final DragCell cell0) {
|
||||
this.parentCell = cell0;
|
||||
}
|
||||
|
||||
@@ -280,12 +292,13 @@ public enum VSubmenuChallenges implements IVSubmenu<CSubmenuChallenges>, IVQuest
|
||||
return parentCell;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the cbCharm
|
||||
*/
|
||||
public FCheckBox getCbCharm() {
|
||||
return cbCharm;
|
||||
}
|
||||
/**
|
||||
* @return the cbCharm
|
||||
*/
|
||||
@Override
|
||||
public FCheckBox getCbCharm() {
|
||||
return cbCharm;
|
||||
}
|
||||
|
||||
@Override
|
||||
public FLabel getBtnRandomOpponent() {
|
||||
|
||||
@@ -1,18 +1,30 @@
|
||||
package forge.screens.home.quest;
|
||||
|
||||
import java.awt.Font;
|
||||
|
||||
import javax.swing.JButton;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.ScrollPaneConstants;
|
||||
import javax.swing.SwingConstants;
|
||||
|
||||
import net.miginfocom.swing.MigLayout;
|
||||
import forge.assets.FSkinProp;
|
||||
import forge.gui.framework.DragCell;
|
||||
import forge.gui.framework.DragTab;
|
||||
import forge.gui.framework.EDocID;
|
||||
import forge.interfaces.IButton;
|
||||
import forge.quest.IVQuestStats;
|
||||
import forge.screens.home.*;
|
||||
import forge.toolbox.*;
|
||||
import net.miginfocom.swing.MigLayout;
|
||||
|
||||
import javax.swing.*;
|
||||
|
||||
import java.awt.*;
|
||||
import forge.screens.home.EMenuGroup;
|
||||
import forge.screens.home.IVSubmenu;
|
||||
import forge.screens.home.LblHeader;
|
||||
import forge.screens.home.StartButton;
|
||||
import forge.screens.home.VHomeUI;
|
||||
import forge.toolbox.FCheckBox;
|
||||
import forge.toolbox.FComboBoxWrapper;
|
||||
import forge.toolbox.FLabel;
|
||||
import forge.toolbox.FScrollPanel;
|
||||
import forge.toolbox.FSkin;
|
||||
|
||||
/**
|
||||
* Assembles Swing components of quest duels submenu singleton.
|
||||
@@ -20,7 +32,6 @@ import java.awt.*;
|
||||
* <br><br><i>(V at beginning of class name denotes a view class.)</i>
|
||||
*/
|
||||
public enum VSubmenuDuels implements IVSubmenu<CSubmenuDuels>, IVQuestStats {
|
||||
/** */
|
||||
SINGLETON_INSTANCE;
|
||||
|
||||
// Fields used with interface IVDoc
|
||||
@@ -60,8 +71,8 @@ public enum VSubmenuDuels implements IVSubmenu<CSubmenuDuels>, IVQuestStats {
|
||||
private final LblHeader lblTitle = new LblHeader("Quest Mode: Duels");
|
||||
|
||||
private final FLabel lblInfo = new FLabel.Builder().text("Select your next duel.")
|
||||
.fontStyle(Font.BOLD).fontSize(16)
|
||||
.fontAlign(SwingConstants.LEFT).build();
|
||||
.fontStyle(Font.BOLD).fontSize(16)
|
||||
.fontAlign(SwingConstants.LEFT).build();
|
||||
|
||||
private final FLabel lblCurrentDeck = new FLabel.Builder()
|
||||
.text("Current deck hasn't been set yet.")
|
||||
@@ -81,7 +92,7 @@ public enum VSubmenuDuels implements IVSubmenu<CSubmenuDuels>, IVQuestStats {
|
||||
* Constructor.
|
||||
*/
|
||||
private VSubmenuDuels() {
|
||||
|
||||
|
||||
final String constraints = "h 30px!, gap 0 0 0 5px";
|
||||
pnlStats.setLayout(new MigLayout("insets 0, gap 0, wrap, hidemode 0"));
|
||||
pnlStats.add(btnUnlock, "w 150px!, h 30px!, gap 0 0 0 10px");
|
||||
@@ -99,9 +110,9 @@ public enum VSubmenuDuels implements IVSubmenu<CSubmenuDuels>, IVQuestStats {
|
||||
pnlStats.add(cbCharm, constraints);
|
||||
cbxPet.addTo(pnlStats, constraints);
|
||||
pnlStats.setOpaque(false);
|
||||
|
||||
|
||||
btnRandomOpponent.setToolTipText("Starts a duel against a randomly selected opponent.");
|
||||
|
||||
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@@ -274,7 +285,7 @@ public enum VSubmenuDuels implements IVSubmenu<CSubmenuDuels>, IVQuestStats {
|
||||
* @see forge.gui.framework.IVDoc#setParentCell(forge.gui.framework.DragCell)
|
||||
*/
|
||||
@Override
|
||||
public void setParentCell(DragCell cell0) {
|
||||
public void setParentCell(final DragCell cell0) {
|
||||
this.parentCell = cell0;
|
||||
}
|
||||
|
||||
@@ -286,12 +297,13 @@ public enum VSubmenuDuels implements IVSubmenu<CSubmenuDuels>, IVQuestStats {
|
||||
return parentCell;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the cbCharm
|
||||
*/
|
||||
public FCheckBox getCbCharm() {
|
||||
return cbCharm;
|
||||
}
|
||||
/**
|
||||
* @return the cbCharm
|
||||
*/
|
||||
@Override
|
||||
public FCheckBox getCbCharm() {
|
||||
return cbCharm;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isChallengesView() {
|
||||
|
||||
@@ -1,5 +1,20 @@
|
||||
package forge.screens.home.quest;
|
||||
|
||||
import java.awt.Component;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.swing.JList;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.SwingConstants;
|
||||
import javax.swing.plaf.basic.BasicComboBoxRenderer;
|
||||
|
||||
import net.miginfocom.swing.MigLayout;
|
||||
|
||||
import org.apache.commons.lang3.text.WordUtils;
|
||||
|
||||
import forge.card.MagicColor;
|
||||
import forge.deck.Deck;
|
||||
import forge.deck.DeckGroup;
|
||||
@@ -17,20 +32,14 @@ import forge.quest.StartingPoolType;
|
||||
import forge.screens.home.EMenuGroup;
|
||||
import forge.screens.home.IVSubmenu;
|
||||
import forge.screens.home.VHomeUI;
|
||||
import forge.toolbox.*;
|
||||
import forge.toolbox.FCheckBox;
|
||||
import forge.toolbox.FComboBoxWrapper;
|
||||
import forge.toolbox.FLabel;
|
||||
import forge.toolbox.FRadioButton;
|
||||
import forge.toolbox.FScrollPane;
|
||||
import forge.toolbox.FSkin;
|
||||
import forge.toolbox.JXButtonPanel;
|
||||
import forge.util.storage.IStorage;
|
||||
import net.miginfocom.swing.MigLayout;
|
||||
|
||||
import org.apache.commons.lang3.text.WordUtils;
|
||||
|
||||
import javax.swing.*;
|
||||
import javax.swing.plaf.basic.BasicComboBoxRenderer;
|
||||
|
||||
import java.awt.*;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* Assembles Swing components of quest data submenu singleton.
|
||||
@@ -47,8 +56,8 @@ public enum VSubmenuQuestData implements IVSubmenu<CSubmenuQuestData> {
|
||||
|
||||
/** */
|
||||
private final FLabel lblTitle = new FLabel.Builder()
|
||||
.text("Load Quest Data").fontAlign(SwingConstants.CENTER)
|
||||
.opaque(true).fontSize(16).build();
|
||||
.text("Load Quest Data").fontAlign(SwingConstants.CENTER)
|
||||
.opaque(true).fontSize(16).build();
|
||||
|
||||
private final FLabel lblTitleNew = new FLabel.Builder().text("Start a new Quest")
|
||||
.opaque(true).fontSize(16).build();
|
||||
@@ -67,7 +76,7 @@ public enum VSubmenuQuestData implements IVSubmenu<CSubmenuQuestData> {
|
||||
private final FRadioButton radHard = new FRadioButton("Hard");
|
||||
private final FRadioButton radExpert = new FRadioButton("Expert");
|
||||
private final FCheckBox boxFantasy = new FCheckBox("Fantasy Mode");
|
||||
private final FCheckBox boxCompleteSet = new FCheckBox("Start with all cards in selected sets");
|
||||
private final FCheckBox boxCompleteSet = new FCheckBox("Start with all cards in selected sets");
|
||||
|
||||
private final FLabel lblStartingWorld = new FLabel.Builder().text("Starting world:").build();
|
||||
private final FComboBoxWrapper<QuestWorld> cbxStartingWorld = new FComboBoxWrapper<QuestWorld>();
|
||||
@@ -115,8 +124,8 @@ public enum VSubmenuQuestData implements IVSubmenu<CSubmenuQuestData> {
|
||||
private final ActionListener alStartingPool = new ActionListener() {
|
||||
@SuppressWarnings("incomplete-switch")
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
StartingPoolType newVal = getStartingPoolType();
|
||||
public void actionPerformed(final ActionEvent e) {
|
||||
final StartingPoolType newVal = getStartingPoolType();
|
||||
lblUnrestricted.setVisible(newVal == StartingPoolType.Complete);
|
||||
|
||||
lblPreconDeck.setVisible(newVal == StartingPoolType.Precon);
|
||||
@@ -128,23 +137,23 @@ public enum VSubmenuQuestData implements IVSubmenu<CSubmenuQuestData> {
|
||||
btnDefineCustomFormat.setVisible(newVal == StartingPoolType.CustomFormat);
|
||||
|
||||
|
||||
boolean usesDeckList = newVal == StartingPoolType.SealedDeck || newVal == StartingPoolType.DraftDeck || newVal == StartingPoolType.Cube;
|
||||
final boolean usesDeckList = newVal == StartingPoolType.SealedDeck || newVal == StartingPoolType.DraftDeck || newVal == StartingPoolType.Cube;
|
||||
lblCustomDeck.setVisible(usesDeckList);
|
||||
cbxCustomDeck.setVisible(usesDeckList);
|
||||
|
||||
if (usesDeckList) {
|
||||
cbxCustomDeck.removeAllItems();
|
||||
CardCollections decks = FModel.getDecks();
|
||||
final CardCollections decks = FModel.getDecks();
|
||||
switch (newVal) {
|
||||
case SealedDeck:
|
||||
for (DeckGroup d : decks.getSealed()) { cbxCustomDeck.addItem(d.getHumanDeck()); }
|
||||
break;
|
||||
case DraftDeck:
|
||||
for (DeckGroup d : decks.getDraft()) { cbxCustomDeck.addItem(d.getHumanDeck()); }
|
||||
break;
|
||||
case Cube:
|
||||
for (Deck d : decks.getCubes()) { cbxCustomDeck.addItem(d); }
|
||||
break;
|
||||
case SealedDeck:
|
||||
for (final DeckGroup d : decks.getSealed()) { cbxCustomDeck.addItem(d.getHumanDeck()); }
|
||||
break;
|
||||
case DraftDeck:
|
||||
for (final DeckGroup d : decks.getDraft()) { cbxCustomDeck.addItem(d.getHumanDeck()); }
|
||||
break;
|
||||
case Cube:
|
||||
for (final Deck d : decks.getCubes()) { cbxCustomDeck.addItem(d); }
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -153,8 +162,8 @@ public enum VSubmenuQuestData implements IVSubmenu<CSubmenuQuestData> {
|
||||
/* Listeners */
|
||||
private final ActionListener alPrizesPool = new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
StartingPoolType newVal = getPrizedPoolType();
|
||||
public void actionPerformed(final ActionEvent e) {
|
||||
final StartingPoolType newVal = getPrizedPoolType();
|
||||
lblPrizeUnrestricted.setVisible(newVal == StartingPoolType.Complete);
|
||||
cboAllowUnlocks.setVisible(newVal != StartingPoolType.Complete);
|
||||
|
||||
@@ -168,7 +177,7 @@ public enum VSubmenuQuestData implements IVSubmenu<CSubmenuQuestData> {
|
||||
/* Listeners */
|
||||
private final ActionListener alStartingWorld = new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
public void actionPerformed(final ActionEvent e) {
|
||||
updateEnabledFormats();
|
||||
}
|
||||
};
|
||||
@@ -205,7 +214,7 @@ public enum VSubmenuQuestData implements IVSubmenu<CSubmenuQuestData> {
|
||||
difficultyPanel.add(radExpert, difficulty_constraints);
|
||||
radEasy.setSelected(true);
|
||||
|
||||
boxCompleteSet.setToolTipText("You will start the quest with 4 of each card in the sets you have selected.");
|
||||
boxCompleteSet.setToolTipText("You will start the quest with 4 of each card in the sets you have selected.");
|
||||
|
||||
cbxStartingPool.addItem(StartingPoolType.Complete);
|
||||
cbxStartingPool.addItem(StartingPoolType.Rotating);
|
||||
@@ -226,7 +235,7 @@ public enum VSubmenuQuestData implements IVSubmenu<CSubmenuQuestData> {
|
||||
cbxPrizedCards.addItem(StartingPoolType.CustomFormat);
|
||||
cbxPrizedCards.addActionListener(alPrizesPool);
|
||||
|
||||
for (GameFormat gf : FModel.getFormats().getOrderedList()) {
|
||||
for (final GameFormat gf : FModel.getFormats().getOrderedList()) {
|
||||
cbxFormat.addItem(gf);
|
||||
cbxPrizeFormat.addItem(gf);
|
||||
}
|
||||
@@ -241,7 +250,7 @@ public enum VSubmenuQuestData implements IVSubmenu<CSubmenuQuestData> {
|
||||
cbxPreferredColor.addItem(MagicColor.Constant.GREEN + stringBias);
|
||||
cbxPreferredColor.addItem(MagicColor.Constant.COLORLESS + stringBias);
|
||||
|
||||
for (QuestWorld qw : FModel.getWorlds()) {
|
||||
for (final QuestWorld qw : FModel.getWorlds()) {
|
||||
cbxStartingWorld.addItem(qw);
|
||||
}
|
||||
// Default to 'Main world'
|
||||
@@ -253,13 +262,13 @@ public enum VSubmenuQuestData implements IVSubmenu<CSubmenuQuestData> {
|
||||
cboAllowUnlocks.setSelected(true);
|
||||
|
||||
final Map<String, String> preconDescriptions = new HashMap<String, String>();
|
||||
IStorage<PreconDeck> preconDecks = QuestController.getPrecons();
|
||||
final IStorage<PreconDeck> preconDecks = QuestController.getPrecons();
|
||||
|
||||
for (PreconDeck preconDeck : preconDecks) {
|
||||
for (final PreconDeck preconDeck : preconDecks) {
|
||||
if (QuestController.getPreconDeals(preconDeck).getMinWins() > 0) {
|
||||
continue;
|
||||
}
|
||||
String name = preconDeck.getName();
|
||||
final String name = preconDeck.getName();
|
||||
cbxPreconDeck.addItem(name);
|
||||
String description = preconDeck.getDescription();
|
||||
description = "<html>" + WordUtils.wrap(description, 40, "<br>", false) + "</html>";
|
||||
@@ -273,11 +282,11 @@ public enum VSubmenuQuestData implements IVSubmenu<CSubmenuQuestData> {
|
||||
@SuppressWarnings("rawtypes")
|
||||
@Override
|
||||
public Component getListCellRendererComponent(
|
||||
JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
|
||||
Component defaultComponent =
|
||||
final JList list, final Object value, final int index, final boolean isSelected, final boolean cellHasFocus) {
|
||||
final Component defaultComponent =
|
||||
super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
|
||||
if (-1 < index && null != value) {
|
||||
String val = (String) value;
|
||||
final String val = (String) value;
|
||||
list.setToolTipText(preconDescriptions.get(val));
|
||||
}
|
||||
return defaultComponent;
|
||||
@@ -287,21 +296,21 @@ public enum VSubmenuQuestData implements IVSubmenu<CSubmenuQuestData> {
|
||||
// Fantasy box enabled by Default
|
||||
boxFantasy.setSelected(true);
|
||||
boxFantasy.setEnabled(true);
|
||||
boxCompleteSet.setEnabled(true);
|
||||
boxCompleteSet.setEnabled(true);
|
||||
|
||||
cbxPreferredColor.setEnabled(true);
|
||||
|
||||
pnlOptions.setOpaque(false);
|
||||
pnlOptions.setLayout(new MigLayout("insets 0, gap 10px, fillx, wrap 2"));
|
||||
|
||||
JPanel pnlDifficultyMode = new JPanel(new MigLayout("insets 0, gap 1%, flowy"));
|
||||
final JPanel pnlDifficultyMode = new JPanel(new MigLayout("insets 0, gap 1%, flowy"));
|
||||
pnlDifficultyMode.add(difficultyPanel, "gapright 4%");
|
||||
pnlDifficultyMode.add(boxFantasy, difficulty_constraints + ", gapright 4%");
|
||||
pnlDifficultyMode.setOpaque(false);
|
||||
pnlOptions.add(pnlDifficultyMode, "w 40%");
|
||||
|
||||
|
||||
JPanel pnlRestrictions = new JPanel();
|
||||
final JPanel pnlRestrictions = new JPanel();
|
||||
final String constraints = "h 27px!, ";
|
||||
final String lblWidth = "w 40%, ";
|
||||
final String hidemode = "hidemode 3, ";
|
||||
@@ -340,7 +349,7 @@ public enum VSubmenuQuestData implements IVSubmenu<CSubmenuQuestData> {
|
||||
pnlRestrictions.add(lblPrizeUnrestricted, constraints + hidemode + "spanx 2");
|
||||
|
||||
pnlRestrictions.add(cboAllowUnlocks, constraints + "spanx 2, ax right");
|
||||
pnlRestrictions.add(boxCompleteSet, constraints + "spanx 2, ax right");
|
||||
pnlRestrictions.add(boxCompleteSet, constraints + "spanx 2, ax right");
|
||||
|
||||
|
||||
pnlRestrictions.add(lblPreferredColor, constraints + lblWidthStart);
|
||||
@@ -349,7 +358,7 @@ public enum VSubmenuQuestData implements IVSubmenu<CSubmenuQuestData> {
|
||||
pnlRestrictions.add(lblStartingWorld, constraints + lblWidthStart);
|
||||
cbxStartingWorld.addTo(pnlRestrictions, constraints + cboWidthStart);
|
||||
|
||||
// cboAllowUnlocks.setOpaque(false);
|
||||
// cboAllowUnlocks.setOpaque(false);
|
||||
pnlRestrictions.setOpaque(false);
|
||||
pnlOptions.add(pnlRestrictions, "pushx, ay top");
|
||||
|
||||
@@ -442,7 +451,7 @@ public enum VSubmenuQuestData implements IVSubmenu<CSubmenuQuestData> {
|
||||
* @see forge.gui.framework.IVDoc#setParentCell(forge.gui.framework.DragCell)
|
||||
*/
|
||||
@Override
|
||||
public void setParentCell(DragCell cell0) {
|
||||
public void setParentCell(final DragCell cell0) {
|
||||
this.parentCell = cell0;
|
||||
}
|
||||
|
||||
@@ -472,7 +481,7 @@ public enum VSubmenuQuestData implements IVSubmenu<CSubmenuQuestData> {
|
||||
}
|
||||
|
||||
public Deck getSelectedDeck() {
|
||||
Object sel = cbxCustomDeck.getSelectedItem();
|
||||
final Object sel = cbxCustomDeck.getSelectedItem();
|
||||
return sel instanceof Deck ? (Deck) sel : null;
|
||||
}
|
||||
|
||||
@@ -481,12 +490,12 @@ public enum VSubmenuQuestData implements IVSubmenu<CSubmenuQuestData> {
|
||||
}
|
||||
|
||||
public StartingPoolType getStartingPoolType() {
|
||||
return (StartingPoolType) cbxStartingPool.getSelectedItem();
|
||||
return cbxStartingPool.getSelectedItem();
|
||||
}
|
||||
|
||||
public StartingPoolType getPrizedPoolType() {
|
||||
Object v = cbxPrizedCards.getSelectedItem();
|
||||
return v instanceof StartingPoolType ? (StartingPoolType) v : null;
|
||||
final Object v = cbxPrizedCards.getSelectedItem();
|
||||
return v instanceof StartingPoolType ? (StartingPoolType) v : null;
|
||||
}
|
||||
|
||||
public String getStartingWorldName() {
|
||||
@@ -496,10 +505,10 @@ public enum VSubmenuQuestData implements IVSubmenu<CSubmenuQuestData> {
|
||||
public boolean isFantasy() {
|
||||
return boxFantasy.isSelected();
|
||||
}
|
||||
|
||||
public boolean startWithCompleteSet() {
|
||||
return boxCompleteSet.isSelected();
|
||||
}
|
||||
|
||||
public boolean startWithCompleteSet() {
|
||||
return boxCompleteSet.isSelected();
|
||||
}
|
||||
|
||||
public boolean randomizeColorDistribution() {
|
||||
return stringRandomizedDistribution.equals(cbxPreferredColor.getSelectedItem());
|
||||
@@ -514,11 +523,11 @@ public enum VSubmenuQuestData implements IVSubmenu<CSubmenuQuestData> {
|
||||
}
|
||||
|
||||
public GameFormat getRotatingFormat() {
|
||||
return (GameFormat) cbxFormat.getSelectedItem();
|
||||
return cbxFormat.getSelectedItem();
|
||||
}
|
||||
|
||||
public GameFormat getPrizedRotatingFormat() {
|
||||
return (GameFormat) cbxPrizeFormat.getSelectedItem();
|
||||
return cbxPrizeFormat.getSelectedItem();
|
||||
}
|
||||
|
||||
public FLabel getBtnCustomFormat() {
|
||||
|
||||
@@ -46,8 +46,8 @@ public enum VSubmenuQuestPrefs implements IVSubmenu<CSubmenuQuestPrefs> {
|
||||
|
||||
/** */
|
||||
private final FLabel lblTitle = new FLabel.Builder()
|
||||
.text("Quest Preferences").fontAlign(SwingConstants.CENTER)
|
||||
.opaque(true).fontSize(16).build();
|
||||
.text("Quest Preferences").fontAlign(SwingConstants.CENTER)
|
||||
.opaque(true).fontSize(16).build();
|
||||
|
||||
private final JPanel pnlContent = new JPanel();
|
||||
private final FScrollPane scrContent = new FScrollPane(pnlContent, false);
|
||||
|
||||
@@ -1,5 +1,15 @@
|
||||
package forge.screens.home.sanctioned;
|
||||
|
||||
import java.awt.Dimension;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.ScrollPaneConstants;
|
||||
import javax.swing.SwingConstants;
|
||||
|
||||
import forge.gui.WrapLayout;
|
||||
import forge.toolbox.FLabel;
|
||||
import forge.toolbox.FScrollPane;
|
||||
@@ -7,18 +17,10 @@ import forge.toolbox.FSkin;
|
||||
import forge.toolbox.FSkin.SkinImage;
|
||||
import forge.view.FDialog;
|
||||
|
||||
import javax.swing.*;
|
||||
|
||||
import java.awt.*;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@SuppressWarnings("serial")
|
||||
public class AvatarSelector extends FDialog {
|
||||
private List<FLabel> selectables = new ArrayList<FLabel>();
|
||||
private final Map<Integer, SkinImage> avatarMap = FSkin.getAvatars();
|
||||
private final List<FLabel> selectables = new ArrayList<FLabel>();
|
||||
private final Map<Integer, SkinImage> avatarMap = FSkin.getAvatars();
|
||||
|
||||
public AvatarSelector(final String playerName, final int currentIndex, final Collection<Integer> usedIndices) {
|
||||
this.setTitle("Select avatar for " + playerName);
|
||||
@@ -28,21 +30,21 @@ public class AvatarSelector extends FDialog {
|
||||
pnlAvatarPics.setOpaque(false);
|
||||
pnlAvatarPics.setOpaque(false);
|
||||
|
||||
FLabel initialSelection = makeAvatarLabel(avatarMap.get(currentIndex), currentIndex, currentIndex);
|
||||
final FLabel initialSelection = makeAvatarLabel(avatarMap.get(currentIndex), currentIndex, currentIndex);
|
||||
pnlAvatarPics.add(initialSelection);
|
||||
for (final Integer i : avatarMap.keySet()) {
|
||||
//if (!usedIndices.contains(i)) { // Decided to allow duplicate avatars when manually selecting
|
||||
if (currentIndex != i) {
|
||||
for (final Integer i : avatarMap.keySet()) {
|
||||
//if (!usedIndices.contains(i)) { // Decided to allow duplicate avatars when manually selecting
|
||||
if (currentIndex != i) {
|
||||
pnlAvatarPics.add(makeAvatarLabel(avatarMap.get(i), i, currentIndex));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
final int width = this.getOwner().getWidth() * 3 / 4;
|
||||
final int width = this.getOwner().getWidth() * 3 / 4;
|
||||
final int height = this.getOwner().getHeight() * 3 / 4;
|
||||
this.setPreferredSize(new Dimension(width, height));
|
||||
this.setSize(width, height);
|
||||
|
||||
FScrollPane scroller = new FScrollPane(pnlAvatarPics, false);
|
||||
final FScrollPane scroller = new FScrollPane(pnlAvatarPics, false);
|
||||
scroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
|
||||
this.add(scroller, "w 100%-24px!, pushy, growy, gap 12px 0 0 0");
|
||||
this.setDefaultFocus(initialSelection);
|
||||
@@ -50,8 +52,8 @@ public class AvatarSelector extends FDialog {
|
||||
|
||||
private FLabel makeAvatarLabel(final SkinImage img0, final int index0, final int oldIndex) {
|
||||
final FLabel lbl = new FLabel.Builder().icon(img0).iconScaleFactor(0.95).iconAlignX(SwingConstants.CENTER)
|
||||
.iconInBackground(true).hoverable(true).selectable(true).selected(oldIndex == index0)
|
||||
.unhoveredAlpha(oldIndex == index0 ? 0.9f : 0.7f).build();
|
||||
.iconInBackground(true).hoverable(true).selectable(true).selected(oldIndex == index0)
|
||||
.unhoveredAlpha(oldIndex == index0 ? 0.9f : 0.7f).build();
|
||||
|
||||
final Dimension size = new Dimension(80, 80);
|
||||
lbl.setPreferredSize(size);
|
||||
@@ -60,7 +62,7 @@ public class AvatarSelector extends FDialog {
|
||||
lbl.setName("AvatarLabel" + index0);
|
||||
|
||||
if (oldIndex == index0) {
|
||||
lbl.setBorder(new FSkin.LineSkinBorder(FSkin.getColor(FSkin.Colors.CLR_BORDERS).alphaColor(255), 3));
|
||||
lbl.setBorder(new FSkin.LineSkinBorder(FSkin.getColor(FSkin.Colors.CLR_BORDERS).alphaColor(255), 3));
|
||||
}
|
||||
|
||||
selectables.add(lbl);
|
||||
@@ -69,6 +71,6 @@ public class AvatarSelector extends FDialog {
|
||||
}
|
||||
|
||||
public List<FLabel> getSelectables() {
|
||||
return this.selectables;
|
||||
return this.selectables;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,7 +5,6 @@ import java.util.List;
|
||||
|
||||
import javax.swing.JMenu;
|
||||
|
||||
import forge.UiCommand;
|
||||
import forge.gui.framework.ICDoc;
|
||||
import forge.menus.IMenuProvider;
|
||||
import forge.menus.MenuUtil;
|
||||
@@ -13,7 +12,7 @@ import forge.screens.home.CLobby;
|
||||
|
||||
/**
|
||||
* Controls the constructed submenu in the home UI.
|
||||
*
|
||||
*
|
||||
* <br><br><i>(C at beginning of class name denotes a control class.)</i>
|
||||
*
|
||||
*/
|
||||
@@ -45,20 +44,12 @@ public enum CSubmenuConstructed implements ICDoc, IMenuProvider {
|
||||
lobby.initialize();
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.framework.ICDoc#getCommandOnSelect()
|
||||
*/
|
||||
@Override
|
||||
public UiCommand getCommandOnSelect() {
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.menubar.IMenuProvider#getMenus()
|
||||
*/
|
||||
@Override
|
||||
public List<JMenu> getMenus() {
|
||||
List<JMenu> menus = new ArrayList<JMenu>();
|
||||
final List<JMenu> menus = new ArrayList<JMenu>();
|
||||
menus.add(ConstructedGameMenu.getMenu());
|
||||
return menus;
|
||||
}
|
||||
|
||||
@@ -31,15 +31,13 @@ import forge.screens.deckeditor.CDeckEditorUI;
|
||||
import forge.screens.deckeditor.controllers.CEditorDraftingProcess;
|
||||
import forge.toolbox.FOptionPane;
|
||||
|
||||
/**
|
||||
/**
|
||||
* Controls the draft submenu in the home UI.
|
||||
*
|
||||
* <br><br><i>(C at beginning of class name denotes a control class.)</i>
|
||||
*
|
||||
* <br><br><i>(C at beginning of class name denotes a control class.)</i>
|
||||
*/
|
||||
@SuppressWarnings("serial")
|
||||
public enum CSubmenuDraft implements ICDoc {
|
||||
/** */
|
||||
SINGLETON_INSTANCE;
|
||||
|
||||
private final UiCommand cmdDeckSelect = new UiCommand() {
|
||||
@@ -114,7 +112,7 @@ public enum CSubmenuDraft implements ICDoc {
|
||||
}
|
||||
|
||||
if (FModel.getPreferences().getPrefBoolean(FPref.ENFORCE_DECK_LEGALITY)) {
|
||||
String errorMessage = gameType.getDeckFormat().getDeckConformanceProblem(humanDeck.getDeck());
|
||||
final String errorMessage = gameType.getDeckFormat().getDeckConformanceProblem(humanDeck.getDeck());
|
||||
if (null != errorMessage) {
|
||||
FOptionPane.showErrorDialog("Your deck " + errorMessage + " Please edit or choose a different deck.", "Invalid Deck");
|
||||
return;
|
||||
@@ -124,7 +122,7 @@ public enum CSubmenuDraft implements ICDoc {
|
||||
FModel.getGauntletMini().resetGauntletDraft();
|
||||
|
||||
if (gauntlet) {
|
||||
int rounds = FModel.getDecks().getDraft().get(humanDeck.getName()).getAiDecks().size();
|
||||
final int rounds = FModel.getDecks().getDraft().get(humanDeck.getName()).getAiDecks().size();
|
||||
FModel.getGauntletMini().launch(rounds, humanDeck.getDeck(), gameType);
|
||||
return;
|
||||
}
|
||||
@@ -147,7 +145,7 @@ public enum CSubmenuDraft implements ICDoc {
|
||||
final RegisteredPlayer human = new RegisteredPlayer(humanDeck.getDeck()).setPlayer(GamePlayerUtil.getGuiPlayer());
|
||||
starter.add(human);
|
||||
starter.add(new RegisteredPlayer(aiDeck).setPlayer(GamePlayerUtil.createAiPlayer()));
|
||||
for (RegisteredPlayer pl : starter) {
|
||||
for (final RegisteredPlayer pl : starter) {
|
||||
pl.assignConspiracies();
|
||||
}
|
||||
|
||||
@@ -168,7 +166,7 @@ public enum CSubmenuDraft implements ICDoc {
|
||||
final LimitedPoolType poolType = GuiChoose.oneOrNone("Choose Draft Format", LimitedPoolType.values());
|
||||
if (poolType == null) { return; }
|
||||
|
||||
BoosterDraft draft = BoosterDraft.createDraft(poolType);
|
||||
final BoosterDraft draft = BoosterDraft.createDraft(poolType);
|
||||
if (draft == null) { return; }
|
||||
|
||||
final CEditorDraftingProcess draftController = new CEditorDraftingProcess(CDeckEditorUI.SINGLETON_INSTANCE.getCDetailPicture());
|
||||
@@ -178,11 +176,4 @@ public enum CSubmenuDraft implements ICDoc {
|
||||
CDeckEditorUI.SINGLETON_INSTANCE.setEditorController(draftController);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.framework.ICDoc#getCommandOnSelect()
|
||||
*/
|
||||
@Override
|
||||
public UiCommand getCommandOnSelect() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,9 +24,9 @@ import forge.screens.deckeditor.controllers.ACEditorBase;
|
||||
import forge.screens.deckeditor.controllers.CEditorLimited;
|
||||
import forge.toolbox.FOptionPane;
|
||||
|
||||
/**
|
||||
/**
|
||||
* Controls the sealed submenu in the home UI.
|
||||
*
|
||||
*
|
||||
* <br><br><i>(C at beginning of class name denotes a control class.)</i>
|
||||
*
|
||||
*/
|
||||
@@ -88,7 +88,7 @@ public enum CSubmenuSealed implements ICDoc {
|
||||
|
||||
SwingUtilities.invokeLater(new Runnable() {
|
||||
@Override public void run() {
|
||||
JButton btnStart = view.getBtnStart();
|
||||
final JButton btnStart = view.getBtnStart();
|
||||
if (btnStart.isEnabled()) {
|
||||
view.getBtnStart().requestFocusInWindow();
|
||||
} else {
|
||||
@@ -107,14 +107,14 @@ public enum CSubmenuSealed implements ICDoc {
|
||||
}
|
||||
|
||||
if (FModel.getPreferences().getPrefBoolean(FPref.ENFORCE_DECK_LEGALITY)) {
|
||||
String errorMessage = gameType.getDeckFormat().getDeckConformanceProblem(human.getDeck());
|
||||
final String errorMessage = gameType.getDeckFormat().getDeckConformanceProblem(human.getDeck());
|
||||
if (null != errorMessage) {
|
||||
FOptionPane.showErrorDialog("Your deck " + errorMessage + " Please edit or choose a different deck.", "Invalid Deck");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
int matches = FModel.getDecks().getSealed().get(human.getName()).getAiDecks().size();
|
||||
final int matches = FModel.getDecks().getSealed().get(human.getName()).getAiDecks().size();
|
||||
FModel.getGauntletMini().launch(matches, human.getDeck(), gameType);
|
||||
}
|
||||
|
||||
@@ -131,11 +131,4 @@ public enum CSubmenuSealed implements ICDoc {
|
||||
editor.getDeckController().setModel((T) sealed);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.framework.ICDoc#getCommandOnSelect()
|
||||
*/
|
||||
@Override
|
||||
public UiCommand getCommandOnSelect() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -113,7 +113,7 @@ public enum CSubmenuWinston implements ICDoc {
|
||||
}
|
||||
|
||||
if (FModel.getPreferences().getPrefBoolean(FPref.ENFORCE_DECK_LEGALITY)) {
|
||||
String errorMessage = gameType.getDeckFormat().getDeckConformanceProblem(humanDeck.getDeck());
|
||||
final String errorMessage = gameType.getDeckFormat().getDeckConformanceProblem(humanDeck.getDeck());
|
||||
if (null != errorMessage) {
|
||||
FOptionPane.showErrorDialog("Your deck " + errorMessage + " Please edit or choose a different deck.", "Invalid Deck");
|
||||
return;
|
||||
@@ -156,7 +156,7 @@ public enum CSubmenuWinston implements ICDoc {
|
||||
final LimitedPoolType poolType = GuiChoose.oneOrNone("Choose Draft Format", LimitedPoolType.values());
|
||||
if (poolType == null) { return; }
|
||||
|
||||
WinstonDraft draft = WinstonDraft.createDraft(poolType);
|
||||
final WinstonDraft draft = WinstonDraft.createDraft(poolType);
|
||||
if (draft == null) { return; }
|
||||
|
||||
final CEditorWinstonProcess draftController = new CEditorWinstonProcess(CDeckEditorUI.SINGLETON_INSTANCE.getCDetailPicture());
|
||||
@@ -166,11 +166,4 @@ public enum CSubmenuWinston implements ICDoc {
|
||||
CDeckEditorUI.SINGLETON_INSTANCE.setEditorController(draftController);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.framework.ICDoc#getCommandOnSelect()
|
||||
*/
|
||||
@Override
|
||||
public UiCommand getCommandOnSelect() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,11 +1,10 @@
|
||||
package forge.screens.home.settings;
|
||||
|
||||
import forge.UiCommand;
|
||||
import forge.gui.framework.ICDoc;
|
||||
|
||||
/**
|
||||
* Controls the achievements submenu in the home UI.
|
||||
*
|
||||
*
|
||||
* <br><br><i>(C at beginning of class name denotes a control class.)</i>
|
||||
*
|
||||
*/
|
||||
@@ -31,11 +30,4 @@ public enum CSubmenuAchievements implements ICDoc {
|
||||
public void update() {
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.framework.ICDoc#getCommandOnSelect()
|
||||
*/
|
||||
@Override
|
||||
public UiCommand getCommandOnSelect() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,11 +1,10 @@
|
||||
package forge.screens.home.settings;
|
||||
|
||||
import forge.UiCommand;
|
||||
import javax.swing.SwingUtilities;
|
||||
|
||||
import forge.gui.framework.ICDoc;
|
||||
|
||||
import javax.swing.*;
|
||||
|
||||
/**
|
||||
/**
|
||||
* Controls the avatars submenu in the home UI.
|
||||
*/
|
||||
public enum CSubmenuAvatars implements ICDoc {
|
||||
@@ -24,15 +23,11 @@ public enum CSubmenuAvatars implements ICDoc {
|
||||
@Override
|
||||
public void update() {
|
||||
SwingUtilities.invokeLater(new Runnable() {
|
||||
@Override public void run() {
|
||||
view.refreshAvatarFromPrefs(0);
|
||||
view.refreshAvatarFromPrefs(1);
|
||||
view.focusHuman(); }
|
||||
@Override public final void run() {
|
||||
view.refreshAvatarFromPrefs(0);
|
||||
view.refreshAvatarFromPrefs(1);
|
||||
view.focusHuman(); }
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public UiCommand getCommandOnSelect() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
package forge.screens.home.settings;
|
||||
|
||||
import javax.swing.SwingUtilities;
|
||||
|
||||
import forge.UiCommand;
|
||||
import forge.download.GuiDownloadPicturesLQ;
|
||||
import forge.download.GuiDownloadPrices;
|
||||
@@ -10,8 +12,6 @@ import forge.error.BugReporter;
|
||||
import forge.gui.ImportDialog;
|
||||
import forge.gui.framework.ICDoc;
|
||||
|
||||
import javax.swing.*;
|
||||
|
||||
/**
|
||||
* Controls the utilities submenu in the home UI.
|
||||
*
|
||||
@@ -22,22 +22,45 @@ import javax.swing.*;
|
||||
public enum CSubmenuDownloaders implements ICDoc {
|
||||
SINGLETON_INSTANCE;
|
||||
|
||||
private final UiCommand cmdLicensing = new UiCommand() { @Override
|
||||
public void run() { VSubmenuDownloaders.SINGLETON_INSTANCE.showLicensing(); } };
|
||||
private final UiCommand cmdPicDownload = new UiCommand() { @Override
|
||||
public void run() { new GuiDownloader(new GuiDownloadPicturesLQ()); } };
|
||||
private final UiCommand cmdSetDownload = new UiCommand() { @Override
|
||||
public void run() { new GuiDownloader(new GuiDownloadSetPicturesLQ()); } };
|
||||
private final UiCommand cmdQuestImages = new UiCommand() { @Override
|
||||
public void run() { new GuiDownloader(new GuiDownloadQuestImages()); } };
|
||||
private final UiCommand cmdDownloadPrices = new UiCommand() { @Override
|
||||
public void run() { new GuiDownloader(new GuiDownloadPrices()); } };
|
||||
private final UiCommand cmdHowToPlay = new UiCommand() { @Override
|
||||
public void run() { VSubmenuDownloaders.SINGLETON_INSTANCE.showHowToPlay(); } };
|
||||
private final UiCommand cmdImportPictures = new UiCommand() { @Override
|
||||
public void run() { new ImportDialog(null, null); } };
|
||||
private final UiCommand cmdReportBug = new UiCommand() { @Override
|
||||
public void run() { BugReporter.reportBug(null); }
|
||||
private final UiCommand cmdLicensing = new UiCommand() {
|
||||
@Override public void run() {
|
||||
VSubmenuDownloaders.SINGLETON_INSTANCE.showLicensing();
|
||||
}
|
||||
};
|
||||
private final UiCommand cmdPicDownload = new UiCommand() {
|
||||
@Override public void run() {
|
||||
new GuiDownloader(new GuiDownloadPicturesLQ()).show();
|
||||
}
|
||||
};
|
||||
private final UiCommand cmdSetDownload = new UiCommand() {
|
||||
@Override public void run() {
|
||||
new GuiDownloader(new GuiDownloadSetPicturesLQ()).show();
|
||||
}
|
||||
};
|
||||
private final UiCommand cmdQuestImages = new UiCommand() {
|
||||
@Override public void run() {
|
||||
new GuiDownloader(new GuiDownloadQuestImages()).show();
|
||||
}
|
||||
};
|
||||
private final UiCommand cmdDownloadPrices = new UiCommand() {
|
||||
@Override public void run() {
|
||||
new GuiDownloader(new GuiDownloadPrices()).show();
|
||||
}
|
||||
};
|
||||
private final UiCommand cmdHowToPlay = new UiCommand() {
|
||||
@Override public void run() {
|
||||
VSubmenuDownloaders.SINGLETON_INSTANCE.showHowToPlay();
|
||||
}
|
||||
};
|
||||
private final UiCommand cmdImportPictures = new UiCommand() {
|
||||
@Override public void run() {
|
||||
new ImportDialog(null, null).show();
|
||||
}
|
||||
};
|
||||
private final UiCommand cmdReportBug = new UiCommand() {
|
||||
@Override public void run() {
|
||||
BugReporter.reportBug(null);
|
||||
}
|
||||
};
|
||||
|
||||
@Override
|
||||
@@ -73,11 +96,4 @@ public enum CSubmenuDownloaders implements ICDoc {
|
||||
});
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.framework.ICDoc#getCommandOnSelect()
|
||||
*/
|
||||
@Override
|
||||
public UiCommand getCommandOnSelect() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,29 +1,5 @@
|
||||
package forge.screens.home.settings;
|
||||
|
||||
import forge.UiCommand;
|
||||
import forge.Singletons;
|
||||
import forge.ai.AiProfileUtil;
|
||||
import forge.control.FControl.CloseAction;
|
||||
import forge.control.RestartUtil;
|
||||
import forge.game.GameLogEntryType;
|
||||
import forge.gui.framework.FScreen;
|
||||
import forge.gui.framework.ICDoc;
|
||||
import forge.model.FModel;
|
||||
import forge.player.GamePlayerUtil;
|
||||
import forge.properties.ForgePreferences;
|
||||
import forge.properties.ForgePreferences.FPref;
|
||||
import forge.properties.ForgeConstants;
|
||||
import forge.sound.SoundSystem;
|
||||
import forge.toolbox.FComboBox;
|
||||
import forge.toolbox.FComboBoxPanel;
|
||||
import forge.toolbox.FLabel;
|
||||
import forge.toolbox.FOptionPane;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.apache.commons.lang3.tuple.Pair;
|
||||
|
||||
import javax.swing.*;
|
||||
|
||||
import java.awt.Desktop;
|
||||
import java.awt.event.ItemEvent;
|
||||
import java.awt.event.ItemListener;
|
||||
@@ -31,9 +7,34 @@ import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import javax.swing.JCheckBox;
|
||||
import javax.swing.SwingUtilities;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.apache.commons.lang3.tuple.Pair;
|
||||
|
||||
import forge.Singletons;
|
||||
import forge.UiCommand;
|
||||
import forge.ai.AiProfileUtil;
|
||||
import forge.control.FControl.CloseAction;
|
||||
import forge.control.RestartUtil;
|
||||
import forge.game.GameLogEntryType;
|
||||
import forge.gui.framework.FScreen;
|
||||
import forge.gui.framework.ICDoc;
|
||||
import forge.model.FModel;
|
||||
import forge.player.GamePlayerUtil;
|
||||
import forge.properties.ForgeConstants;
|
||||
import forge.properties.ForgePreferences;
|
||||
import forge.properties.ForgePreferences.FPref;
|
||||
import forge.sound.SoundSystem;
|
||||
import forge.toolbox.FComboBox;
|
||||
import forge.toolbox.FComboBoxPanel;
|
||||
import forge.toolbox.FLabel;
|
||||
import forge.toolbox.FOptionPane;
|
||||
|
||||
/**
|
||||
* Controls the preferences submenu in the home UI.
|
||||
*
|
||||
*
|
||||
* <br><br><i>(C at beginning of class name denotes a control class.)</i>
|
||||
*
|
||||
*/
|
||||
@@ -142,7 +143,7 @@ public enum CSubmenuPreferences implements ICDoc {
|
||||
CSubmenuPreferences.this.resetDeckEditorLayout();
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
view.getBtnDeleteWorkshopUI().setCommand(new UiCommand() {
|
||||
@Override
|
||||
public void run() {
|
||||
@@ -191,7 +192,7 @@ public enum CSubmenuPreferences implements ICDoc {
|
||||
view.getCbDevMode().setSelected(ForgePreferences.DEV_MODE);
|
||||
view.getCbEnableMusic().setSelected(prefs.getPrefBoolean(FPref.UI_ENABLE_MUSIC));
|
||||
|
||||
for(Pair<JCheckBox, FPref> kv: lstControls) {
|
||||
for(final Pair<JCheckBox, FPref> kv: lstControls) {
|
||||
kv.getKey().setSelected(prefs.getPrefBoolean(kv.getValue()));
|
||||
}
|
||||
view.reloadShortcuts();
|
||||
@@ -203,20 +204,12 @@ public enum CSubmenuPreferences implements ICDoc {
|
||||
updating = false;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.framework.ICDoc#getCommandOnSelect()
|
||||
*/
|
||||
@Override
|
||||
public UiCommand getCommandOnSelect() {
|
||||
return null;
|
||||
}
|
||||
|
||||
private void resetForgeSettingsToDefault() {
|
||||
String userPrompt =
|
||||
final String userPrompt =
|
||||
"This will reset all preferences to their defaults and restart Forge.\n\n" +
|
||||
"Reset and restart Forge?";
|
||||
if (FOptionPane.showConfirmDialog(userPrompt, "Reset Settings")) {
|
||||
ForgePreferences prefs = FModel.getPreferences();
|
||||
final ForgePreferences prefs = FModel.getPreferences();
|
||||
prefs.reset();
|
||||
prefs.save();
|
||||
update();
|
||||
@@ -225,7 +218,7 @@ public enum CSubmenuPreferences implements ICDoc {
|
||||
}
|
||||
|
||||
private void resetDeckEditorLayout() {
|
||||
String userPrompt =
|
||||
final String userPrompt =
|
||||
"This will reset the Deck Editor screen layout.\n" +
|
||||
"All tabbed views will be restored to their default positions.\n\n" +
|
||||
"Reset layout?";
|
||||
@@ -237,7 +230,7 @@ public enum CSubmenuPreferences implements ICDoc {
|
||||
}
|
||||
|
||||
private void resetWorkshopLayout() {
|
||||
String userPrompt =
|
||||
final String userPrompt =
|
||||
"This will reset the Workshop screen layout.\n" +
|
||||
"All tabbed views will be restored to their default positions.\n\n" +
|
||||
"Reset layout?";
|
||||
@@ -249,7 +242,7 @@ public enum CSubmenuPreferences implements ICDoc {
|
||||
}
|
||||
|
||||
private void resetMatchScreenLayout() {
|
||||
String userPrompt =
|
||||
final String userPrompt =
|
||||
"This will reset the layout of the Match screen.\n" +
|
||||
"If you want to save the current layout first, please use " +
|
||||
"the Dock tab -> Save Layout option in the Match screen.\n\n" +
|
||||
@@ -262,56 +255,53 @@ public enum CSubmenuPreferences implements ICDoc {
|
||||
}
|
||||
|
||||
private void openUserProfileDirectory() {
|
||||
try{
|
||||
try {
|
||||
if (Desktop.isDesktopSupported()) {
|
||||
Desktop.getDesktop().open(new File(ForgeConstants.USER_DIR));
|
||||
}
|
||||
}
|
||||
catch(Exception e) {
|
||||
} catch(final Exception e) {
|
||||
System.out.println("Unable to open Directory: " + e.toString());
|
||||
}
|
||||
}
|
||||
|
||||
private void openContentDirectory() {
|
||||
try{
|
||||
try {
|
||||
if (Desktop.isDesktopSupported()) {
|
||||
Desktop.getDesktop().open(new File(ForgeConstants.CACHE_DIR));
|
||||
}
|
||||
}
|
||||
catch(Exception e) {
|
||||
} catch(final Exception e) {
|
||||
System.out.println("Unable to open Directory: " + e.toString());
|
||||
}
|
||||
}
|
||||
|
||||
private void initializeGameLogVerbosityComboBox() {
|
||||
FPref userSetting = FPref.DEV_LOG_ENTRY_TYPE;
|
||||
FComboBoxPanel<GameLogEntryType> panel = this.view.getGameLogVerbosityComboBoxPanel();
|
||||
FComboBox<GameLogEntryType> comboBox = createComboBox(GameLogEntryType.values(), userSetting);
|
||||
GameLogEntryType selectedItem = GameLogEntryType.valueOf(this.prefs.getPref(userSetting));
|
||||
final FPref userSetting = FPref.DEV_LOG_ENTRY_TYPE;
|
||||
final FComboBoxPanel<GameLogEntryType> panel = this.view.getGameLogVerbosityComboBoxPanel();
|
||||
final FComboBox<GameLogEntryType> comboBox = createComboBox(GameLogEntryType.values(), userSetting);
|
||||
final GameLogEntryType selectedItem = GameLogEntryType.valueOf(this.prefs.getPref(userSetting));
|
||||
panel.setComboBox(comboBox, selectedItem);
|
||||
}
|
||||
|
||||
|
||||
private void initializeCloseActionComboBox() {
|
||||
final FComboBoxPanel<CloseAction> panel = this.view.getCloseActionComboBoxPanel();
|
||||
final FComboBox<CloseAction> comboBox = new FComboBox<CloseAction>(CloseAction.values());
|
||||
comboBox.addItemListener(new ItemListener() {
|
||||
@Override
|
||||
public void itemStateChanged(final ItemEvent e) {
|
||||
Singletons.getControl().setCloseAction((CloseAction) comboBox.getSelectedItem());
|
||||
@Override public void itemStateChanged(final ItemEvent e) {
|
||||
Singletons.getControl().setCloseAction(comboBox.getSelectedItem());
|
||||
}
|
||||
});
|
||||
panel.setComboBox(comboBox, Singletons.getControl().getCloseAction());
|
||||
}
|
||||
|
||||
private void initializeAiProfilesComboBox() {
|
||||
FPref userSetting = FPref.UI_CURRENT_AI_PROFILE;
|
||||
FComboBoxPanel<String> panel = this.view.getAiProfilesComboBoxPanel();
|
||||
FComboBox<String> comboBox = createComboBox(AiProfileUtil.getProfilesArray(), userSetting);
|
||||
String selectedItem = this.prefs.getPref(userSetting);
|
||||
final FPref userSetting = FPref.UI_CURRENT_AI_PROFILE;
|
||||
final FComboBoxPanel<String> panel = this.view.getAiProfilesComboBoxPanel();
|
||||
final FComboBox<String> comboBox = createComboBox(AiProfileUtil.getProfilesArray(), userSetting);
|
||||
final String selectedItem = this.prefs.getPref(userSetting);
|
||||
panel.setComboBox(comboBox, selectedItem);
|
||||
}
|
||||
|
||||
private <E> FComboBox<E> createComboBox(E[] items, final ForgePreferences.FPref setting) {
|
||||
private <E> FComboBox<E> createComboBox(final E[] items, final ForgePreferences.FPref setting) {
|
||||
final FComboBox<E> comboBox = new FComboBox<E>(items);
|
||||
addComboBoxListener(comboBox, setting);
|
||||
return comboBox;
|
||||
@@ -319,9 +309,8 @@ public enum CSubmenuPreferences implements ICDoc {
|
||||
|
||||
private <E> void addComboBoxListener(final FComboBox<E> comboBox, final ForgePreferences.FPref setting) {
|
||||
comboBox.addItemListener(new ItemListener() {
|
||||
@Override
|
||||
public void itemStateChanged(final ItemEvent e) {
|
||||
E selectedType = (E) comboBox.getSelectedItem();
|
||||
@Override public void itemStateChanged(final ItemEvent e) {
|
||||
final E selectedType = comboBox.getSelectedItem();
|
||||
CSubmenuPreferences.this.prefs.setPref(setting, selectedType.toString());
|
||||
CSubmenuPreferences.this.prefs.save();
|
||||
}
|
||||
@@ -329,22 +318,21 @@ public enum CSubmenuPreferences implements ICDoc {
|
||||
}
|
||||
|
||||
private void initializePlayerNameButton() {
|
||||
FLabel btn = view.getBtnPlayerName();
|
||||
final FLabel btn = view.getBtnPlayerName();
|
||||
setPlayerNameButtonText();
|
||||
btn.setCommand(getPlayerNameButtonCommand());
|
||||
}
|
||||
|
||||
private void setPlayerNameButtonText() {
|
||||
FLabel btn = view.getBtnPlayerName();
|
||||
String name = prefs.getPref(FPref.PLAYER_NAME);
|
||||
final FLabel btn = view.getBtnPlayerName();
|
||||
final String name = prefs.getPref(FPref.PLAYER_NAME);
|
||||
btn.setText(StringUtils.isBlank(name) ? "Human" : name);
|
||||
}
|
||||
|
||||
@SuppressWarnings("serial")
|
||||
private UiCommand getPlayerNameButtonCommand() {
|
||||
return new UiCommand() {
|
||||
@Override
|
||||
public void run() {
|
||||
@Override public void run() {
|
||||
GamePlayerUtil.setPlayerName();
|
||||
setPlayerNameButtonText();
|
||||
}
|
||||
|
||||
@@ -6,26 +6,25 @@
|
||||
* 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 forge.screens.home.settings;
|
||||
|
||||
import forge.UiCommand;
|
||||
import forge.gui.framework.ICDoc;
|
||||
import forge.properties.ForgeConstants;
|
||||
import forge.util.FileUtil;
|
||||
|
||||
/**
|
||||
/**
|
||||
* Controller for VSubmenuReleaseNotes submenu in the home UI.
|
||||
*
|
||||
*
|
||||
* @version $Id$
|
||||
*
|
||||
*/
|
||||
@@ -45,7 +44,7 @@ public enum CSubmenuReleaseNotes implements ICDoc {
|
||||
* @see forge.control.home.IControlSubmenu#update()
|
||||
*/
|
||||
@Override
|
||||
public void initialize() {
|
||||
public void initialize() {
|
||||
this.view = VSubmenuReleaseNotes.SINGLETON_INSTANCE;
|
||||
//this.prefs = FModel.getPreferences();
|
||||
}
|
||||
@@ -54,40 +53,32 @@ public enum CSubmenuReleaseNotes implements ICDoc {
|
||||
* @see forge.control.home.IControlSubmenu#update()
|
||||
*/
|
||||
@Override
|
||||
public void update() {
|
||||
this.view = VSubmenuReleaseNotes.SINGLETON_INSTANCE;
|
||||
//this.prefs = FModel.getPreferences();
|
||||
setReleaseNotesContent();
|
||||
public void update() {
|
||||
this.view = VSubmenuReleaseNotes.SINGLETON_INSTANCE;
|
||||
//this.prefs = FModel.getPreferences();
|
||||
setReleaseNotesContent();
|
||||
}
|
||||
|
||||
|
||||
private void setReleaseNotesContent() {
|
||||
if (!this.isReleaseNotesUpdated) {
|
||||
this.view.setReleaseNotesContent(getReleaseNotes());
|
||||
this.isReleaseNotesUpdated = true;
|
||||
}
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see forge.gui.framework.ICDoc#getCommandOnSelect()
|
||||
*/
|
||||
@Override
|
||||
public UiCommand getCommandOnSelect() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns content of CHANGES.txt.
|
||||
*/
|
||||
private String getReleaseNotes() {
|
||||
private static String getReleaseNotes() {
|
||||
// !! Linux is case-sensitive so file name and extension need to match exactly !!
|
||||
String filename = ForgeConstants.CHANGES_FILE;
|
||||
String filePath = FileUtil.pathCombine(System.getProperty("user.dir"), filename);
|
||||
final String filename = ForgeConstants.CHANGES_FILE;
|
||||
final String filePath = FileUtil.pathCombine(System.getProperty("user.dir"), filename);
|
||||
String notes;
|
||||
|
||||
|
||||
if (FileUtil.doesFileExist(filePath)) {
|
||||
notes = filePath + "\n\n" + FileUtil.readFileToString(filePath);
|
||||
notes = filePath + "\n\n" + FileUtil.readFileToString(filePath);
|
||||
} else {
|
||||
notes = filePath + "\nis MISSING!";
|
||||
notes = filePath + "\nis MISSING!";
|
||||
}
|
||||
|
||||
return notes;
|
||||
|
||||
@@ -126,7 +126,7 @@ public enum VSubmenuAchievements implements IVSubmenu<CSubmenuAchievements> {
|
||||
cbCollections.addActionListener(new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
setAchievements((AchievementCollection)cbCollections.getSelectedItem());
|
||||
setAchievements(cbCollections.getSelectedItem());
|
||||
}
|
||||
});
|
||||
cbCollections.setSelectedIndex(0);
|
||||
|
||||
@@ -6,12 +6,12 @@
|
||||
* 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/>.
|
||||
*/
|
||||
@@ -42,7 +42,6 @@ import forge.FThreads;
|
||||
import forge.ImageCache;
|
||||
import forge.LobbyPlayer;
|
||||
import forge.Singletons;
|
||||
import forge.UiCommand;
|
||||
import forge.assets.FSkinProp;
|
||||
import forge.control.KeyboardShortcuts;
|
||||
import forge.deck.CardPool;
|
||||
@@ -109,7 +108,7 @@ import forge.view.arcane.FloatingCardArea;
|
||||
* top-level control for child UIs. Tasks targeting the view of individual
|
||||
* components are found in a separate controller for that component and
|
||||
* should not be included here.
|
||||
*
|
||||
*
|
||||
* <br><br><i>(C at beginning of class name denotes a control class.)</i>
|
||||
*/
|
||||
public final class CMatchUI
|
||||
@@ -117,7 +116,7 @@ public final class CMatchUI
|
||||
implements ICDoc, IMenuProvider {
|
||||
|
||||
private final FScreen screen;
|
||||
private VMatchUI view;
|
||||
private final VMatchUI view;
|
||||
private final CMatchUIMenus menus = new CMatchUIMenus(this);
|
||||
private final Map<EDocID, IVDoc<? extends ICDoc>> myDocs;
|
||||
private final TargetingOverlay targetingOverlay = new TargetingOverlay(this);
|
||||
@@ -237,11 +236,11 @@ public final class CMatchUI
|
||||
}
|
||||
|
||||
private SkinImage getPlayerAvatar(final PlayerView p, final int defaultIndex) {
|
||||
if (avatarImages.containsKey(p.getLobbyPlayerName())) {
|
||||
if (avatarImages.containsKey(p.getLobbyPlayerName())) {
|
||||
return ImageCache.getIcon(avatarImages.get(p.getLobbyPlayerName()));
|
||||
}
|
||||
|
||||
int avatarIdx = p.getAvatarIndex();
|
||||
final int avatarIdx = p.getAvatarIndex();
|
||||
return FSkin.getAvatars().get(avatarIdx >= 0 ? avatarIdx : defaultIndex);
|
||||
}
|
||||
|
||||
@@ -335,7 +334,7 @@ public final class CMatchUI
|
||||
cDetailPicture.showItem(item);
|
||||
}
|
||||
|
||||
private int getPlayerIndex(PlayerView player) {
|
||||
private int getPlayerIndex(final PlayerView player) {
|
||||
return sortedPlayers.indexOf(player);
|
||||
}
|
||||
|
||||
@@ -344,7 +343,7 @@ public final class CMatchUI
|
||||
final CombatView combat = getGameView().getCombat();
|
||||
if (combat != null && combat.getNumAttackers() > 0 && getGameView().peekStack() == null) {
|
||||
if (selectedDocBeforeCombat == null) {
|
||||
IVDoc<? extends ICDoc> combatDoc = EDocID.REPORT_COMBAT.getDoc();
|
||||
final IVDoc<? extends ICDoc> combatDoc = EDocID.REPORT_COMBAT.getDoc();
|
||||
if (combatDoc.getParentCell() != null) {
|
||||
selectedDocBeforeCombat = combatDoc.getParentCell().getSelected();
|
||||
if (selectedDocBeforeCombat != combatDoc) {
|
||||
@@ -458,11 +457,6 @@ public final class CMatchUI
|
||||
return menus.getMenus();
|
||||
}
|
||||
|
||||
@Override
|
||||
public UiCommand getCommandOnSelect() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void register() {
|
||||
initHandViews();
|
||||
@@ -516,7 +510,7 @@ public final class CMatchUI
|
||||
/**
|
||||
* Find the card panel belonging to a card, bringing up the corresponding
|
||||
* window or tab if necessary.
|
||||
*
|
||||
*
|
||||
* @param card
|
||||
* the {@link CardView} to find a panel for.
|
||||
* @return a {@link CardPanel}, or {@code null} if no corresponding panel is
|
||||
@@ -554,6 +548,7 @@ public final class CMatchUI
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateButtons(final PlayerView owner, final String label1, final String label2, final boolean enable1, final boolean enable2, final boolean focus1) {
|
||||
final FButton btn1 = view.getBtnOK(), btn2 = view.getBtnCancel();
|
||||
btn1.setText(label1);
|
||||
@@ -574,7 +569,7 @@ public final class CMatchUI
|
||||
|
||||
@Override
|
||||
public void flashIncorrectAction() {
|
||||
SDisplayUtil.remind(getCPrompt().getView());
|
||||
getCPrompt().remind();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -591,7 +586,7 @@ public final class CMatchUI
|
||||
|
||||
@Override
|
||||
public void updateTurn(final PlayerView player) {
|
||||
VField nextField = getFieldViewFor(player);
|
||||
final VField nextField = getFieldViewFor(player);
|
||||
SDisplayUtil.showTab(nextField);
|
||||
cPrompt.updateText();
|
||||
repaintCardOverlays();
|
||||
@@ -622,7 +617,7 @@ public final class CMatchUI
|
||||
FloatingCardArea.closeAll(); //ensure floating card areas cleared and closed after the game
|
||||
final GameView gameView = getGameView();
|
||||
if (hasLocalPlayers() || gameView.isMatchOver()) {
|
||||
new ViewWinLose(gameView, this);
|
||||
new ViewWinLose(gameView, this).show();
|
||||
}
|
||||
if (showOverlay) {
|
||||
SOverlayUtils.showOverlay();
|
||||
@@ -652,7 +647,7 @@ public final class CMatchUI
|
||||
|
||||
/**
|
||||
* Highlight a card on the playfield.
|
||||
*
|
||||
*
|
||||
* @param card
|
||||
* a card to be highlighted
|
||||
*/
|
||||
@@ -759,6 +754,7 @@ public final class CMatchUI
|
||||
cPrompt.setMessage(message);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object showManaPool(final PlayerView player) {
|
||||
return null; //not needed since mana pool icons are always visible
|
||||
}
|
||||
@@ -809,12 +805,6 @@ public final class CMatchUI
|
||||
Singletons.getControl().setCurrentScreen(screen);
|
||||
SDisplayUtil.showTab(EDocID.REPORT_LOG.getDoc());
|
||||
|
||||
// per player observers were set in CMatchUI.SINGLETON_INSTANCE.initMatch
|
||||
//Set Field shown to current player.
|
||||
//if (util.getHumanCount() > 0) {
|
||||
final VField nextField = getFieldViewFor(gameView.getPlayers().get(0));
|
||||
SDisplayUtil.showTab(nextField);
|
||||
//}
|
||||
SOverlayUtils.hideOverlay();
|
||||
}
|
||||
|
||||
@@ -951,7 +941,7 @@ public final class CMatchUI
|
||||
final List<VField> fieldViews = getFieldViews();
|
||||
|
||||
// Human field is at index [0]
|
||||
PhaseIndicator fvHuman = fieldViews.get(0).getPhaseIndicator();
|
||||
final PhaseIndicator fvHuman = fieldViews.get(0).getPhaseIndicator();
|
||||
fvHuman.getLblUpkeep().setEnabled(prefs.getPrefBoolean(FPref.PHASE_HUMAN_UPKEEP));
|
||||
fvHuman.getLblDraw().setEnabled(prefs.getPrefBoolean(FPref.PHASE_HUMAN_DRAW));
|
||||
fvHuman.getLblMain1().setEnabled(prefs.getPrefBoolean(FPref.PHASE_HUMAN_MAIN1));
|
||||
@@ -967,7 +957,7 @@ public final class CMatchUI
|
||||
|
||||
// AI field is at index [1], ...
|
||||
for (int i = 1; i < fieldViews.size(); i++) {
|
||||
PhaseIndicator fvAi = fieldViews.get(i).getPhaseIndicator();
|
||||
final PhaseIndicator fvAi = fieldViews.get(i).getPhaseIndicator();
|
||||
fvAi.getLblUpkeep().setEnabled(prefs.getPrefBoolean(FPref.PHASE_AI_UPKEEP));
|
||||
fvAi.getLblDraw().setEnabled(prefs.getPrefBoolean(FPref.PHASE_AI_DRAW));
|
||||
fvAi.getLblMain1().setEnabled(prefs.getPrefBoolean(FPref.PHASE_AI_MAIN1));
|
||||
@@ -981,17 +971,15 @@ public final class CMatchUI
|
||||
fvAi.getLblEndTurn().setEnabled(prefs.getPrefBoolean(FPref.PHASE_AI_EOT));
|
||||
fvAi.getLblCleanup().setEnabled(prefs.getPrefBoolean(FPref.PHASE_AI_CLEANUP));
|
||||
}
|
||||
|
||||
//Singletons.getView().getViewMatch().setLayoutParams(prefs.getPref(FPref.UI_LAYOUT_PARAMS));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void message(String message, String title) {
|
||||
public void message(final String message, final String title) {
|
||||
SOptionPane.showMessageDialog(message, title);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void showErrorDialog(String message, String title) {
|
||||
public void showErrorDialog(final String message, final String title) {
|
||||
SOptionPane.showErrorDialog(message, title);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,20 +1,30 @@
|
||||
package forge.screens.match;
|
||||
|
||||
import java.awt.AWTEvent;
|
||||
import java.awt.Cursor;
|
||||
import java.awt.Dimension;
|
||||
import java.awt.Rectangle;
|
||||
import java.awt.event.ComponentAdapter;
|
||||
import java.awt.event.ComponentEvent;
|
||||
import java.awt.event.MouseEvent;
|
||||
|
||||
import javax.swing.JComponent;
|
||||
import javax.swing.JLayer;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.JScrollBar;
|
||||
import javax.swing.JTextArea;
|
||||
import javax.swing.ScrollPaneConstants;
|
||||
import javax.swing.Scrollable;
|
||||
import javax.swing.SwingUtilities;
|
||||
import javax.swing.border.EmptyBorder;
|
||||
import javax.swing.plaf.LayerUI;
|
||||
|
||||
import net.miginfocom.swing.MigLayout;
|
||||
import forge.gui.MouseUtil;
|
||||
import forge.toolbox.FScrollPane;
|
||||
import forge.toolbox.FSkin;
|
||||
import forge.toolbox.FSkin.SkinFont;
|
||||
import forge.toolbox.FSkin.SkinnedTextArea;
|
||||
import net.miginfocom.swing.MigLayout;
|
||||
|
||||
import javax.swing.*;
|
||||
import javax.swing.border.EmptyBorder;
|
||||
import javax.swing.plaf.LayerUI;
|
||||
|
||||
import java.awt.*;
|
||||
import java.awt.event.ComponentAdapter;
|
||||
import java.awt.event.ComponentEvent;
|
||||
import java.awt.event.MouseEvent;
|
||||
|
||||
@SuppressWarnings("serial")
|
||||
public class GameLogPanel extends JPanel {
|
||||
@@ -22,7 +32,7 @@ public class GameLogPanel extends JPanel {
|
||||
private MyScrollablePanel scrollablePanel;
|
||||
private SkinFont textFont = FSkin.getFont();
|
||||
|
||||
private LayerUI<FScrollPane> layerUI = new GameLogPanelLayerUI();
|
||||
private final LayerUI<FScrollPane> layerUI = new GameLogPanelLayerUI();
|
||||
private JLayer<FScrollPane> layer;
|
||||
private boolean isScrollBarVisible = false;
|
||||
|
||||
@@ -55,7 +65,7 @@ public class GameLogPanel extends JPanel {
|
||||
private void setResizeListener() {
|
||||
addComponentListener(new ComponentAdapter() {
|
||||
@Override
|
||||
public void componentResized(ComponentEvent arg0) {
|
||||
public void componentResized(final ComponentEvent arg0) {
|
||||
forceVerticalScrollbarToMax();
|
||||
}
|
||||
});
|
||||
@@ -101,7 +111,7 @@ public class GameLogPanel extends JPanel {
|
||||
SwingUtilities.invokeLater(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
JScrollBar scrollbar = scrollPane.getVerticalScrollBar();
|
||||
final JScrollBar scrollbar = scrollPane.getVerticalScrollBar();
|
||||
scrollbar.setValue(scrollbar.getMaximum());
|
||||
// This is needed to ensure scrollbar is set to max correctly.
|
||||
scrollPane.validate();
|
||||
@@ -131,11 +141,11 @@ public class GameLogPanel extends JPanel {
|
||||
|
||||
}
|
||||
|
||||
public void setTextFont(SkinFont newFont) {
|
||||
public void setTextFont(final SkinFont newFont) {
|
||||
this.textFont = newFont;
|
||||
}
|
||||
|
||||
private JTextArea createNewLogEntryJTextArea(String text, boolean useAlternateBackColor) {
|
||||
private JTextArea createNewLogEntryJTextArea(final String text, final boolean useAlternateBackColor) {
|
||||
final SkinnedTextArea tar = new SkinnedTextArea(text);
|
||||
tar.setFont(textFont);
|
||||
tar.setBorder(new EmptyBorder(3, 4, 3, 4));
|
||||
@@ -155,23 +165,28 @@ public class GameLogPanel extends JPanel {
|
||||
|
||||
protected final class MyScrollablePanel extends JPanel implements Scrollable {
|
||||
|
||||
@Override
|
||||
public Dimension getPreferredScrollableViewportSize() {
|
||||
return getPreferredSize();
|
||||
}
|
||||
|
||||
public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) {
|
||||
@Override
|
||||
public int getScrollableUnitIncrement(final Rectangle visibleRect, final int orientation, final int direction) {
|
||||
return textFont.getSize();
|
||||
}
|
||||
|
||||
public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) {
|
||||
@Override
|
||||
public int getScrollableBlockIncrement(final Rectangle visibleRect, final int orientation, final int direction) {
|
||||
return textFont.getSize();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean getScrollableTracksViewportWidth() {
|
||||
return true;
|
||||
}
|
||||
|
||||
// we don't want to track the height, because we want to scroll vertically.
|
||||
@Override
|
||||
public boolean getScrollableTracksViewportHeight() {
|
||||
return false;
|
||||
}
|
||||
@@ -181,25 +196,25 @@ public class GameLogPanel extends JPanel {
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public void installUI(JComponent c) {
|
||||
public void installUI(final JComponent c) {
|
||||
super.installUI(c);
|
||||
JLayer<FScrollPane> l = (JLayer<FScrollPane>)c;
|
||||
final JLayer<FScrollPane> l = (JLayer<FScrollPane>)c;
|
||||
l.setLayerEventMask(AWTEvent.MOUSE_EVENT_MASK);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public void uninstallUI(JComponent c) {
|
||||
public void uninstallUI(final JComponent c) {
|
||||
super.uninstallUI(c);
|
||||
JLayer<FScrollPane> l = (JLayer<FScrollPane>)c;
|
||||
final JLayer<FScrollPane> l = (JLayer<FScrollPane>)c;
|
||||
l.setLayerEventMask(0);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void processMouseEvent(MouseEvent e, JLayer<? extends FScrollPane> l) {
|
||||
protected void processMouseEvent(final MouseEvent e, final JLayer<? extends FScrollPane> l) {
|
||||
|
||||
boolean isScrollBarRequired = scrollPane.getVerticalScrollBar().getMaximum() > getHeight();
|
||||
boolean isHoveringOverLogEntry = e.getSource() instanceof JTextArea;
|
||||
final boolean isScrollBarRequired = scrollPane.getVerticalScrollBar().getMaximum() > getHeight();
|
||||
final boolean isHoveringOverLogEntry = e.getSource() instanceof JTextArea;
|
||||
|
||||
switch (e.getID()) {
|
||||
case MouseEvent.MOUSE_ENTERED:
|
||||
|
||||
@@ -5,12 +5,12 @@
|
||||
* 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/>.
|
||||
*/
|
||||
@@ -19,17 +19,12 @@ package forge.screens.match;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
|
||||
import forge.Singletons;
|
||||
import forge.assets.FSkinProp;
|
||||
import forge.game.GameView;
|
||||
import forge.gui.SOverlayUtils;
|
||||
import forge.gui.framework.FScreen;
|
||||
import forge.match.NextGameDecision;
|
||||
import forge.model.FModel;
|
||||
import forge.quest.QuestController;
|
||||
import forge.quest.QuestDraftUtils;
|
||||
import forge.screens.home.quest.CSubmenuChallenges;
|
||||
import forge.screens.home.quest.CSubmenuDuels;
|
||||
import forge.screens.home.quest.CSubmenuQuestDraft;
|
||||
import forge.screens.home.quest.VSubmenuQuestDraft;
|
||||
import forge.toolbox.FOptionPane;
|
||||
@@ -42,22 +37,20 @@ import forge.toolbox.FSkin;
|
||||
* Processes win/lose presentation for Quest events. This presentation is
|
||||
* displayed by WinLoseFrame. Components to be added to pnlCustom in
|
||||
* WinLoseFrame should use MigLayout.
|
||||
*
|
||||
*
|
||||
*/
|
||||
public class QuestDraftWinLose extends ControlWinLose {
|
||||
private final transient ViewWinLose view;
|
||||
private final transient QuestController qData;
|
||||
|
||||
/**
|
||||
* Instantiates a new quest win lose handler.
|
||||
*
|
||||
*
|
||||
* @param view0 ViewWinLose object
|
||||
* @param match2
|
||||
*/
|
||||
public QuestDraftWinLose(final ViewWinLose view0, final GameView game0, final CMatchUI matchUI) {
|
||||
super(view0, game0, matchUI);
|
||||
this.view = view0;
|
||||
qData = FModel.getQuest();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -66,17 +59,17 @@ public class QuestDraftWinLose extends ControlWinLose {
|
||||
* </p>
|
||||
* Checks conditions of win and fires various reward display methods
|
||||
* accordingly.
|
||||
*
|
||||
*
|
||||
* @return true, if successful
|
||||
*/
|
||||
@Override
|
||||
public final boolean populateCustomPanel() {
|
||||
QuestController quest = FModel.getQuest();
|
||||
final QuestController quest = FModel.getQuest();
|
||||
final boolean gameHadHumanPlayer = matchUI.hasLocalPlayers();
|
||||
|
||||
if (lastGame.isMatchOver()) {
|
||||
final String winner = lastGame.getWinningPlayerName();
|
||||
|
||||
|
||||
quest.getAchievements().getCurrentDraft().setWinner(winner);
|
||||
quest.save();
|
||||
}
|
||||
@@ -125,17 +118,4 @@ public class QuestDraftWinLose extends ControlWinLose {
|
||||
return false; //We're not awarding anything, so never display the custom panel.
|
||||
}
|
||||
|
||||
public final void actionOnQuitMatch() {
|
||||
CSubmenuDuels.SINGLETON_INSTANCE.update();
|
||||
CSubmenuChallenges.SINGLETON_INSTANCE.update();
|
||||
|
||||
qData.setCurrentEvent(null);
|
||||
qData.save();
|
||||
FModel.getQuestPreferences().save();
|
||||
matchUI.writeMatchPreferences();
|
||||
|
||||
Singletons.getControl().setCurrentScreen(FScreen.HOME_SCREEN);
|
||||
|
||||
SOverlayUtils.hideOverlay();
|
||||
}
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user