Changeset 621 for AE/installer2/src


Ignore:
Timestamp:
Jan 15, 2013, 9:02:01 PM (12 years ago)
Author:
alloc
Message:

AEI2:

  • Added offline detection (should run without internet connection)
  • Update check (manual/on startup), not actually updating yet
Location:
AE/installer2/src/net/oni2/aeinstaller
Files:
1 added
12 edited

Legend:

Unmodified
Added
Removed
  • AE/installer2/src/net/oni2/aeinstaller/AEInstaller.properties

    r618 r621  
    11appname=AE Installer 2
    2 appversion=0.80
     2appversion=0.81
    33
    44invalidPath.title=Wrong directory
     
    77dotNetMissing.title=.NET is not installed
    88dotNetMissing.text=.NET, which is required to use this tool, is not installed on this machine.<br>Please download and install it:<br>%1
     9
     10offlineMode.title=Offline mode
     11offlineMode.text=Connection to the ModDepot could not be established.\nAEI will run in offline mode.\nUpdates or installation of mods not already downloaded will not be possible.
  • AE/installer2/src/net/oni2/aeinstaller/AEInstaller2.java

    r612 r621  
    177177                }
    178178
     179                boolean offline = !DepotManager.getInstance().checkConnection();
     180                if (offline) {
     181                        JOptionPane.showMessageDialog(null,
     182                                        basicBundle.getString("offlineMode.text"),
     183                                        basicBundle.getString("offlineMode.title"),
     184                                        JOptionPane.INFORMATION_MESSAGE);
     185                }
     186                Settings.getInstance().setOfflineMode(offline);
     187
    179188                SwingUtilities.invokeLater(new Runnable() {
    180189                        public void run() {
  • AE/installer2/src/net/oni2/aeinstaller/Images.properties

    r608 r621  
    2828img.install=/net/oni2/aeinstaller/images/open_icon_library/run-build-install-root.png
    2929img.folder=/net/oni2/aeinstaller/images/open_icon_library/folder-open-3.png
     30img.update=/net/oni2/aeinstaller/images/open_icon_library/system-software-update-2.png
    3031
    3132img.ae=/net/oni2/aeinstaller/images/AElogo.png
  • AE/installer2/src/net/oni2/aeinstaller/backend/Settings.java

    r619 r621  
    6565
    6666        private boolean printNamesNotInMap = false;
     67
     68        private boolean offlineMode = false;
    6769
    6870        /**
     
    161163
    162164        /**
     165         * @return Is offline?
     166         */
     167        public boolean isOfflineMode() {
     168                return offlineMode;
     169        }
     170
     171        /**
     172         * @param offline
     173         *            Is offline?
     174         */
     175        public void setOfflineMode(boolean offline) {
     176                this.offlineMode = offline;
     177        }
     178
     179        /**
    163180         * @return Mod Depot cache filename
    164181         */
  • AE/installer2/src/net/oni2/aeinstaller/backend/depot/DepotConfig.java

    r604 r621  
    11package net.oni2.aeinstaller.backend.depot;
     2
     3import net.oni2.aeinstaller.backend.Settings;
    24
    35/**
     
    7678                return 8000;
    7779        }
     80
     81        /**
     82         * @return URL of Depot
     83         */
     84        public static String getDepotUrl() {
     85                return Settings.getInstance().get("depot_url", "http://mods.oni2.net/");
     86        }
     87
     88        /**
     89         * @return URL of Depot API
     90         */
     91        public static String getDepotApiUrl() {
     92                return Settings.getInstance().get("depot_api_url",
     93                                "http://mods.oni2.net/?q=api/");
     94        }
    7895}
  • AE/installer2/src/net/oni2/aeinstaller/backend/depot/DepotManager.java

    r605 r621  
    55import java.io.FileOutputStream;
    66import java.io.IOException;
     7import java.io.UnsupportedEncodingException;
     8import java.net.UnknownHostException;
    79import java.util.HashMap;
    810import java.util.HashSet;
     
    2123import net.oni2.aeinstaller.backend.network.DrupalJSONQuery;
    2224
     25import org.apache.http.HttpResponse;
     26import org.apache.http.client.methods.HttpGet;
     27import org.apache.http.client.methods.HttpRequestBase;
     28import org.apache.http.impl.client.DefaultHttpClient;
    2329import org.json.JSONArray;
    2430import org.json.JSONException;
     
    221227
    222228        /**
     229         * @return Can we connect to the Depot?
     230         */
     231        public boolean checkConnection() {
     232                HttpRequestBase httpQuery = null;
     233
     234                try {
     235                        DefaultHttpClient httpclient = new DefaultHttpClient();
     236                        httpQuery = new HttpGet(DepotConfig.getDepotUrl());
     237
     238                        HttpResponse response = httpclient.execute(httpQuery);
     239
     240                        int code = response.getStatusLine().getStatusCode();
     241
     242                        return (code >= 200) && (code <= 299);
     243                } catch (UnknownHostException e) {
     244                } catch (UnsupportedEncodingException e) {
     245                        e.printStackTrace();
     246                } catch (IOException e) {
     247                        e.printStackTrace();
     248                } finally {
     249                        if (httpQuery != null)
     250                                httpQuery.releaseConnection();
     251                }
     252                return false;
     253        }
     254
     255        /**
    223256         * @return All TaxVocabs
    224257         */
  • AE/installer2/src/net/oni2/aeinstaller/backend/mods/ModManager.java

    r608 r621  
    182182
    183183        /**
     184         * @return Mods which are already locally available
     185         */
     186        public TreeSet<Mod> getLocalAvailableMods() {
     187                TreeSet<Mod> res = new TreeSet<Mod>();
     188                for (Mod m : mods.values()) {
     189                        if (m.isLocalAvailable())
     190                                res.add(m);
     191                }
     192                return res;
     193        }
     194
     195        /**
     196         * @return Mods which can be updated
     197         */
     198        public TreeSet<Mod> getUpdatableMods() {
     199                TreeSet<Mod> res = new TreeSet<Mod>();
     200                for (Mod m : getLocalAvailableMods()) {
     201                        if (m.isNewerAvailable())
     202                                res.add(m);
     203                }
     204                return res;
     205        }
     206
     207        /**
    184208         * @return Collection of tools valid on this platform and not mandatory
    185209         */
     
    199223                for (Mod m : tools.values()) {
    200224                        if (m.isValidOnPlatform() && m.isMandatoryMod())
     225                                res.add(m);
     226                }
     227                return res;
     228        }
     229
     230        /**
     231         * @return Tools which are already locally available
     232         */
     233        public TreeSet<Mod> getLocalAvailableTools() {
     234                TreeSet<Mod> res = new TreeSet<Mod>();
     235                for (Mod m : tools.values()) {
     236                        if (m.isLocalAvailable())
     237                                res.add(m);
     238                }
     239                return res;
     240        }
     241
     242        /**
     243         * @return Tools which can be updated
     244         */
     245        public TreeSet<Mod> getUpdatableTools() {
     246                TreeSet<Mod> res = new TreeSet<Mod>();
     247                for (Mod m : getLocalAvailableTools()) {
     248                        if (m.isNewerAvailable())
    201249                                res.add(m);
    202250                }
  • AE/installer2/src/net/oni2/aeinstaller/backend/mods/download/ModDownload.java

    r605 r621  
    8080                        unpacker = new Unpacker(zipFile, targetFolder, this);
    8181                } catch (IOException e) {
    82                         // TODO Auto-generated catch block
    8382                        e.printStackTrace();
    8483                }
  • AE/installer2/src/net/oni2/aeinstaller/backend/network/DrupalJSONQuery.java

    r605 r621  
    99import java.util.List;
    1010
    11 import net.oni2.aeinstaller.backend.Settings;
     11import net.oni2.aeinstaller.backend.depot.DepotConfig;
    1212
    1313import org.apache.http.HttpEntity;
     
    2929 */
    3030public class DrupalJSONQuery {
    31 
    32         private static String getDepotUrl() {
    33                 return Settings.getInstance().get("depot_api_url",
    34                                 "http://mods.oni2.net/?q=api/");
    35         }
    3631
    3732        /**
     
    5651                        }
    5752                        HttpEntity data = new UrlEncodedFormEntity(nvps);
    58                         return executeQuery(getDepotUrl() + resource + "/" + action
     53                        return executeQuery(DepotConfig.getDepotApiUrl() + resource + "/" + action
    5954                                        + ".json", data);
    6055                } catch (UnsupportedEncodingException e) {
     
    8075                        String refName) throws Exception {
    8176                return executeQuery(
    82                                 getDepotUrl() + resource + "/" + Integer.toString(index) + "/"
     77                                DepotConfig.getDepotApiUrl() + resource + "/" + Integer.toString(index) + "/"
    8378                                                + refName + ".json", null);
    8479        }
     
    10095                        String parameters) throws Exception {
    10196                return executeQuery(
    102                                 getDepotUrl() + resource + "/" + Integer.toString(index)
     97                                DepotConfig.getDepotApiUrl() + resource + "/" + Integer.toString(index)
    10398                                                + ".json" + parameters, null);
    10499        }
     
    126121                if (pagesize >= 0)
    127122                        pagesizeN = "&pagesize=" + Integer.toString(pagesize);
    128                 return executeQuery(getDepotUrl() + resource + ".json" + pageN
     123                return executeQuery(DepotConfig.getDepotApiUrl() + resource + ".json" + pageN
    129124                                + pagesizeN, null);
    130125        }
  • AE/installer2/src/net/oni2/aeinstaller/gui/MainWin.java

    r619 r621  
    5252import net.oni2.aeinstaller.backend.oni.InstallProgressListener;
    5353import net.oni2.aeinstaller.backend.oni.Installer;
     54import net.oni2.aeinstaller.backend.oni.OniSplit;
    5455import net.oni2.aeinstaller.gui.about.AboutDialog;
    5556import net.oni2.aeinstaller.gui.downloadwindow.Downloader;
     
    9293        private JLabel lblTypesVal;
    9394        private JLabel lblPlatformVal;
     95        private JLabel lblPackageNumberVal;
    9496        private HTMLLinkLabel lblDescriptionVal;
    9597
    9698        private JButton btnInstall;
     99
     100        private TreeSet<Mod> execUpdates = null;
     101
     102        private enum EInstallResult {
     103                DONE,
     104                OFFLINE,
     105                INCOMPATIBLE
     106        };
     107
     108        private EInstallResult installDone = EInstallResult.DONE;
    97109
    98110        /**
     
    228240        @DoInBackground(progressMessage = "updateDepot.title", cancelable = false, indeterminateProgress = false)
    229241        private void execDepotUpdate(final BackgroundEvent evt) {
    230                 try {
    231                         DepotManager.getInstance().updateInformation(false,
    232                                         new DepotCacheUpdateProgressListener() {
    233 
    234                                                 @Override
    235                                                 public void cacheUpdateProgress(String stepName,
    236                                                                 int current, int total) {
    237                                                         evt.setProgressEnd(total);
    238                                                         evt.setProgressValue(current);
    239                                                         evt.setProgressMessage(stepName);
    240                                                 }
    241                                         });
    242                         ModManager.getInstance().init();
    243                         initTable();
    244                         initModTypeBox();
    245 
    246                         tblMods.setVisible(true);
    247                 } catch (Exception e) {
    248                         e.printStackTrace();
    249                 }
    250         }
    251 
    252         @SuppressWarnings("unused")
    253         private void checkUpdates() {
    254                 if (Settings.getInstance().get("notifyupdates", true)) {
     242                if (!Settings.getInstance().isOfflineMode()) {
     243                        try {
     244                                DepotManager.getInstance().updateInformation(false,
     245                                                new DepotCacheUpdateProgressListener() {
     246
     247                                                        @Override
     248                                                        public void cacheUpdateProgress(String stepName,
     249                                                                        int current, int total) {
     250                                                                evt.setProgressEnd(total);
     251                                                                evt.setProgressValue(current);
     252                                                                evt.setProgressMessage(stepName);
     253                                                        }
     254                                                });
     255                        } catch (Exception e) {
     256                                e.printStackTrace();
     257                        }
     258                }
     259                ModManager.getInstance().init();
     260                initTable();
     261                initModTypeBox();
     262
     263                tblMods.setVisible(true);
     264        }
     265
     266        @SuppressWarnings("unused")
     267        private void checkUpdates(Object evtSource) {
     268                if ((evtSource != this)
     269                                || Settings.getInstance().get("notifyupdates", true)) {
     270                        if (Settings.getInstance().isOfflineMode()) {
     271                                if (evtSource != this) {
     272                                        JOptionPane.showMessageDialog(this,
     273                                                        bundle.getString("offlineMode.text"),
     274                                                        bundle.getString("offlineMode.title"),
     275                                                        JOptionPane.WARNING_MESSAGE);
     276                                }
     277                        } else {
     278                                TreeSet<Mod> mods = ModManager.getInstance().getUpdatableMods();
     279                                TreeSet<Mod> tools = ModManager.getInstance()
     280                                                .getUpdatableTools();
     281                                int size = 0;
     282                                String strMods = "";
     283                                for (Mod m : mods) {
     284                                        size += m.getZipSize();
     285                                        if (strMods.length() > 0)
     286                                                strMods += "<br>";
     287                                        strMods += " - " + m.getName();
     288                                }
     289                                String strTools = "";
     290                                for (Mod m : tools) {
     291                                        size += m.getZipSize();
     292                                        if (strTools.length() > 0)
     293                                                strTools += "<br>";
     294                                        strTools += " - " + m.getName();
     295                                }
     296                                String message = "<html>";
     297                                message += String.format(
     298                                                bundle.getString("updatesAvailable.text"), strMods,
     299                                                strTools, SizeFormatter.format(size, 3));
     300                                message += "</html>";
     301                                int res = JOptionPane
     302                                                .showConfirmDialog(this, message,
     303                                                                bundle.getString("updatesAvailable.title"),
     304                                                                JOptionPane.YES_NO_OPTION,
     305                                                                JOptionPane.QUESTION_MESSAGE);
     306                                if (res == JOptionPane.YES_OPTION) {
     307                                        execUpdates = new TreeSet<Mod>();
     308                                        execUpdates.addAll(mods);
     309                                        execUpdates.addAll(tools);
     310                                }
     311                        }
     312                }
     313        }
     314
     315        @DoInBackground(progressMessage = "doUpdate.title", cancelable = false, indeterminateProgress = false)
     316        private void doUpdate(final BackgroundEvent evt) {
     317                if (execUpdates != null) {
    255318                        // TODO
    256                 }
     319                        System.out.println("Update: " + execUpdates.toString());
     320                        // TODO: install new tools if previously installed
     321                }
     322                execUpdates = null;
    257323        }
    258324
     
    351417        @DoInBackground(progressMessage = "mandatoryFiles.title", cancelable = false, indeterminateProgress = false)
    352418        private void checkMandatoryFiles(final BackgroundEvent evt) {
    353                 TreeSet<Mod> mand = new TreeSet<Mod>();
    354                 for (Mod m : ModManager.getInstance().getMandatoryTools()) {
    355                         if (m.isNewerAvailable()) {
    356                                 mand.add(m);
    357                         }
    358                 }
    359                 for (Mod m : ModManager.getInstance().getMandatoryMods()) {
    360                         if (m.isNewerAvailable()) {
    361                                 mand.add(m);
    362                         }
    363                 }
    364                 if (mand.size() > 0) {
    365                         ModDownloader m = new ModDownloader(mand,
    366                                         new ModDownloaderListener() {
    367                                                 @Override
    368                                                 public void updateStatus(ModDownloader source,
    369                                                                 State state, int filesDown, int filesTotal,
    370                                                                 int bytesDown, int bytesTotal, int duration,
    371                                                                 int remaining, int speed) {
    372                                                         evt.setProgressEnd(filesTotal);
    373                                                         evt.setProgressValue(filesDown);
    374                                                 }
    375                                         });
    376                         while (!m.isFinished()) {
    377                                 try {
    378                                         Thread.sleep(10);
    379                                 } catch (InterruptedException e) {
    380                                         e.printStackTrace();
    381                                 }
    382                         }
    383                 }
    384                 evt.setProgressMessage(bundle.getString("mandatoryToolsInstall.title"));
    385                 Installer.installTools(ModManager.getInstance().getMandatoryTools());
     419                if (!Settings.getInstance().isOfflineMode()) {
     420                        TreeSet<Mod> mand = new TreeSet<Mod>();
     421                        for (Mod m : ModManager.getInstance().getMandatoryTools()) {
     422                                if (m.isNewerAvailable()) {
     423                                        mand.add(m);
     424                                }
     425                        }
     426                        for (Mod m : ModManager.getInstance().getMandatoryMods()) {
     427                                if (m.isNewerAvailable()) {
     428                                        mand.add(m);
     429                                }
     430                        }
     431                        if (mand.size() > 0) {
     432                                ModDownloader m = new ModDownloader(mand,
     433                                                new ModDownloaderListener() {
     434                                                        @Override
     435                                                        public void updateStatus(ModDownloader source,
     436                                                                        State state, int filesDown, int filesTotal,
     437                                                                        int bytesDown, int bytesTotal,
     438                                                                        int duration, int remaining, int speed) {
     439                                                                evt.setProgressEnd(filesTotal);
     440                                                                evt.setProgressValue(filesDown);
     441                                                        }
     442                                                });
     443                                while (!m.isFinished()) {
     444                                        try {
     445                                                Thread.sleep(10);
     446                                        } catch (InterruptedException e) {
     447                                                e.printStackTrace();
     448                                        }
     449                                }
     450                        }
     451                        evt.setProgressMessage(bundle
     452                                        .getString("mandatoryToolsInstall.title"));
     453                        Installer
     454                                        .installTools(ModManager.getInstance().getMandatoryTools());
     455                }
    386456        }
    387457
    388458        @DoInBackground(progressMessage = "installing.title", cancelable = false, indeterminateProgress = false)
    389         private boolean install(final BackgroundEvent evt) {
     459        private void install(final BackgroundEvent evt) {
    390460                TreeSet<Mod> mods = new TreeSet<Mod>();
    391461                mods.addAll(ModManager.getInstance().getMandatoryMods());
     
    393463
    394464                boolean instReady = false;
     465                installDone = EInstallResult.DONE;
    395466
    396467                while (!instReady) {
    397                         System.out.println("Checking downloads:");
    398468                        TreeSet<Mod> toDownload = new TreeSet<Mod>();
    399469                        for (Mod m : mods) {
     
    401471                                        toDownload.add(m);
    402472                        }
     473                        if (Settings.getInstance().isOfflineMode()) {
     474                                installDone = EInstallResult.OFFLINE;
     475                                break;
     476                        }
    403477                        if (toDownload.size() > 0) {
    404                                 System.out.println("Download files: " + toDownload.toString());
    405478                                Downloader dl = new Downloader(toDownload);
    406479                                try {
     
    425498                                                .checkIncompabitilites(mods);
    426499                                if (conflicts.size() > 0) {
     500                                        installDone = EInstallResult.INCOMPATIBLE;
    427501                                        System.err.println("Incompatible mods: "
    428502                                                        + conflicts.toString());
     
    435509
    436510                if (instReady) {
    437                         System.out.println("Install mods: " + mods.toString());
    438 
    439511                        Installer.install(mods, new InstallProgressListener() {
    440512                                @Override
     
    446518                                }
    447519                        });
    448                         return true;
    449                 }
    450                 return false;
     520                        installDone = EInstallResult.DONE;
     521                }
    451522        }
    452523
    453524        @SuppressWarnings("unused")
    454525        private void installDone() {
    455                 JOptionPane.showMessageDialog(this,
    456                                 bundle.getString("installDone.text"),
    457                                 bundle.getString("installDone.title"),
    458                                 JOptionPane.INFORMATION_MESSAGE);
     526                switch (installDone) {
     527                        case DONE:
     528                                JOptionPane.showMessageDialog(this,
     529                                                bundle.getString("installDone.text"),
     530                                                bundle.getString("installDone.title"),
     531                                                JOptionPane.INFORMATION_MESSAGE);
     532                                break;
     533                        case OFFLINE:
     534                                JOptionPane.showMessageDialog(this,
     535                                                bundle.getString("offlineMode.text"),
     536                                                bundle.getString("offlineMode.title"),
     537                                                JOptionPane.WARNING_MESSAGE);
     538                                break;
     539                        case INCOMPATIBLE:
     540                                break;
     541                }
    459542        }
    460543
     
    465548                lblTypesVal.setText("");
    466549                lblPlatformVal.setText("");
     550                lblPackageNumberVal.setText("");
    467551                if (m != null) {
    468552                        lblSubmitterVal.setText(m.getName());
     
    478562                        lblTypesVal.setText(types);
    479563                        lblPlatformVal.setText(m.getPlatform().toString());
    480                 }
    481                 // TODO
     564                        lblPackageNumberVal.setText(m.getPackageNumberString());
     565                }
    482566        }
    483567
     
    499583        private void checkInitialize() {
    500584                if (!Installer.isEditionInitialized()) {
    501                         int res = JOptionPane.showConfirmDialog(this,
    502                                         bundle.getString("askInitialize.text"),
    503                                         bundle.getString("askInitialize.title"),
    504                                         JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
    505                         if (res == JOptionPane.NO_OPTION) {
    506                                 saveLocalData();
     585                        if (!OniSplit.isOniSplitInstalled()) {
     586                                JOptionPane.showMessageDialog(this,
     587                                                bundle.getString("noOniSplit.text"),
     588                                                bundle.getString("noOniSplit.title"),
     589                                                JOptionPane.ERROR_MESSAGE);
    507590                                exit();
     591                        } else {
     592                                int res = JOptionPane
     593                                                .showConfirmDialog(this,
     594                                                                bundle.getString("askInitialize.text"),
     595                                                                bundle.getString("askInitialize.title"),
     596                                                                JOptionPane.YES_NO_OPTION,
     597                                                                JOptionPane.QUESTION_MESSAGE);
     598                                if (res == JOptionPane.NO_OPTION) {
     599                                        saveLocalData();
     600                                        exit();
     601                                }
    508602                        }
    509603                }
  • AE/installer2/src/net/oni2/aeinstaller/gui/MainWin.properties

    r612 r621  
    2626menu.tools=&Manage Tools
    2727menu.toolsTooltip=Install/Remove Tools
     28menu.update=&Check for updates
     29menu.updateTooltip=Check for updates to already downloaded packages on the Depot
    2830
    2931btnRevertSelection.text=Revert selection
     
    4042lblTypes.text=Types:
    4143lblPlatform.text=Platform:
     44lblPackageNumber.text=Package number:
    4245lblFiles.text=Number of files:
    4346lblDescription.text=Description:
     
    4851installDone.text=You can now play AE Oni.
    4952
     53offlineMode.title=Offline mode
     54offlineMode.text=AEI is running in offline mode.\nNo updates or downloads of new mods are possible.\nPlease restart AEI when you have internet connection to update or download new packages.
    5055updatesAvailable.title=Updates available
    51 updatesAvailable.text=Some mods have newer versions available.
     56updatesAvailable.text=The following mods and tools have newer versions on the Depot.<br>Mods:<br>%s<br>Tools:<br>%s<br><br>Size of files to download is %s.<br>Update now?
    5257
     58noOniSplit.title=OniSplit not available
     59noOniSplit.text=The Edition is not yet initialized and OniSplit is missing (offline mode?).\nCan not resume from here, exiting!
    5360askInitialize.title=Initialize Edition
    5461askInitialize.text=The Edition is not yet initialized.\nIf you do not initialize now the installer will exit.\nInitialize Edition core now?
     
    5966mandatoryToolsInstall.title=Installing mandatory tools
    6067
     68doUpdate.title=Updating packages
     69
  • AE/installer2/src/net/oni2/aeinstaller/gui/MainWin.yml

    r617 r621  
    66  locationRelativeTo: null
    77  defaultCloseOperation: doNothingOnClose
    8   onWindowOpened: [execDepotUpdate,checkMandatoryFiles,checkInitialize,initialize,checkUpdates,focus]
     8  onWindowOpened: [execDepotUpdate,checkMandatoryFiles,checkInitialize,initialize,checkUpdates,doUpdate]
    99  onWindowClosing: [saveLocalData,exit]
    1010  iconImage: img.ae
     
    2020    - Action(name=reglobalize, text=menu.reglobalize, toolTipText=menu.reglobalizeTooltip, icon=img.refresh, onAction=[reglobalize])
    2121    - Action(name=tools, text=menu.tools, toolTipText=menu.toolsTooltip, icon=img.tools, onAction=[tools])
     22    - Action(name=update, text=menu.update, toolTipText=menu.updateTooltip, icon=img.update, onAction=[checkUpdates,doUpdate])
    2223    - JMenuBar:
    2324        - JMenu(name=mainMenu, text=menu.main):
     
    3738            - JSeparator()
    3839            - JMenuItem(action=tools)
     40            - JSeparator()
     41            - JMenuItem(action=update)
    3942    - JToolBar(name=toolbar, floatable=false, orientation=0):
    4043        - JButton(action=exitAction, hideActionText=true)
     
    6770            - JLabel(name=lblPlatform, text=lblPlatform.text)
    6871            - JLabel(name=lblPlatformVal)
     72            - JLabel(name=lblPackageNumber, text=lblPackageNumber.text)
     73            - JLabel(name=lblPackageNumberVal)
    6974            - JLabel(name=lblDescription, text=lblDescription.text)
    7075            - JScrollPane(name=scrollDescription, vScrollBar=always, hScrollBar=asNeeded):
     
    7277            - MigLayout: |
    7378                 [min]             [grow]
    74                  >lblSubmitter     lblSubmitterVal    [min]
    75                  >lblCreator       lblCreatorVal      [min]
    76                  >lblTypes         lblTypesVal        [min]
    77                  >lblPlatform      lblPlatformVal     [min]
    78                  >^lblDescription  scrollDescription  [grow]
     79                 >lblSubmitter     lblSubmitterVal     [min]
     80                 >lblCreator       lblCreatorVal       [min]
     81                 >lblTypes         lblTypesVal         [min]
     82                 >lblPlatform      lblPlatformVal      [min]
     83                 >lblPackageNumber lblPackageNumberVal [min]
     84                 >^lblDescription  scrollDescription   [grow]
    7985    - MigLayout:
    8086        layoutConstraints: wrap 1
Note: See TracChangeset for help on using the changeset viewer.