Example usage for java.lang NullPointerException printStackTrace

List of usage examples for java.lang NullPointerException printStackTrace

Introduction

In this page you can find the example usage for java.lang NullPointerException printStackTrace.

Prototype

public void printStackTrace() 

Source Link

Document

Prints this throwable and its backtrace to the standard error stream.

Usage

From source file:org.akaza.openclinica.control.submit.DataEntryServlet.java

private HashMap<String, ArrayList<String>> runRules(List<DisplayItemWithGroupBean> allItems,
        List<RuleSetBean> ruleSets, Boolean dryRun, Boolean shouldRunRules, MessageType mt, Phase phase,
        EventCRFBean ecb, HttpServletRequest request) {
    UserAccountBean ub = (UserAccountBean) request.getSession().getAttribute(USER_BEAN_NAME);
    StudyBean currentStudy = (StudyBean) request.getSession().getAttribute("study");
    if (shouldRunRules) {
        Container c = new Container();
        try {//from   www  .  j a v a 2 s .c o m
            c = populateRuleSpecificHashMaps(allItems, c, dryRun);
            ruleSets = getRuleSetService(request).filterRuleSetsBySectionAndGroupOrdinal(ruleSets, c.grouped);
            ruleSets = getRuleSetService(request).solidifyGroupOrdinalsUsingFormProperties(ruleSets, c.grouped);
            // next line here ?
        } catch (NullPointerException npe) {
            LOGGER.debug("found NPE " + npe.getMessage());
            npe.printStackTrace();
        }
        // above throws NPE?
        // return getRuleSetService().runRules(ruleSets, dryRun,
        // currentStudy, c.variableAndValue, ub);
        LOGGER.debug("running rules ... rule sets size is " + ruleSets.size());
        return getRuleSetService(request).runRulesInDataEntry(ruleSets, dryRun, currentStudy, ub,
                c.variableAndValue, phase, ecb, request).getByMessageType(mt);
    } else {
        return new HashMap<String, ArrayList<String>>();
    }

}

From source file:org.akaza.openclinica.control.submit.DataEntryServlet.java

/**
 * Get the input beans - the EventCRFBean and the SectionBean. For both beans, look first in the request attributes to see if the bean has been stored
 * there. If not, look in the parameters for the bean id, and then retrieve the bean from the database. The beans are stored as protected class members.
 * @param request TODO// w  ww.j a  v a 2s. co  m
 */
protected void getInputBeans(HttpServletRequest request) throws InsufficientPermissionException {

    HttpSession session = request.getSession();
    StudyBean currentStudy = (StudyBean) session.getAttribute("study");

    // BWP >>we should have the correct crfVersionId, in order to acquire
    // the correct
    // section IDs

    FormProcessor fp = new FormProcessor(request);
    EventCRFDAO ecdao = new EventCRFDAO(getDataSource());

    SectionDAO sdao = new SectionDAO(getDataSource());
    EventCRFBean ecb = (EventCRFBean) request.getAttribute(INPUT_EVENT_CRF);
    //JN:Happening when drilling down?
    if (ecb == null) {
        int eventCRFId = fp.getInt(INPUT_EVENT_CRF_ID, true);
        LOGGER.debug("found event crf id: " + eventCRFId);
        if (eventCRFId > 0) {
            LOGGER.debug("***NOTE*** that we didnt have to create an event crf because we already have one: "
                    + eventCRFId);
            // there is an event CRF already, only need to update
            ecb = (EventCRFBean) ecdao.findByPK(eventCRFId);
            // ecb.setUpdatedDate(new Date());
            // ecb.setUpdater(ub);
            // ecb = (EventCRFBean) ecdao.update(ecb);
            // logger.trace("found an event crf id "+eventCRFId);

            // YW 11-12-2007 << if interviewer or/and interview date
            // has/have been updated for study/site from "blank" to
            // "pre-populated"
            // But at this point, this update only shows on web page and
            // will not be updated to database.
            int studyEventId = fp.getInt(INPUT_STUDY_EVENT_ID);
            request.setAttribute(INPUT_EVENT_CRF, ecb);
            if (studyEventId > 0) {
                StudyEventDAO sedao = new StudyEventDAO(getDataSource());
                StudyEventBean sEvent = (StudyEventBean) sedao.findByPK(studyEventId);
                ecb = updateECB(sEvent, request);
            }
            request.setAttribute(INPUT_EVENT_CRF, ecb);
            // YW >>
        } else {
            // CRF id <=0, so we need to create a new CRF
            // use toCreateCRF as a flag to prevent user to submit event CRF
            // more than once
            // for example, user reloads the page
            String toCreateCRF = (String) session.getAttribute("to_create_crf");
            if (StringUtil.isBlank(toCreateCRF) || "0".equals(toCreateCRF)) {
                session.setAttribute("to_create_crf", "1");
            }
            try {
                // if (ecb.getInterviewerName() != null) {
                LOGGER.debug("Initial: to create an event CRF.");
                String toCreateCRF1 = (String) session.getAttribute("to_create_crf");
                if (!StringUtil.isBlank(toCreateCRF1) && "1".equals(toCreateCRF1)) {
                    ecb = createEventCRF(request, fp);
                    session.setAttribute("ecb", ecb);
                    request.setAttribute(INPUT_EVENT_CRF, ecb);
                    session.setAttribute("to_create_crf", "0");
                } else {
                    ecb = (EventCRFBean) session.getAttribute("ecb");
                }
                // }
            } catch (InconsistentStateException ie) {
                ie.printStackTrace();
                addPageMessage(ie.getOpenClinicaMessage(), request);
                throw new InsufficientPermissionException(Page.LIST_STUDY_SUBJECTS_SERVLET,
                        ie.getOpenClinicaMessage(), "1");
            } catch (NullPointerException ne) {
                ne.printStackTrace();
                addPageMessage(ne.getMessage(), request);
                throw new InsufficientPermissionException(Page.LIST_STUDY_SUBJECTS_SERVLET, ne.getMessage(),
                        "1");
            }
        }
    }
    // added to allow sections shown on this page
    DisplayTableOfContentsBean displayBean = new DisplayTableOfContentsBean();
    displayBean = TableOfContentsServlet.getDisplayBean(ecb, getDataSource(), currentStudy);
    // escape apostrophe in event name
    displayBean.getStudyEventDefinition()
            .setName(StringEscapeUtils.escapeJavaScript(displayBean.getStudyEventDefinition().getName()));
    request.setAttribute(TOC_DISPLAY, displayBean);

    int sectionId = fp.getInt(INPUT_SECTION_ID, true);
    ArrayList sections;
    if (sectionId <= 0) {
        StudyEventDAO studyEventDao = new StudyEventDAO(getDataSource());
        int maximumSampleOrdinal = studyEventDao.getMaxSampleOrdinal(displayBean.getStudyEventDefinition(),
                displayBean.getStudySubject());
        request.setAttribute("maximumSampleOrdinal", maximumSampleOrdinal);

        sections = sdao.findAllByCRFVersionId(ecb.getCRFVersionId());

        for (int i = 0; i < sections.size(); i++) {
            SectionBean sb = (SectionBean) sections.get(i);
            sectionId = sb.getId();// find the first section of this CRF
            break;
        }
    }
    SectionBean sb = new SectionBean();
    if (sectionId > 0) {
        // int sectionId = fp.getInt(INPUT_SECTION_ID, true);
        //synchronized(this)
        {
            sb = (SectionBean) sdao.findByPK(sectionId);
        }
    }

    int tabId = fp.getInt("tab", true);
    if (tabId <= 0) {
        tabId = 1;
    }
    request.setAttribute(INPUT_TAB, new Integer(tabId));
    request.setAttribute(SECTION_BEAN, sb);
}

From source file:org.apache.slide.webdav.method.AbstractWebdavMethod.java

/**
 * Exceute method./*from  w w  w  .  j a v  a2s  . c  om*/
 *
 * @exception WebdavException
 */
public void run(HttpServletRequest req, HttpServletResponse resp) throws WebdavException {

    // XXX this is a pretty ugly spot and way to set this
    // TODO find a better solution
    UriHandler.setGloballyUseHistoryCollectionHack(useHistoryCollectionHack());

    this.req = req;
    this.resp = resp;
    this.slideToken = WebdavUtils.getSlideToken(req);

    String forceLowercaseLogin = token.getNamespaceConfig().getParameter("force-lowercase-login");

    if ("true".equals(forceLowercaseLogin)) {
        try {
            String name = slideToken.getCredentialsToken().getPrincipal().getName();
            slideToken.setCredentialsToken(new CredentialsToken(name.toLowerCase()));
        } catch (NullPointerException e) {
            System.err.println("User principle not found");
            throw e;
        }
    }

    this.requestUri = WebdavUtils.getRelativePath(req, config);
    this.slideContextPath = req.getContextPath();
    if (!this.config.isDefaultServlet()) {
        this.slideContextPath += req.getServletPath();
    }

    // TODO this is a workaround to pass the slideContextPath to the search
    // implementation
    slideToken.addParameter("slideContextPath", this.slideContextPath);

    parseRequestHeaders();

    boolean transactionIsStarted = false;
    boolean globalLockObtained = false;
    String txId = null;
    try {
        parseRequest();

        ExternalTransactionContext externalTransaction = null;

        txId = requestHeaders.getTxId();
        if (txId != null) {
            externalTransaction = ExternalTransactionContext.lookupContext(txId);
            if (externalTransaction != null) {
                Domain.log("Using external transaction " + txId, LOG_CHANNEL, Logger.INFO);
                slideToken.setExternalTx();
                // pure reads must be guaranteed to be inside transaction as well
                slideToken.setForceStoreEnlistment(true);
                Transaction tx = externalTransaction.getTransaction();
                token.getTransactionManager().resume(tx);
                transactionIsStarted = true;
            }
        }

        if (!slideToken.isExternalTransaction()) {
            token.begin();
            transactionIsStarted = true;
            if (txForAllRequests()) {
                slideToken.setForceStoreEnlistment(true);
            }

            if (this instanceof ReadMethod) {
                assureGlobalReadLock();
            } else if (this instanceof WriteMethod) {
                assureGlobalWriteLock();
            }
            globalLockObtained = true;
        }

        // Was this call made to finalize a transaction?
        boolean isEndofTransactionxUnlock = false;
        if (this instanceof UnlockMethod) {
            UnlockMethod meth = (UnlockMethod) this;
            if (meth.getCommand() != UnlockMethod.NO_TRANSACTION)
                isEndofTransactionxUnlock = true;
        }

        /*
         * Check for object existence and cleanup locks only if we're not
         * unlocking as part of finalizing a transaction. Otherwise we
         * are making calls to the store that require a transaction to
         * be in process while we're trying to commit or abort it the
         * current transaction.
         */
        if (!isEndofTransactionxUnlock) {
            try {
                // retrive to check it exists, otherwise it can't have locks
                structure.retrieve(slideToken, requestUri);
                // clear expired lock-tokens
                UnlockListenerImpl listener = new UnlockListenerImpl(slideToken, token, config, req, resp);
                lock.clearExpiredLocks(slideToken, requestUri, listener);

                if (listener.getUnlockCount() > 0) {
                    // If we have have cleared any lock or any lock-null resource in
                    // the previous step we commit this changes, otherwise they will
                    // be lost if executeRequest() exits with an exception (e.g.
                    // because of Not Found 404)
                    token.commit();
                    token.begin();
                }
            } catch (ObjectNotFoundException e) {
                // ignore, it can't have locks
            }
        }

        executeRequest();

        if (!slideToken.isExternalTransaction() && transactionIsStarted) {
            token.commit();
            transactionIsStarted = false;
        }
    } catch (WebdavException ex) {
        // Ignore the WebDav Exception and assume that the response code
        // is already set.
    } catch (SlideException ex) {
        int statusCode = getErrorCode(ex);
        sendError(statusCode, ex);
        // do not throw exception as the response code has already been set,
        // otherwise the servlet will log this as an error and issue a stack trace
        //            throw new WebdavException( statusCode );
    } catch (Exception ex) {
        token.getLogger().log(ex, LOG_CHANNEL, Logger.ERROR);
        int statusCode = WebdavStatus.SC_INTERNAL_SERVER_ERROR;
        sendError(statusCode, ex);
        throw new WebdavException(statusCode);
    } finally {
        if (!slideToken.isExternalTransaction() && transactionIsStarted) {
            // Something went wrong, we are here and the TA is still open
            try {
                token.rollback();
            } catch (Exception e) {
                // TODO
                e.printStackTrace();
            }
        }
        if (slideToken.isExternalTransaction()) {
            Transaction transaction;
            try {
                if (token.getStatus() == javax.transaction.Status.STATUS_ACTIVE) {
                    transaction = token.getTransactionManager().suspend();
                    if (transaction != null) {
                        ExternalTransactionContext.registerContext(txId, transaction);
                    }
                }
            } catch (SystemException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        if (globalLockObtained) {
            releaseGlobalLock();
        }
    }
}

From source file:at.gv.egovernment.moa.id.auth.servlet.PEPSConnectorServlet.java

/**
 * Handles the reception of a STORK response message
 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
 *///from w  ww . ja  va 2s  .c om
protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {

    String pendingRequestID = null;

    try {

        Logger.warn(getClass().getName() + " is deprecated and should not be used any more.");

        Logger.info("PEPSConnector Servlet invoked, expecting C-PEPS message.");
        Logger.debug("This ACS endpoint is: " + HTTPUtils.getBaseURL(request));

        super.setNoCachingHeadersInHttpRespone(request, response);
        Logger.trace("No Caching headers set for HTTP response");

        //check if https or only http
        super.checkIfHTTPisAllowed(request.getRequestURL().toString());

        Logger.debug("Beginning to extract SAMLResponse out of HTTP Request");

        //extract STORK Response from HTTP Request
        //Decodes SAML Response
        byte[] decSamlToken;
        try {
            decSamlToken = PEPSUtil.decodeSAMLToken(request.getParameter("SAMLResponse"));
            Logger.debug("SAMLResponse: " + new String(decSamlToken));

        } catch (NullPointerException e) {
            Logger.error("Unable to retrieve STORK Response", e);
            throw new MOAIDException("stork.04", null);
        }

        //Get SAMLEngine instance
        STORKSAMLEngine engine = STORKSAMLEngine.getInstance("outgoing");

        STORKAuthnResponse authnResponse = null;
        try {
            //validate SAML Token
            Logger.debug("Starting validation of SAML response");
            authnResponse = engine.validateSTORKAuthnResponse(decSamlToken, (String) request.getRemoteHost());
            Logger.info("SAML response succesfully verified!");
        } catch (STORKSAMLEngineException e) {
            Logger.error("Failed to verify STORK SAML Response", e);
            throw new MOAIDException("stork.05", null);
        }

        Logger.info("STORK SAML Response message succesfully extracted");
        Logger.debug("STORK response: ");
        Logger.debug(authnResponse.toString());

        Logger.debug("Trying to find MOA Session-ID ...");
        //String moaSessionID = request.getParameter(PARAM_SESSIONID);
        //first use SAML2 relayState 
        String moaSessionID = request.getParameter("RelayState");

        // escape parameter strings
        moaSessionID = StringEscapeUtils.escapeHtml(moaSessionID);

        //check if SAML2 relaystate includes a MOA sessionID
        if (StringUtils.isEmpty(moaSessionID)) {
            //if relaystate is emtpty, use SAML response -> inResponseTo element as session identifier

            moaSessionID = authnResponse.getInResponseTo();
            moaSessionID = StringEscapeUtils.escapeHtml(moaSessionID);

            if (StringUtils.isEmpty(moaSessionID)) {
                //No authentication session has been started before
                Logger.error("MOA-SessionID was not found, no previous AuthnRequest had been started");
                Logger.debug("PEPSConnectorURL was: " + request.getRequestURL());
                throw new AuthenticationException("auth.02", new Object[] { moaSessionID });

            } else
                Logger.trace(
                        "Use MOA SessionID " + moaSessionID + " from AuthnResponse->inResponseTo attribute.");

        } else
            //Logger.trace("MOA SessionID " + moaSessionID + " is found in http GET parameter.");
            Logger.trace("MOA SessionID " + moaSessionID + " is found in SAML2 relayState.");

        /*INFO!!!!
         * SAML message IDs has an different format then MOASessionIDs
         * This is only a workaround because many PEPS does not support SAML2 relayState or
         * MOASessionID as AttributConsumerServiceURL GET parameter
        */
        //            if (!ParamValidatorUtils.isValidSessionID(moaSessionID))
        //                throw new WrongParametersException("VerifyAuthenticationBlock", PARAM_SESSIONID, "auth.12");

        pendingRequestID = AuthenticationSessionStoreage.getPendingRequestID(moaSessionID);

        //load MOASession from database
        AuthenticationSession moaSession = AuthenticationServer.getSession(moaSessionID);
        //change MOASessionID
        moaSessionID = AuthenticationSessionStoreage.changeSessionID(moaSession);

        Logger.info("Found MOA sessionID: " + moaSessionID);

        String statusCodeValue = authnResponse.getStatusCode();

        if (!statusCodeValue.equals(StatusCode.SUCCESS_URI)) {
            Logger.error("Received ErrorResponse from PEPS: " + statusCodeValue);
            throw new MOAIDException("stork.06", new Object[] { statusCodeValue });
        }

        Logger.info("Got SAML response with authentication success message.");

        Logger.debug("MOA session is still valid");

        STORKAuthnRequest storkAuthnRequest = moaSession.getStorkAuthnRequest();

        if (storkAuthnRequest == null) {
            Logger.error(
                    "Could not find any preceeding STORK AuthnRequest to this MOA session: " + moaSessionID);
            throw new MOAIDException("stork.07", null);
        }

        OAAuthParameter oaParam = AuthConfigurationProvider.getInstance()
                .getOnlineApplicationParameter(moaSession.getPublicOAURLPrefix());
        if (oaParam == null)
            throw new AuthenticationException("auth.00", new Object[] { moaSession.getPublicOAURLPrefix() });
        //================== Check QAA level start ====================
        int reqQaa = -1;
        int authQaa = -1;
        String authQaaStr = null;
        try {
            reqQaa = storkAuthnRequest.getQaa();

            //TODO: found better solution, but QAA Level in response could be not supported yet
            try {

                authQaaStr = authnResponse.getAssertions().get(0).getAuthnStatements().get(0).getAuthnContext()
                        .getAuthnContextClassRef().getAuthnContextClassRef();
                moaSession.setQAALevel(authQaaStr);

            } catch (Throwable e) {
                Logger.warn("STORK QAA-Level is not found in AuthnResponse. Set QAA Level to requested level");
                moaSession.setQAALevel(PVPConstants.STORK_QAA_PREFIX + oaParam.getQaaLevel());
                authQaaStr = PVPConstants.STORK_QAA_PREFIX + oaParam.getQaaLevel();
            }
            if (authQaaStr != null)//Check value only if set
            {
                authQaa = Integer.valueOf(authQaaStr.substring(PVPConstants.STORK_QAA_PREFIX.length()));
                //               authQaa = Integer.valueOf(authQaaStr);
                if (reqQaa > authQaa) {
                    Logger.warn("Requested QAA level does not match to authenticated QAA level");
                    throw new MOAIDException("stork.21", new Object[] { reqQaa, authQaa });

                }
            }
        } catch (MOAIDException e) {
            throw e;

        } catch (Exception e) {
            if (Logger.isDebugEnabled())
                Logger.warn("STORK QAA Level evaluation error", e);

            else
                Logger.warn("STORK QAA Level evaluation error (ErrorMessage=" + e.getMessage() + ")");

            throw new MOAIDException("stork.21", new Object[] { reqQaa, authQaa });

        }
        //================== Check QAA level end ====================

        Logger.debug("Found a preceeding STORK AuthnRequest to this MOA session: " + moaSessionID);

        ////////////// incorporate gender from parameters if not in stork response

        IPersonalAttributeList attributeList = authnResponse.getPersonalAttributeList();

        // but first, check if we have a representation case
        if (STORKResponseProcessor.hasAttribute("mandateContent", attributeList)
                || STORKResponseProcessor.hasAttribute("representative", attributeList)
                || STORKResponseProcessor.hasAttribute("represented", attributeList)) {
            // in a representation case...
            moaSession.setUseMandate("true");

            // and check if we have the gender value
            PersonalAttribute gender = attributeList.get("gender"); // TODO Do we need to check gender value if there is no representation case?
            if (null == gender) {
                String gendervalue = (String) request.getParameter("gender");
                if (null != gendervalue) {
                    gender = new PersonalAttribute();
                    gender.setName("gender");
                    ArrayList<String> tmp = new ArrayList<String>();
                    tmp.add(gendervalue);
                    gender.setValue(tmp);

                    authnResponse.getPersonalAttributeList().add(gender);
                }
            }
        }

        //////////////////////////////////////////////////////////////////////////

        Logger.debug("Starting extraction of signedDoc attribute");
        //extract signed doc element and citizen signature
        String citizenSignature = null;
        try {
            String signatureInfo = authnResponse.getPersonalAttributeList().get("signedDoc").getValue().get(0); // TODO ERROR HANDLING

            Logger.debug("signatureInfo:" + signatureInfo);

            SignResponse dssSignResponse = (SignResponse) ApiUtils
                    .unmarshal(new StreamSource(new java.io.StringReader(signatureInfo)));

            // fetch signed doc
            DataSource ds = null;
            try {
                ds = LightweightSourceResolver.getDataSource(dssSignResponse);
            } catch (Exception e) {
                e.printStackTrace();
            }
            if (ds == null) {
                //Normal DocumentServices return a http-page, but the SI DocumentService returns HTTP error 500 
                //which results in an exception and ds==null

                //try to load document from documentservice
                citizenSignature = loadDocumentFromDocumentService(dssSignResponse);
                //throw new ApiUtilsException("No datasource found in response");
            } else {
                InputStream incoming = ds.getInputStream();
                citizenSignature = IOUtils.toString(incoming);
                incoming.close();

                Logger.debug("citizenSignature:" + citizenSignature);
                if (isDocumentServiceUsed(citizenSignature) == true) {
                    citizenSignature = loadDocumentFromDocumentService(dssSignResponse);
                    //               Logger.debug("Loading document from DocumentService.");
                    //               String url = getDtlUrlFromResponse(dssSignResponse);
                    //               //get Transferrequest
                    //               String transferRequest = getDocTransferRequest(dssSignResponse.getDocUI(), url);
                    //               //Load document from DocumentService
                    //               byte[] data = getDocumentFromDtl(transferRequest, url);
                    //               citizenSignature = new String(data, "UTF-8");
                    //               Logger.debug("Overridung citizenSignature with:"+citizenSignature);
                }
            }
            JAXBContext ctx = JAXBContext.newInstance(SignatureType.class.getPackage().getName());
            SignatureType root = ((JAXBElement<SignatureType>) ctx.createUnmarshaller()
                    .unmarshal(IOUtils.toInputStream(citizenSignature))).getValue();

            // memorize signature into authblock
            moaSession.setAuthBlock(citizenSignature);

            // extract certificate
            for (Object current : root.getKeyInfo().getContent())
                if (((JAXBElement<?>) current).getValue() instanceof X509DataType) {
                    for (Object currentX509Data : ((JAXBElement<X509DataType>) current).getValue()
                            .getX509IssuerSerialOrX509SKIOrX509SubjectName()) {
                        JAXBElement<?> casted = ((JAXBElement<?>) currentX509Data);
                        if (casted.getName().getLocalPart().equals("X509Certificate")) {
                            moaSession.setSignerCertificate(
                                    new X509Certificate(((String) casted.getValue()).getBytes("UTF-8")));
                            break;
                        }
                    }
                }

        } catch (Throwable e) {
            Logger.error("Could not extract citizen signature from C-PEPS", e);
            throw new MOAIDException("stork.09", null);
        }
        Logger.debug("Foregin Citizen signature successfully extracted from STORK Assertion (signedDoc)");
        Logger.debug("Citizen signature will be verified by SZR Gateway!");

        Logger.debug("fetching OAParameters from database");

        //         //read configuration paramters of OA
        //           AuthenticationSession moasession;
        //         try {
        //            moasession = AuthenticationSessionStoreage.getSession(moaSessionID);
        //         } catch (MOADatabaseException e2) {
        //            Logger.error("could not retrieve moa session");
        //            throw new AuthenticationException("auth.01", null);
        //         }
        //          OAAuthParameter oaParam = AuthConfigurationProvider.getInstance().getOnlineApplicationParameter(moaSession.getPublicOAURLPrefix());
        //          if (oaParam == null)
        //                throw new AuthenticationException("auth.00", new Object[] { moaSession.getPublicOAURLPrefix() });

        // retrieve target
        //TODO: check in case of SSO!!!
        String targetType = null;
        if (oaParam.getBusinessService()) {
            String id = oaParam.getIdentityLinkDomainIdentifier();
            if (id.startsWith(AuthenticationSession.REGISTERANDORDNR_PREFIX_))
                targetType = id;
            else
                targetType = AuthenticationSession.REGISTERANDORDNR_PREFIX_ + moaSession.getDomainIdentifier();
        } else {
            targetType = AuthenticationSession.TARGET_PREFIX_ + oaParam.getTarget();
        }

        IdentityLink identityLink = null;
        try {
            AuthConfigurationProvider config = AuthConfigurationProvider.getInstance();
            if (config.isStorkFakeIdLActive()
                    && config.getStorkFakeIdLCountries().contains(storkAuthnRequest.getCitizenCountryCode())) {
                // create fake IdL
                // - fetch IdL template from resources
                InputStream s = PEPSConnectorServlet.class
                        .getResourceAsStream("/resources/xmldata/fakeIdL_IdL_template.xml");
                Element idlTemplate = DOMUtils.parseXmlValidating(s);

                identityLink = new IdentityLinkAssertionParser(idlTemplate).parseIdentityLink();

                // replace data
                Element idlassertion = identityLink.getSamlAssertion();
                // - set bpk/wpbk;
                Node prIdentification = XPathUtils.selectSingleNode(idlassertion,
                        IdentityLinkAssertionParser.PERSON_IDENT_VALUE_XPATH);
                if (!STORKResponseProcessor.hasAttribute("eIdentifier", attributeList))
                    throw new STORKException("eIdentifier is missing");
                String eIdentifier = STORKResponseProcessor.getAttributeValue("eIdentifier", attributeList,
                        false);
                prIdentification.getFirstChild().setNodeValue(eIdentifier);

                // - set last name
                Node prFamilyName = XPathUtils.selectSingleNode(idlassertion,
                        IdentityLinkAssertionParser.PERSON_FAMILY_NAME_XPATH);
                if (!STORKResponseProcessor.hasAttribute("surname", attributeList))
                    throw new STORKException("surname is missing");
                String familyName = STORKResponseProcessor.getAttributeValue("surname", attributeList, false);
                prFamilyName.getFirstChild().setNodeValue(familyName);

                // - set first name
                Node prGivenName = XPathUtils.selectSingleNode(idlassertion,
                        IdentityLinkAssertionParser.PERSON_GIVEN_NAME_XPATH);
                if (!STORKResponseProcessor.hasAttribute("givenName", attributeList))
                    throw new STORKException("givenName is missing");
                String givenName = STORKResponseProcessor.getAttributeValue("givenName", attributeList, false);
                prGivenName.getFirstChild().setNodeValue(givenName);

                // - set date of birth
                Node prDateOfBirth = XPathUtils.selectSingleNode(idlassertion,
                        IdentityLinkAssertionParser.PERSON_DATE_OF_BIRTH_XPATH);
                if (!STORKResponseProcessor.hasAttribute("dateOfBirth", attributeList))
                    throw new STORKException("dateOfBirth is missing");
                String dateOfBirth = STORKResponseProcessor.getAttributeValue("dateOfBirth", attributeList,
                        false);
                prDateOfBirth.getFirstChild().setNodeValue(dateOfBirth);

                identityLink = new IdentityLinkAssertionParser(idlassertion).parseIdentityLink();

                //resign IDL
                IdentityLinkReSigner identitylinkresigner = IdentityLinkReSigner.getInstance();
                Element resignedilAssertion = identitylinkresigner.resignIdentityLink(
                        identityLink.getSamlAssertion(), config.getStorkFakeIdLResigningKey());
                identityLink = new IdentityLinkAssertionParser(resignedilAssertion).parseIdentityLink();
            } else {
                //contact SZR Gateway
                Logger.debug("Starting connecting SZR Gateway");
                identityLink = STORKResponseProcessor.connectToSZRGateway(
                        authnResponse.getPersonalAttributeList(), oaParam.getFriendlyName(), targetType, null,
                        oaParam.getMandateProfiles(), citizenSignature);
            }
        } catch (STORKException e) {
            // this is really nasty but we work against the system here. We are supposed to get the gender attribute from
            // stork. If we do not, we cannot register the person in the ERnP - we have to have the
            // gender for the represented person. So here comes the dirty hack. 
            if (e.getCause() instanceof STORKException
                    && e.getCause().getMessage().equals("gender not found in response")) {
                try {
                    Logger.trace("Initialize VelocityEngine...");

                    VelocityEngine velocityEngine = VelocityProvider.getClassPathVelocityEngine();
                    Template template = velocityEngine.getTemplate("/resources/templates/fetchGender.html");
                    VelocityContext context = new VelocityContext();
                    context.put("SAMLResponse", request.getParameter("SAMLResponse"));
                    context.put("action", request.getRequestURL());

                    StringWriter writer = new StringWriter();
                    template.merge(context, writer);

                    response.getOutputStream().write(writer.toString().getBytes("UTF-8"));
                } catch (Exception e1) {
                    Logger.error("Error sending gender retrival form.", e1);
                    //                  httpSession.invalidate();
                    throw new MOAIDException("stork.10", null);
                }

                return;
            }

            Logger.error("Error connecting SZR Gateway", e);
            throw new MOAIDException("stork.10", null);
        }
        Logger.debug("SZR communication was successfull");

        if (identityLink == null) {
            Logger.error("SZR Gateway did not return an identity link.");
            throw new MOAIDException("stork.10", null);
        }
        moaSession.setForeigner(true);

        Logger.info("Received Identity Link from SZR Gateway");
        moaSession.setIdentityLink(identityLink);

        Logger.debug("Adding addtional STORK attributes to MOA session");
        moaSession.setStorkAttributes(authnResponse.getPersonalAttributeList());

        Logger.debug("Add full STORK AuthnResponse to MOA session");
        moaSession.setStorkAuthnResponse(request.getParameter("SAMLResponse"));

        //We don't have BKUURL, setting from null to "Not applicable"
        moaSession.setBkuURL("Not applicable (STORK Authentication)");

        // free for single use
        moaSession.setAuthenticatedUsed(false);

        // stork did the authentication step
        moaSession.setAuthenticated(true);

        //         //TODO: found better solution, but QAA Level in response could be not supported yet
        //         try {
        //
        //            moaSession.setQAALevel(authnResponse.getAssertions().get(0).
        //                  getAuthnStatements().get(0).getAuthnContext().
        //                  getAuthnContextClassRef().getAuthnContextClassRef());
        //            
        //         } catch (Throwable e) {
        //            Logger.warn("STORK QAA-Level is not found in AuthnResponse. Set QAA Level to requested level");
        //            moaSession.setQAALevel(PVPConstants.STORK_QAA_PREFIX + oaParam.getQaaLevel());
        //            
        //         }

        //session is implicit stored in changeSessionID!!!!
        String newMOASessionID = AuthenticationSessionStoreage.changeSessionID(moaSession);

        Logger.info("Changed MOASession " + moaSessionID + " to Session " + newMOASessionID);

        //redirect
        String redirectURL = null;
        redirectURL = new DataURLBuilder().buildDataURL(moaSession.getAuthURL(),
                ModulUtils.buildAuthURL(moaSession.getModul(), moaSession.getAction(), pendingRequestID),
                newMOASessionID);
        redirectURL = response.encodeRedirectURL(redirectURL);

        //          response.setContentType("text/html");
        //          response.setStatus(302);
        //          response.addHeader("Location", redirectURL);
        response.sendRedirect(redirectURL);
        Logger.info("REDIRECT TO: " + redirectURL);

    } catch (AuthenticationException e) {
        handleError(null, e, request, response, pendingRequestID);

    } catch (MOAIDException e) {
        handleError(null, e, request, response, pendingRequestID);

    } catch (Exception e) {
        Logger.error("PEPSConnector has an interal Error.", e);
    }

    finally {
        ConfigurationDBUtils.closeSession();
    }

}

From source file:at.gv.egovernment.moa.id.auth.servlet.PEPSConnectorWithLocalSigningServlet.java

private void handleSAMLResponse(HttpServletRequest request, HttpServletResponse response) {
    Logger.info("handleSAMLResponse started");
    String pendingRequestID = null;

    try {//from  w  w  w. j  a v  a 2s .c  om
        Logger.info("PEPSConnector Servlet invoked, expecting C-PEPS message.");
        Logger.debug("This ACS endpoint is: " + HTTPUtils.getBaseURL(request));

        super.setNoCachingHeadersInHttpRespone(request, response);
        Logger.trace("No Caching headers set for HTTP response");

        //check if https or only http
        super.checkIfHTTPisAllowed(request.getRequestURL().toString());

        Logger.debug("Beginning to extract SAMLResponse out of HTTP Request");

        //extract STORK Response from HTTP Request
        //Decodes SAML Response
        byte[] decSamlToken;
        try {
            decSamlToken = PEPSUtil.decodeSAMLToken(request.getParameter("SAMLResponse"));
            Logger.debug("SAMLResponse: " + new String(decSamlToken));

        } catch (NullPointerException e) {
            Logger.error("Unable to retrieve STORK Response", e);
            throw new MOAIDException("stork.04", null);
        }

        //Get SAMLEngine instance
        STORKSAMLEngine engine = STORKSAMLEngine.getInstance("outgoing");

        STORKAuthnResponse authnResponse = null;
        try {
            //validate SAML Token
            Logger.debug("Starting validation of SAML response");
            authnResponse = engine.validateSTORKAuthnResponse(decSamlToken, (String) request.getRemoteHost());
            Logger.info("SAML response succesfully verified!");
        } catch (STORKSAMLEngineException e) {
            Logger.error("Failed to verify STORK SAML Response", e);
            throw new MOAIDException("stork.05", null);
        }

        Logger.info("STORK SAML Response message succesfully extracted");
        Logger.debug("STORK response: ");
        Logger.debug(authnResponse.toString());

        Logger.debug("Trying to find MOA Session-ID ...");
        //String moaSessionID = request.getParameter(PARAM_SESSIONID);
        //first use SAML2 relayState 
        String moaSessionID = request.getParameter("RelayState");

        // escape parameter strings
        moaSessionID = StringEscapeUtils.escapeHtml(moaSessionID);

        //check if SAML2 relaystate includes a MOA sessionID
        if (StringUtils.isEmpty(moaSessionID)) {
            //if relaystate is emtpty, use SAML response -> inResponseTo element as session identifier

            moaSessionID = authnResponse.getInResponseTo();
            moaSessionID = StringEscapeUtils.escapeHtml(moaSessionID);

            if (StringUtils.isEmpty(moaSessionID)) {
                //No authentication session has been started before
                Logger.error("MOA-SessionID was not found, no previous AuthnRequest had been started");
                Logger.debug("PEPSConnectorURL was: " + request.getRequestURL());
                throw new AuthenticationException("auth.02", new Object[] { moaSessionID });

            } else
                Logger.trace(
                        "Use MOA SessionID " + moaSessionID + " from AuthnResponse->inResponseTo attribute.");

        } else
            //Logger.trace("MOA SessionID " + moaSessionID + " is found in http GET parameter.");
            Logger.trace("MOA SessionID " + moaSessionID + " is found in SAML2 relayState.");

        /*INFO!!!!
         * SAML message IDs has an different format then MOASessionIDs
         * This is only a workaround because many PEPS does not support SAML2 relayState or
         * MOASessionID as AttributConsumerServiceURL GET parameter
         */
        //            if (!ParamValidatorUtils.isValidSessionID(moaSessionID))
        //                throw new WrongParametersException("VerifyAuthenticationBlock", PARAM_SESSIONID, "auth.12");

        pendingRequestID = AuthenticationSessionStoreage.getPendingRequestID(moaSessionID);

        //load MOASession from database
        AuthenticationSession moaSession = AuthenticationServer.getSession(moaSessionID);
        //change MOASessionID
        moaSessionID = AuthenticationSessionStoreage.changeSessionID(moaSession);

        Logger.info("Found MOA sessionID: " + moaSessionID);

        String statusCodeValue = authnResponse.getStatusCode();

        if (!statusCodeValue.equals(StatusCode.SUCCESS_URI)) {
            Logger.error("Received ErrorResponse from PEPS: " + statusCodeValue);
            throw new MOAIDException("stork.06", new Object[] { statusCodeValue });
        }

        Logger.info("Got SAML response with authentication success message.");

        Logger.debug("MOA session is still valid");

        STORKAuthnRequest storkAuthnRequest = moaSession.getStorkAuthnRequest();

        if (storkAuthnRequest == null) {
            Logger.error(
                    "Could not find any preceeding STORK AuthnRequest to this MOA session: " + moaSessionID);
            throw new MOAIDException("stork.07", null);
        }

        Logger.debug("Found a preceeding STORK AuthnRequest to this MOA session: " + moaSessionID);

        ////////////// incorporate gender from parameters if not in stork response

        IPersonalAttributeList attributeList = authnResponse.getPersonalAttributeList();

        // but first, check if we have a representation case
        if (STORKResponseProcessor.hasAttribute("mandateContent", attributeList)
                || STORKResponseProcessor.hasAttribute("representative", attributeList)
                || STORKResponseProcessor.hasAttribute("represented", attributeList)) {
            // in a representation case...
            moaSession.setUseMandate("true");

            // and check if we have the gender value
            PersonalAttribute gender = attributeList.get("gender");
            if (null == gender) {
                String gendervalue = (String) request.getParameter("gender");
                if (null != gendervalue) {
                    gender = new PersonalAttribute();
                    gender.setName("gender");
                    ArrayList<String> tmp = new ArrayList<String>();
                    tmp.add(gendervalue);
                    gender.setValue(tmp);

                    authnResponse.getPersonalAttributeList().add(gender);
                }
            }
        }

        //////////////////////////////////////////////////////////////////////////

        Logger.debug("Starting extraction of signedDoc attribute");
        //extract signed doc element and citizen signature
        String citizenSignature = null;
        try {
            PersonalAttribute signedDoc = authnResponse.getPersonalAttributeList().get("signedDoc");
            String signatureInfo = null;
            if (signedDoc != null) {
                signatureInfo = signedDoc.getValue().get(0);
                //should not occur
            } else {

                //store SAMLResponse
                moaSession.setSAMLResponse(request.getParameter("SAMLResponse"));
                //store authnResponse

                //moaSession.setAuthnResponse(authnResponse);//not serializable
                moaSession.setAuthnResponseGetPersonalAttributeList(authnResponse.getPersonalAttributeList());

                String authnContextClassRef = null;
                try {
                    authnContextClassRef = authnResponse.getAssertions().get(0).getAuthnStatements().get(0)
                            .getAuthnContext().getAuthnContextClassRef().getAuthnContextClassRef();
                } catch (Throwable e) {
                    Logger.warn(
                            "STORK QAA-Level is not found in AuthnResponse. Set QAA Level to requested level");
                }

                moaSession.setAuthnContextClassRef(authnContextClassRef);
                moaSession.setReturnURL(request.getRequestURL());

                //load signedDoc
                String signRequest = moaSession.getSignedDoc();

                //session is implicit stored in changeSessionID!!!!
                String newMOASessionID = AuthenticationSessionStoreage.changeSessionID(moaSession);

                //set return url to PEPSConnectorWithLocalSigningServlet and add newMOASessionID 
                //signRequest

                String issuerValue = AuthConfigurationProvider.getInstance().getPublicURLPrefix();
                String acsURL = issuerValue
                        + PEPSConnectorWithLocalSigningServlet.PEPSCONNECTOR_SERVLET_URL_PATTERN;

                String url = acsURL + "?moaSessionID=" + newMOASessionID;
                //redirect to OASIS module and sign there

                boolean found = false;
                try {
                    List<AttributeProviderPlugin> aps = AuthConfigurationProvider.getInstance()
                            .getOnlineApplicationParameter(moaSession.getPublicOAURLPrefix()).getStorkAPs();
                    Logger.info("Found AttributeProviderPlugins:" + aps.size());
                    for (AttributeProviderPlugin ap : aps) {
                        Logger.info("Found AttributeProviderPlugin attribute:" + ap.getAttributes());
                        if (ap.getAttributes().equalsIgnoreCase("signedDoc")) {
                            // FIXME[tlenz]: A servlet's class field is not thread safe.
                            oasisDssWebFormURL = ap.getUrl();
                            found = true;
                            Logger.info("Loaded signedDoc attribute provider url from config:"
                                    + oasisDssWebFormURL);
                            break;
                        }
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    Logger.error("Loading the signedDoc attribute provider url from config failed");
                }
                if (!found) {
                    Logger.error("Failed to load the signedDoc attribute provider url from config");
                }
                performRedirect(url, request, response, signRequest);

                return;
            }
            SignResponse dssSignResponse = (SignResponse) ApiUtils
                    .unmarshal(new StreamSource(new java.io.StringReader(signatureInfo)));

            citizenSignature = getCitizienSignatureFromSignResponse(dssSignResponse);

            // memorize signature into authblock
            moaSession.setAuthBlock(citizenSignature);

            X509Certificate cert = getSignerCertificate(citizenSignature);
            moaSession.setSignerCertificate(cert);
            moaSession.setForeigner(true);

        } catch (Throwable e) {
            Logger.error("Could not extract citizen signature from C-PEPS", e);
            throw new MOAIDException("stork.09", null);
        }

        try {
            SZRGInsertion(moaSession, authnResponse.getPersonalAttributeList(),
                    authnResponse.getAssertions().get(0).getAuthnStatements().get(0).getAuthnContext()
                            .getAuthnContextClassRef().getAuthnContextClassRef(),
                    citizenSignature);
        } catch (STORKException e) {
            // this is really nasty but we work against the system here. We are supposed to get the gender attribute from
            // stork. If we do not, we cannot register the person in the ERnP - we have to have the
            // gender for the represented person. So here comes the dirty hack. 
            if (e.getCause() instanceof STORKException
                    && e.getCause().getMessage().equals("gender not found in response")) {
                try {
                    Logger.trace("Initialize VelocityEngine...");

                    VelocityEngine velocityEngine = VelocityProvider.getClassPathVelocityEngine();
                    Template template = velocityEngine.getTemplate("/resources/templates/fetchGender.html");
                    VelocityContext context = new VelocityContext();
                    context.put("SAMLResponse", request.getParameter("SAMLResponse"));
                    context.put("action", request.getRequestURL());

                    StringWriter writer = new StringWriter();
                    template.merge(context, writer);

                    response.getOutputStream().write(writer.toString().getBytes("UTF-8"));
                } catch (Exception e1) {
                    Logger.error("Error sending gender retrival form.", e1);
                    //                  httpSession.invalidate();
                    throw new MOAIDException("stork.10", null);
                }

                return;
            }

            Logger.error("Error connecting SZR Gateway", e);
            throw new MOAIDException("stork.10", null);
        }

        Logger.debug("Add full STORK AuthnResponse to MOA session");
        moaSession.setStorkAuthnResponse(request.getParameter("SAMLResponse"));//TODO ask Florian/Thomas authnResponse?

        //session is implicit stored in changeSessionID!!!!
        String newMOASessionID = AuthenticationSessionStoreage.changeSessionID(moaSession);

        Logger.info("Changed MOASession " + moaSessionID + " to Session " + newMOASessionID);

        //redirect
        String redirectURL = null;
        redirectURL = new DataURLBuilder().buildDataURL(moaSession.getAuthURL(),
                ModulUtils.buildAuthURL(moaSession.getModul(), moaSession.getAction(), pendingRequestID),
                newMOASessionID);
        redirectURL = response.encodeRedirectURL(redirectURL);

        response.setContentType("text/html");
        response.setStatus(302);
        response.addHeader("Location", redirectURL);
        Logger.info("REDIRECT TO: " + redirectURL);

    } catch (AuthenticationException e) {
        handleError(null, e, request, response, pendingRequestID);

    } catch (MOAIDException e) {
        handleError(null, e, request, response, pendingRequestID);

    } catch (Exception e) {
        Logger.error("PEPSConnector has an interal Error.", e);
    }

    finally {
        ConfigurationDBUtils.closeSession();
    }

}

From source file:org.tridas.io.formats.tridasjson.TridasJSONFile.java

@SuppressWarnings("unchecked")
@Override//  www.  j a v  a  2 s  .co m
public String[] saveToString() {
    if (projects == null) {
        return null;
    }

    boolean gotData = false;
    StringWriter swriter = new StringWriter();

    JSONObject root = new JSONObject();

    String labcode = "";
    for (TridasProject project : projects) {

        for (TridasObject object : project.getObjects()) {
            try {
                labcode = TridasUtils.getGenericFieldByName(object, "tellervo.objectLabCode").getValue();
            } catch (NullPointerException e) {
                labcode = object.getTitle();
            }

            ArrayList<TridasElement> elementList = TridasUtils.getElementList(object);

            for (TridasElement element : elementList) {
                labcode += "-" + element.getTitle();
                for (TridasSample sample : element.getSamples()) {
                    labcode += "-" + sample.getTitle();
                    for (TridasRadius radius : sample.getRadiuses()) {
                        labcode += "-" + radius.getTitle();
                        for (TridasMeasurementSeries measurementseries : radius.getMeasurementSeries()) {
                            labcode += "-" + measurementseries.getTitle();

                            for (TridasValues valuesgroup : measurementseries.getValues()) {

                                ArrayList<Integer> data = new ArrayList<Integer>();
                                for (TridasValue value : valuesgroup.getValues()) {
                                    data.add(Integer.parseInt(value.getValue()));
                                }

                                JSONObject output = new JSONObject();
                                writeProjectToJSON(output, project);
                                writeObjectToJSON(output, object);
                                writeElementToJSON(output, element);
                                writeSampleToJSON(output, sample);
                                writeRadiusToJSON(output, radius);
                                writeSeriesToJSON(output, measurementseries);
                                String variable = "";
                                if (valuesgroup.isSetVariable()) {
                                    if (valuesgroup.getVariable().isSetNormalTridas()) {
                                        if (measurementseries.getValues().size() > 1) {
                                            labcode += "-"
                                                    + valuesgroup.getVariable().getNormalTridas().value();
                                            variable = "-"
                                                    + valuesgroup.getVariable().getNormalTridas().value();
                                        }
                                        output.put("series.values.variable",
                                                valuesgroup.getVariable().getNormalTridas().value());
                                    } else if (valuesgroup.getVariable().isSetNormal()) {
                                        if (measurementseries.getValues().size() > 1) {
                                            labcode += "-" + valuesgroup.getVariable().getNormal();
                                            variable = "-" + valuesgroup.getVariable().getNormal();
                                        }
                                        output.put("series.values.variable",
                                                valuesgroup.getVariable().getNormal());
                                    } else {
                                        if (measurementseries.getValues().size() > 1) {
                                            labcode += "-" + valuesgroup.getVariable().getValue();
                                            variable = "-" + valuesgroup.getVariable().getValue();
                                        }
                                        output.put("series.values.variable",
                                                valuesgroup.getVariable().getValue());
                                    }

                                } else {
                                    output.put("series.values.variable", "unknown");

                                }

                                if (valuesgroup.isSetUnit()) {
                                    if (valuesgroup.getUnit().isSetNormalTridas()) {
                                        output.put("series.values.units",
                                                valuesgroup.getUnit().getNormalTridas().value());
                                    } else if (valuesgroup.getUnit().isSetNormal()) {
                                        output.put("series.values.units",
                                                valuesgroup.getUnit().getNormal().toString());
                                    } else {
                                        output.put("series.values.units",
                                                valuesgroup.getUnit().getValue().toString());
                                    }

                                } else {
                                    output.put("series.units", "unitless");
                                }

                                output.put("series.values", data);

                                String key = getUniqueChildKey(root,
                                        measurementseries.getIdentifier().getValue() + variable, 0);

                                root.put(key, output);
                                gotData = true;

                            }
                        }
                    }
                }
            }
        }

        // DERIVED SERIES
        for (TridasDerivedSeries derivedSeries : project.getDerivedSeries()) {
            labcode += derivedSeries.getTitle();

            for (TridasValues valuesgroup : derivedSeries.getValues()) {

                ArrayList<Integer> data = new ArrayList<Integer>();
                for (TridasValue value : valuesgroup.getValues()) {
                    data.add(Integer.parseInt(value.getValue()));
                }

                JSONObject output = new JSONObject();
                writeProjectToJSON(output, project);
                writeSeriesToJSON(output, derivedSeries);
                String variable = "";
                if (valuesgroup.isSetVariable()) {
                    if (valuesgroup.getVariable().isSetNormalTridas()) {
                        if (derivedSeries.getValues().size() > 1) {
                            labcode += "-" + valuesgroup.getVariable().getNormalTridas().value();
                            variable = "-" + valuesgroup.getVariable().getNormalTridas().value();
                        }
                        output.put("series.values.variable",
                                valuesgroup.getVariable().getNormalTridas().value());
                    } else if (valuesgroup.getVariable().isSetNormal()) {
                        if (derivedSeries.getValues().size() > 1) {
                            labcode += "-" + valuesgroup.getVariable().getNormal();
                            variable = "-" + valuesgroup.getVariable().getNormal();
                        }
                        output.put("series.values.variable", valuesgroup.getVariable().getNormal());
                    } else {
                        if (derivedSeries.getValues().size() > 1) {
                            labcode += "-" + valuesgroup.getVariable().getValue();
                            variable = "-" + valuesgroup.getVariable().getValue();
                        }
                        output.put("series.values.variable", valuesgroup.getVariable().getValue());
                    }

                } else {
                    output.put("series.values.variable", "unknown");

                }

                if (valuesgroup.isSetUnit()) {
                    if (valuesgroup.getUnit().isSetNormalTridas()) {
                        output.put("series.values.units", valuesgroup.getUnit().getNormalTridas().value());
                    } else if (valuesgroup.getUnit().isSetNormal()) {
                        output.put("series.values.units", valuesgroup.getUnit().getNormal().toString());
                    } else {
                        output.put("series.values.units", valuesgroup.getUnit().getValue().toString());
                    }

                } else {
                    output.put("series.units", "unitless");
                }

                output.put("series.values", data);
                root.put(derivedSeries.getIdentifier().getValue() + variable, output);
                gotData = true;

            }
        }

    }

    if (!gotData) {
        return "{}".split("\n");
    }

    try {

        Gson gson = new GsonBuilder().setPrettyPrinting().create();
        JsonParser jp = new JsonParser();

        root.writeJSONString(swriter);
        JsonElement je = jp.parse(swriter.getBuffer().toString());
        String prettyJsonString = gson.toJson(je);

        return prettyJsonString.split("\n");

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return null;

}

From source file:ua.mkh.settings.full.MainActivity.java

protected void onResume() {
    super.onResume();
    // try{//from w  w  w.  ja va  2 s.co  m
    ButtonTextWifi();
    Airmode();
    ButtonTextBth();
    operator();
    //check_pirat();
    zimowets();

    ConnectivityManager conMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo info = conMgr.getActiveNetworkInfo();

    if (info != null && info.isConnected()) {
        mTask = new GetContacts();
        mTask.execute();
    }

    ///////////////// ?   Google
    try {
        if (account_name.length() == 0) {
            btn_iCloud.setText(R.string.icloud);
            //textView2.setText("");
            //textView1.setText("");
        } else {
            String t2 = getString(R.string.icloud) + "<br />" + "<font color=\"#808080\" >" + "<small><small>"
                    + account_name + "</small></small>" + "</font>";
            btn_iCloud.setText(Html.fromHtml(t2), TextView.BufferType.SPANNABLE);
        }
    } catch (NullPointerException e) {
        btn_iCloud.setText(R.string.icloud);
    }

    if (isSharingWiFi(wifi) == true) {
        textVPN.setText(R.string.on);
    } else {
        textVPN.setText(R.string.off);
    }

    ////Start page
    SharedPreferences sp = getSharedPreferences(MY_SETTINGS, Context.MODE_PRIVATE);
    // ?,    ?? 
    boolean hasVisited = sp.getBoolean("hasVisited", false);

    if (!hasVisited) {
        //   ?
        Intent intent = new Intent(this, ActivityStart.class);
        startActivity(intent);
        Editor e = sp.edit();
        e.putBoolean("hasVisited", true);
        e.apply(); //    ?
        stok();
    }
    //////////////////////////////////////        ////////

    ////ChangeLog

    PackageInfo pInfo;

    try {
        pInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
        versionNow = pInfo.versionName;
    } catch (NameNotFoundException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

    Log.d("HEY!", versionNow);

    String changeLog = sp.getString("version", "1.0");

    if (changeLog.contains(versionNow)) {

    } else {
        Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            public void run() {
                update();
            }
        }, 500);
        Editor e = sp.edit();
        e.putString("version", versionNow);
        e.apply(); //    ?

    }

    /////DATABASE     
    String DATA = mSettings.getString(APP_PREFERENCES_DATABASE, "0");
    if (DATA.contains(getString(R.string.ver_database))) {

    } else {
        copyDataBase();
        Editor editor = mSettings.edit();
        editor.putString(APP_PREFERENCES_DATABASE, getString(R.string.ver_database));
        editor.commit();
    }

    if (mSettings.contains(APP_PREFERENCES_NETWORK)) {
        //  ?  ?
        String network = mSettings.getString(APP_PREFERENCES_NETWORK, null);
        TextOper.setText(network);
        ImageView ImageView07 = (ImageView) findViewById(R.id.ImageView07);
        ImageView07.setVisibility(View.VISIBLE);
    }

    if (mSettings.contains(APP_PREFERENCES_tgb_menu)) {
        //  ?  ?
        Boolean menu = mSettings.getBoolean(APP_PREFERENCES_tgb_menu, true);
        if (menu == true) {
            menui = 1;
        } else {
            menui = 0;
        }
    }

    if (mSettings.contains(APP_PREFERENCES_MAIL)) {
        //  ?  ?
        mail_app = mSettings.getString(APP_PREFERENCES_MAIL, null);
        LinearLayoutMail.setVisibility(View.VISIBLE);
    }

    if (mSettings.contains(APP_PREFERENCES_NOTES)) {
        //  ?  ?
        notes_app = mSettings.getString(APP_PREFERENCES_NOTES, null);
        LinearLayoutNotes.setVisibility(View.VISIBLE);
    }

    if (mSettings.contains(APP_PREFERENCES_PHONE)) {
        //  ?  ?
        phone_app = mSettings.getString(APP_PREFERENCES_PHONE, null);
        LinearLayoutPhone.setVisibility(View.VISIBLE);
    }

    if (mSettings.contains(APP_PREFERENCES_MESSAGES)) {
        //  ?  ?
        messages_app = mSettings.getString(APP_PREFERENCES_MESSAGES, null);
        LinearLayoutMessages.setVisibility(View.VISIBLE);
    }

    if (mSettings.contains(APP_PREFERENCES_SAFARI)) {
        //  ?  ?
        safari_app = mSettings.getString(APP_PREFERENCES_SAFARI, null);
        LinearLayoutSafari.setVisibility(View.VISIBLE);
    }

    if (mSettings.contains(APP_PREFERENCES_MUSIC)) {
        //  ?  ?
        music_app = mSettings.getString(APP_PREFERENCES_MUSIC, null);
        LinearLayoutMusic.setVisibility(View.VISIBLE);
    }

    if (mSettings.contains(APP_PREFERENCES_GAMECENTER)) {
        //  ?  ?
        gamecenter_app = mSettings.getString(APP_PREFERENCES_GAMECENTER, null);
        LinearLayoutGameCenter.setVisibility(View.VISIBLE);
    }

    if (mSettings.contains(APP_PREFERENCES_WEATHER)) {
        //  ?  ?
        weather_app = mSettings.getString(APP_PREFERENCES_WEATHER, null);
        LinearLayoutWeather.setVisibility(View.VISIBLE);
    }

    if (mSettings.contains(APP_PREFERENCES_COMPASS)) {
        //  ?  ?
        compass_app = mSettings.getString(APP_PREFERENCES_COMPASS, null);
        LinearLayoutCompass.setVisibility(View.VISIBLE);
    }

    if (mSettings.contains(APP_PREFERENCES_MAPS)) {
        //  ?  ?
        maps_app = mSettings.getString(APP_PREFERENCES_MAPS, null);
        LinearLayoutMaps.setVisibility(View.VISIBLE);
    }

    if (mSettings.contains(APP_PREFERENCES_NOTIFICATIONS)) {
        //  ?  ?
        notifications_app = mSettings.getString(APP_PREFERENCES_NOTIFICATIONS, null);
        LinearLayoutNotif.setVisibility(View.VISIBLE);
    }

    if (mSettings.contains(APP_PREFERENCES_CONTROL)) {
        //  ?  ?
        control_app = mSettings.getString(APP_PREFERENCES_CONTROL, null);
        LinearLayoutControl.setVisibility(View.VISIBLE);
    }
    /*
    if (mSettings.contains(APP_PREFERENCES_ICLOUD)) {
    //  ?  ?
    icloud_app = mSettings.getString(APP_PREFERENCES_ICLOUD, null); }
    else {
      btn_iCloud.setEnabled(false);
      ImageView img81 = (ImageView)findViewById(R.id.ImageView81);
      img81.setVisibility(View.GONE);
    }
    */
    if (mSettings.contains(APP_PREFERENCES_ITUNES)) {
        //  ?  ?
        itunes_app = mSettings.getString(APP_PREFERENCES_ITUNES, null);
        LinearLayoutTunes.setVisibility(View.VISIBLE);
    }

    if (mSettings.contains(APP_PREFERENCES_NEW1)) {
        //  ?  ?
        new1_app = mSettings.getString(APP_PREFERENCES_NEW1, null);
        ApplicationInfo applicationInfo = null;
        try {
            applicationInfo = pm.getApplicationInfo(new1_app, 0);
        } catch (final NameNotFoundException e) {
        }
        final String title1 = (String) ((applicationInfo != null) ? pm.getApplicationLabel(applicationInfo)
                : "???");

        btn_new1.setText(title1);
        ImageView in1 = (ImageView) findViewById(R.id.ImageView62);
        Drawable icon1 = null;
        try {
            icon1 = getPackageManager().getApplicationIcon(new1_app);
        } catch (NameNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        in1.setImageDrawable(icon1);

        LinearLayoutNew1.setVisibility(View.VISIBLE);
    }

    if (mSettings.contains(APP_PREFERENCES_NEW2)) {
        //  ?  ?
        new2_app = mSettings.getString(APP_PREFERENCES_NEW2, null);

        ApplicationInfo applicationInfo = null;
        try {
            applicationInfo = pm.getApplicationInfo(new2_app, 0);
        } catch (final NameNotFoundException e) {
        }
        final String title2 = (String) ((applicationInfo != null) ? pm.getApplicationLabel(applicationInfo)
                : "???");

        btn_new2.setText(title2);
        ImageView in2 = (ImageView) findViewById(R.id.ImageView63);
        Drawable icon2 = null;
        try {
            icon2 = getPackageManager().getApplicationIcon(new2_app);
        } catch (NameNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        in2.setImageDrawable(icon2);

        LinearLayoutNew2.setVisibility(View.VISIBLE);
    }

    if (mSettings.contains(APP_PREFERENCES_NEW3)) {
        //  ?  ?
        new3_app = mSettings.getString(APP_PREFERENCES_NEW3, null);

        ApplicationInfo applicationInfo = null;
        try {
            applicationInfo = pm.getApplicationInfo(new3_app, 0);
        } catch (final NameNotFoundException e) {
        }
        final String title3 = (String) ((applicationInfo != null) ? pm.getApplicationLabel(applicationInfo)
                : "???");

        btn_new3.setText(title3);
        ImageView in3 = (ImageView) findViewById(R.id.ImageView66);
        Drawable icon3 = null;
        try {
            icon3 = getPackageManager().getApplicationIcon(new3_app);
        } catch (NameNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        in3.setImageDrawable(icon3);

        LinearLayoutNew3.setVisibility(View.VISIBLE);
    }

    if (mSettings.contains(APP_PREFERENCES_NEW4)) {
        //  ?  ?
        new4_app = mSettings.getString(APP_PREFERENCES_NEW4, null);

        ApplicationInfo applicationInfo = null;
        try {
            applicationInfo = pm.getApplicationInfo(new4_app, 0);
        } catch (final NameNotFoundException e) {
        }
        final String title4 = (String) ((applicationInfo != null) ? pm.getApplicationLabel(applicationInfo)
                : "???");

        btn_new4.setText(title4);
        ImageView in4 = (ImageView) findViewById(R.id.ImageView69);
        Drawable icon4 = null;
        try {
            icon4 = getPackageManager().getApplicationIcon(new4_app);
        } catch (NameNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        in4.setImageDrawable(icon4);
        LinearLayoutNew4.setVisibility(View.VISIBLE);
    }

    if (mSettings.contains(APP_PREFERENCES_VK)) {
        //  ?  ?
        vk_app = mSettings.getString(APP_PREFERENCES_VK, null);
        LinearLayoutVk.setVisibility(View.VISIBLE);
    }

    if (mSettings.contains(APP_PREFERENCES_VIBER)) {
        //  ?  ?
        viber_app = mSettings.getString(APP_PREFERENCES_VIBER, null);
        LinearLayoutViber.setVisibility(View.VISIBLE);
    }

    if (mSettings.contains(APP_PREFERENCES_OK)) {
        //  ?  ?
        ok_app = mSettings.getString(APP_PREFERENCES_OK, null);
        LinearLayoutOk.setVisibility(View.VISIBLE);
    }

    if (mSettings.contains(APP_PREFERENCES_SKYPE)) {
        //  ?  ?
        skype_app = mSettings.getString(APP_PREFERENCES_SKYPE, null);
        LinearLayoutSkype.setVisibility(View.VISIBLE);
    }

    if (mSettings.contains(APP_PREFERENCES_WHATSAPP)) {
        //  ?  ?
        whatsapp_app = mSettings.getString(APP_PREFERENCES_WHATSAPP, null);
        LinearLayoutWhatsapp.setVisibility(View.VISIBLE);
    }

    if (mSettings.contains(APP_PREFERENCES_TWITTER)) {
        //  ?  ?
        twitter_app = mSettings.getString(APP_PREFERENCES_TWITTER, null);
        LinearLayoutTwitter.setVisibility(View.VISIBLE);
    }

    if (mSettings.contains(APP_PREFERENCES_FACEBOOK)) {
        //  ?  ?
        facebook_app = mSettings.getString(APP_PREFERENCES_FACEBOOK, null);
        LinearLayoutFacebook.setVisibility(View.VISIBLE);
    }

    if (mSettings.contains(APP_PREFERENCES_INSTAGRAM)) {
        //  ?  ?
        instagram_app = mSettings.getString(APP_PREFERENCES_INSTAGRAM, null);
        LinearLayoutInstagram.setVisibility(View.VISIBLE);
    }
    /*
     if (mSettings.contains(APP_PREFERENCES_tgb_apn)) {
    //  ?  ?
       Boolean apn = mSettings.getBoolean(APP_PREFERENCES_tgb_apn, true);
    if (apn == true){
    LinearLayoutApn.setVisibility(View.VISIBLE);}
    else
       LinearLayoutApn.setVisibility(View.GONE);
    }
             
     if (mSettings.contains(APP_PREFERENCES_tgb_passcode)) {
    //  ?  ?
    Boolean passcode = mSettings.getBoolean(APP_PREFERENCES_tgb_passcode, true);
    if (passcode == true){
    LinearLayoutPasscode.setVisibility(View.VISIBLE);}
    else
       LinearLayoutPasscode.setVisibility(View.GONE);
     }
             
     if (mSettings.contains(APP_PREFERENCES_tgb_privacy)) {
    //  ?  ?
    Boolean privacy = mSettings.getBoolean(APP_PREFERENCES_tgb_privacy, true);
    if (privacy == true){
    LinearLayoutPrivacy.setVisibility(View.VISIBLE);}
    else
       LinearLayoutPrivacy.setVisibility(View.GONE);
    }
     */
    if (mSettings.contains(APP_PREFERENCES_bold_text)) {
        //  ?  ?
        Boolean bold = mSettings.getBoolean(APP_PREFERENCES_bold_text, true);
        if (bold == true) {
            btn_avia.setTypeface(typefaceBold);
            btn_wifi.setTypeface(typefaceBold);

            if (bt != null) {
                btn_bluetooth.setTypeface(typefaceBold);
                textbt.setTypeface(typefaceBold);
            }
            btn_battery.setTypeface(typefaceBold);
            btn_sota.setTypeface(typefaceBold);
            btn_operator.setTypeface(typefaceBold);
            btn_osnova.setTypeface(typefaceBold);
            btn_passcode.setTypeface(typefaceBold);
            btn_privacy.setTypeface(typefaceBold);
            btn_zvuki.setTypeface(typefaceBold);
            btn_oboi.setTypeface(typefaceBold);
            btn_notification.setTypeface(typefaceBold);
            btn_control.setTypeface(typefaceBold);
            btn_disturb.setTypeface(typefaceBold);
            btn_gps.setTypeface(typefaceBold);
            btn_mail.setTypeface(typefaceBold);
            btn_notes.setTypeface(typefaceBold);
            btn_messages.setTypeface(typefaceBold);
            btn_phone.setTypeface(typefaceBold);
            btn_safari.setTypeface(typefaceBold);
            btn_music.setTypeface(typefaceBold);
            btn_compass.setTypeface(typefaceBold);
            btn_weather.setTypeface(typefaceBold);
            btn_games.setTypeface(typefaceBold);
            btn_new1.setTypeface(typefaceBold);
            btn_new2.setTypeface(typefaceBold);
            btn_new3.setTypeface(typefaceBold);
            btn_new4.setTypeface(typefaceBold);
            btn_vpn.setTypeface(typefaceBold);
            btn_display.setTypeface(typefaceBold);
            textwifi.setTypeface(typefaceBold);
            TextOper.setTypeface(typefaceBold);
            btn_iCloud.setTypeface(typefaceBold);
            btn_iTunes.setTypeface(typefaceBold);
            textView1.setTypeface(typefaceBold);
            textView2.setTypeface(typefaceBold);
            textView3.setTypeface(typefaceBold);
            textVPN.setTypeface(typefaceBold);
            btn_maps.setTypeface(typefaceBold);
            btn_vk.setTypeface(typefaceBold);
            btn_viber.setTypeface(typefaceBold);
            btn_ok.setTypeface(typefaceBold);
            btn_skype.setTypeface(typefaceBold);
            btn_whatsapp.setTypeface(typefaceBold);
            btn_twitter.setTypeface(typefaceBold);
            btn_facebook.setTypeface(typefaceBold);
            btn_instagram.setTypeface(typefaceBold);

        }
    }

    int speed = mSettings.getInt(APP_PREFERENCES_ANIM_SPEED, 1);
    if (speed == 1) {
        center_to_right = R.anim.slide_center_to_right_short;
        center_to_right2 = R.anim.slide_center_to_right2_short;
        center_to_left = R.anim.slide_center_to_left_short;
        center_to_left2 = R.anim.slide_center_to_left2_short;
    }
    if (speed == 2) {
        center_to_right = R.anim.slide_center_to_right_medium;
        center_to_right2 = R.anim.slide_center_to_right2_medium;
        center_to_left = R.anim.slide_center_to_left_medium;
        center_to_left2 = R.anim.slide_center_to_left2_medium;
    }
    if (speed == 3) {
        center_to_right = R.anim.slide_center_to_right_long;
        center_to_right2 = R.anim.slide_center_to_right2_long;
        center_to_left = R.anim.slide_center_to_left_long;
        center_to_left2 = R.anim.slide_center_to_left2_long;
    }

    if (mSettings.contains(APP_PREFERENCES_text_size)) {
        //  ?  ?
        String size = mSettings.getString(APP_PREFERENCES_text_size, null);
        if (size.contains("Small")) {
            btn_avia.setTextSize(13);
            btn_wifi.setTextSize(13);

            if (bt != null) {
                btn_bluetooth.setTextSize(13);
                textbt.setTextSize(13);
            }
            btn_battery.setTextSize(13);
            btn_sota.setTextSize(13);
            btn_operator.setTextSize(13);
            btn_osnova.setTextSize(13);
            btn_passcode.setTextSize(13);
            btn_privacy.setTextSize(13);
            btn_zvuki.setTextSize(13);
            btn_oboi.setTextSize(13);
            btn_notification.setTextSize(13);
            btn_control.setTextSize(13);
            btn_disturb.setTextSize(13);
            btn_gps.setTextSize(13);
            btn_mail.setTextSize(13);
            btn_notes.setTextSize(13);
            btn_messages.setTextSize(13);
            btn_phone.setTextSize(13);
            btn_safari.setTextSize(13);
            btn_music.setTextSize(13);
            btn_compass.setTextSize(13);
            btn_weather.setTextSize(13);
            btn_games.setTextSize(13);
            btn_new1.setTextSize(13);
            btn_new2.setTextSize(13);
            btn_new3.setTextSize(13);
            btn_new4.setTextSize(13);
            btn_vpn.setTextSize(13);
            btn_display.setTextSize(13);
            textwifi.setTextSize(13);
            TextOper.setTextSize(13);
            btn_iCloud.setTextSize(13);
            btn_iTunes.setTextSize(13);
            textView1.setTextSize(13);
            textView2.setTextSize(9);
            textView3.setTextSize(12);
            textVPN.setTextSize(13);
            btn_maps.setTextSize(13);
            btn_vk.setTextSize(13);
            btn_viber.setTextSize(13);
            btn_ok.setTextSize(13);
            btn_skype.setTextSize(13);
            btn_whatsapp.setTextSize(13);
            btn_twitter.setTextSize(13);
            btn_facebook.setTextSize(13);
            btn_instagram.setTextSize(13);

        }
        if (size.contains("Normal")) {
            btn_avia.setTextSize(15);
            btn_wifi.setTextSize(15);

            if (bt != null) {
                btn_bluetooth.setTextSize(15);
                textbt.setTextSize(15);
            }
            btn_battery.setTextSize(15);
            btn_sota.setTextSize(15);
            btn_operator.setTextSize(15);
            btn_osnova.setTextSize(15);
            btn_passcode.setTextSize(15);
            btn_privacy.setTextSize(15);
            btn_zvuki.setTextSize(15);
            btn_oboi.setTextSize(15);
            btn_notification.setTextSize(15);
            btn_control.setTextSize(15);
            btn_disturb.setTextSize(15);
            btn_gps.setTextSize(15);
            btn_mail.setTextSize(15);
            btn_notes.setTextSize(15);
            btn_messages.setTextSize(15);
            btn_phone.setTextSize(15);
            btn_safari.setTextSize(15);
            btn_music.setTextSize(15);
            btn_compass.setTextSize(15);
            btn_weather.setTextSize(15);
            btn_games.setTextSize(15);
            btn_new1.setTextSize(15);
            btn_new2.setTextSize(15);
            btn_new3.setTextSize(15);
            btn_new4.setTextSize(15);
            btn_vpn.setTextSize(15);
            btn_display.setTextSize(15);
            textwifi.setTextSize(15);
            TextOper.setTextSize(15);
            btn_iCloud.setTextSize(15);
            btn_iTunes.setTextSize(15);
            //textView1.setTextSize(15);
            //textView2.setTextSize(11);
            textView3.setTextSize(13);
            textVPN.setTextSize(15);
            btn_maps.setTextSize(15);
            btn_vk.setTextSize(15);
            btn_viber.setTextSize(15);
            btn_ok.setTextSize(15);
            btn_skype.setTextSize(15);
            btn_whatsapp.setTextSize(15);
            btn_twitter.setTextSize(15);
            btn_facebook.setTextSize(15);
            btn_instagram.setTextSize(15);

        }
        if (size.contains("Large")) {
            btn_avia.setTextSize(18);
            btn_wifi.setTextSize(18);

            if (bt != null) {
                btn_bluetooth.setTextSize(18);
                textbt.setTextSize(18);
            }
            btn_battery.setTextSize(18);
            btn_sota.setTextSize(18);
            btn_operator.setTextSize(18);
            btn_osnova.setTextSize(18);
            btn_passcode.setTextSize(18);
            btn_privacy.setTextSize(18);
            btn_zvuki.setTextSize(18);
            btn_oboi.setTextSize(18);
            btn_notification.setTextSize(18);
            btn_control.setTextSize(18);
            btn_disturb.setTextSize(18);
            btn_gps.setTextSize(18);
            btn_mail.setTextSize(18);
            btn_notes.setTextSize(18);
            btn_messages.setTextSize(18);
            btn_phone.setTextSize(18);
            btn_safari.setTextSize(18);
            btn_music.setTextSize(18);
            btn_compass.setTextSize(18);
            btn_weather.setTextSize(18);
            btn_games.setTextSize(18);
            btn_new1.setTextSize(18);
            btn_new2.setTextSize(18);
            btn_new3.setTextSize(18);
            btn_new4.setTextSize(18);
            btn_vpn.setTextSize(18);
            btn_display.setTextSize(18);
            textwifi.setTextSize(18);
            TextOper.setTextSize(18);
            btn_iCloud.setTextSize(18);
            btn_iTunes.setTextSize(18);
            //textView1.setTextSize(18);
            //textView2.setTextSize(13);
            textView3.setTextSize(17);
            textVPN.setTextSize(18);
            btn_maps.setTextSize(18);
            btn_vk.setTextSize(18);
            btn_viber.setTextSize(18);
            btn_ok.setTextSize(18);
            btn_skype.setTextSize(18);
            btn_whatsapp.setTextSize(18);
            btn_twitter.setTextSize(18);
            btn_facebook.setTextSize(18);
            btn_instagram.setTextSize(18);

        }
        if (size.contains("xLarge")) {
            btn_avia.setTextSize(20);
            btn_wifi.setTextSize(20);

            if (bt != null) {
                btn_bluetooth.setTextSize(20);
                textbt.setTextSize(20);
            }
            btn_battery.setTextSize(20);
            btn_sota.setTextSize(20);
            btn_operator.setTextSize(20);
            btn_osnova.setTextSize(20);
            btn_passcode.setTextSize(20);
            btn_privacy.setTextSize(20);
            btn_zvuki.setTextSize(20);
            btn_oboi.setTextSize(20);
            btn_notification.setTextSize(20);
            btn_control.setTextSize(20);
            btn_disturb.setTextSize(20);
            btn_gps.setTextSize(20);
            btn_mail.setTextSize(20);
            btn_notes.setTextSize(20);
            btn_messages.setTextSize(20);
            btn_phone.setTextSize(20);
            btn_safari.setTextSize(20);
            btn_music.setTextSize(20);
            btn_compass.setTextSize(20);
            btn_weather.setTextSize(20);
            btn_games.setTextSize(20);
            btn_new1.setTextSize(20);
            btn_new2.setTextSize(20);
            btn_new3.setTextSize(20);
            btn_new4.setTextSize(20);
            btn_vpn.setTextSize(20);
            btn_display.setTextSize(20);
            textwifi.setTextSize(20);
            TextOper.setTextSize(20);
            btn_iCloud.setTextSize(20);
            btn_iTunes.setTextSize(20);
            //textView1.setTextSize(20);
            //textView2.setTextSize(15);
            textView3.setTextSize(18);
            textVPN.setTextSize(20);
            btn_maps.setTextSize(20);
            btn_vk.setTextSize(20);
            btn_viber.setTextSize(20);
            btn_ok.setTextSize(20);
            btn_skype.setTextSize(20);
            btn_whatsapp.setTextSize(20);
            btn_twitter.setTextSize(20);
            btn_facebook.setTextSize(20);
            btn_instagram.setTextSize(20);

        }
    }
    ifest();
    /*}
    catch(Exception e){
      StringWriter sw = new StringWriter();
        e.printStackTrace(new PrintWriter(sw));
        String stacktrace = sw.toString();
            
        // CREATE AN EMAIL INTENT TO SEND TO YOURSELF
        final Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
        emailIntent.setType("plain/text");
        emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[] { "maxim.khaydarov@yandex.ru" });
        emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "On Resume BUG REPORT");
        emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, stacktrace);
            
        // START THE EMAIL ACTIVITY - NOTE YOU NEED TO START IT WITH A CHOOSER
        startActivity(Intent.createChooser(emailIntent, "Send error report..."));
    }*/
}

From source file:org.rti.zcore.dar.remote.StockEncounter.java

/**
 * This is only for editing patient dispensary items
 * @param inputType/*from  w  w  w.ja  v  a2  s  .  com*/
 * @param value
 * @param pageItemId
 * @param formId
 * @param encounterId
 * @param widgetType  - "Form" or "Chart"
 * @param bridgeId - if the record is a patient bridge table
 * @return updated value
 */
public static String update(String inputType, String value, Long pageItemId, Long formId, Long encounterId,
        String widgetType, Long displayField, Long bridgeId, String currentFieldNameIdentifier) {
    String result = "";
    WebContext exec = WebContextFactory.get();
    String username = null;
    try {
        username = exec.getHttpServletRequest().getUserPrincipal().getName();
    } catch (NullPointerException e) {
        // unit testing - it's ok...
        username = "demo";
    }
    Connection conn = null;
    HttpSession session = null;
    try {
        conn = DatabaseUtils.getZEPRSConnection(username);
        SessionUtil zeprsSession = null;
        try {
            session = exec.getSession();
            zeprsSession = (SessionUtil) session.getAttribute("zeprs_session");
        } catch (Exception e) {
            // unit testing - it's ok...
        }
        Long patientId = null;
        Long eventId = null;
        Long siteId = null;
        String documentId = null;

        if (displayField == null) {
            displayField = encounterId;
        }

        PageItem pageItem = (PageItem) DynaSiteObjects.getPageItems().get(pageItemId);
        FormField formField = pageItem.getForm_field();
        Long formFieldId = formField.getId();

        if (widgetType.equals("Form")) {
            documentId = String.valueOf(formFieldId);
        } else if (widgetType.equals("Chart")) {
            documentId = String.valueOf(encounterId) + "." + String.valueOf(formFieldId);
        }
        if (pageItemId == 3861) {
            documentId = String.valueOf(encounterId) + "." + String.valueOf(displayField);
        }

        Form encounterForm = (Form) DynaSiteObjects.getForms().get(formId);
        if (encounterForm.getFormTypeId() == 6) { // patient bridge table form
            documentId = currentFieldNameIdentifier + String.valueOf(formFieldId);
        }

        SessionSubject sessionPatient = null; // sessionPatient used for rule processing in EncountersDAO.update
        if (zeprsSession != null) {
            try {
                sessionPatient = (SessionSubject) zeprsSession.getSessionPatient();
                patientId = zeprsSession.getSessionPatient().getId();
                eventId = zeprsSession.getSessionPatient().getCurrentEventId();
                ClientSettings clientSettings = zeprsSession.getClientSettings();
                siteId = clientSettings.getSiteId();
            } catch (SessionUtil.AttributeNotFoundException e) {
                log.error("inputType: " + inputType + " value: " + value + " pageItemId: " + pageItemId
                        + " formId: " + formId + " encounterId: " + encounterId);
                return documentId + "="
                        + "Error: your session may have expired. Please refresh this page or login again.";
            } catch (NullPointerException e) {
                // it's ok - testing
                patientId = new Long("44");
                eventId = new Long("38");
                siteId = new Long("1");
            }
        } else {
            log.error("inputType: " + inputType + " value: " + value + " pageItemId: " + pageItemId
                    + " formId: " + formId + " encounterId: " + encounterId);
            return documentId + "="
                    + "Error: your session may have expired. Please refresh this page or login again.";
        }

        Form form = (Form) DynaSiteObjects.getForms().get(formId);

        EncounterData encounter = null;
        String className = Constants.getDynasiteFormsPackage() + "."
                + StringManipulation.fixClassname(form.getName());
        Class clazz = null;
        try {
            clazz = Class.forName(className);
        } catch (ClassNotFoundException e) {
            log.error(e);
        }
        try {
            encounter = (EncounterData) clazz.newInstance();
        } catch (InstantiationException e) {
            log.error(e);
        } catch (IllegalAccessException e) {
            log.error(e);
        }

        try {
            encounter = (EncounterData) EncountersDAO.getOne(conn, encounterId, "SQL_RETRIEVEID" + formId,
                    clazz);
        } catch (IOException e) {
            log.error(e);
        } catch (ServletException e) {
            log.error(e);
        } catch (SQLException e) {
            log.error(e);
        } catch (ObjectNotFoundException e) {
            log.error(e);
        }

        // extra validation for stock.

        Long itemId = null;
        String dataType = formField.getType();
        Integer intValue = null;
        if (dataType.equals("Integer")) {
            try {
                intValue = Integer.valueOf(value);
            } catch (NumberFormatException e) {
                try {
                    throw new PersistenceException(
                            "This input field requires an integer value (e.g.: 55). You entered : " + value, e,
                            false);
                } catch (PersistenceException e1) {
                    result = documentId + "=" + "Error:" + e.getMessage();
                }
            }
        }

        if (formField.getIdentifier().equals("dispensed")) {
            String itemIdStr = null;
            String dispensedStr = null;
            Long originallyDispensed = null;
            try {
                itemIdStr = BeanUtils.getProperty(encounter, "item_id");
                dispensedStr = BeanUtils.getProperty(encounter, "dispensed");
            } catch (IllegalAccessException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            } catch (InvocationTargetException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            } catch (NoSuchMethodException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            if (itemIdStr != null) {
                itemId = Long.valueOf(itemIdStr);
                originallyDispensed = Long.valueOf(dispensedStr);
                if (DynaSiteObjects.getStatusMap().get("balanceMap") != null) {
                    HashMap<Long, StockReport> balanceMap = (HashMap<Long, StockReport>) DynaSiteObjects
                            .getStatusMap().get("balanceMap");
                    StockReport stockReport = balanceMap.get(itemId);
                    if (stockReport != null) {
                        Integer balance = stockReport.getBalanceBF();
                        if (balance <= 0) {
                            result = documentId
                                    + "=Error: This item is out of stock. Cannot proceed with this update. Current balance: "
                                    + balance;
                            return result;
                        } else if ((balance + originallyDispensed) - intValue < 0) { // add the originallyDispensed value back to the balanace, and then subtract the new dispensed value.
                            result = documentId
                                    + "=Error: This update would create a negative stock balanace Please reduce the amount dispensed. Current balance: "
                                    + balance;
                            return result;
                        }
                    }
                }
            }
        } else if (formField.getIdentifier().equals("item_id")) {
            result = documentId
                    + "=Error: You may not change the stock item. Either delete this record or set the Quantity dispensed for this item to zero (0) and create a new record (Dispensing link -> \"Create New Dispensing record\" link).";
            return result;
        }

        Timestamp lastModified = null;
        if (value != null) {
            try {
                EncountersDAO.update(conn, value, pageItemId, formId, encounterId, siteId, username, patientId,
                        eventId, sessionPatient, lastModified, bridgeId, currentFieldNameIdentifier, null,
                        session);
                if (formField.getIdentifier().equals("dispensed")) {
                    if ((itemId != null) && (DynaSiteObjects.getStatusMap().get("balanceMap") != null)) {
                        HashMap<Long, StockReport> balanceMap = (HashMap<Long, StockReport>) DynaSiteObjects
                                .getStatusMap().get("balanceMap");
                        StockReport stockReport = balanceMap.get(itemId);
                        if (stockReport != null) {
                            if (intValue != null) {
                                StockControl tempStockControl = InventoryDAO.getCurrentStockBalance(conn,
                                        itemId, null);
                                Integer currentBalance = tempStockControl.getBalance();
                                //Integer currentBalance = balanceBF - intValue;
                                stockReport.setBalanceBF(currentBalance);
                                stockReport.setOnHand(currentBalance);
                                balanceMap.put(itemId, stockReport);
                            }
                        }
                    }
                }
            } catch (SQLException e) {
                log.error(e);
            } catch (ServletException e) {
                log.error(e);
            } catch (PersistenceException e) {
                result = documentId + "=" + "Error:" + e.getMessage();
            } catch (ObjectNotFoundException e) {
                log.error(e);
            } catch (ClassNotFoundException e) {
                log.error(e);
            } catch (IOException e) {
                result = documentId + "=" + "Error:" + e.getMessage();
                log.error(e);
            }

            if (result.equals("")) {
                if (value.equals("")) {
                    result = documentId + "=" + value;
                } else {
                    if (inputType.equals("select") || inputType.equals("select-dwr")
                            || inputType.equals("multiselect_item")) {
                        FieldEnumeration fieldEnum = (FieldEnumeration) DynaSiteObjects.getFieldEnumerations()
                                .get(Long.valueOf(value));
                        switch (formFieldId.intValue()) {
                        default:
                            result = documentId + "=" + fieldEnum.getEnumeration();
                            break;
                        }
                    } else if (inputType.equals("lab_results")) {
                        FieldEnumeration fieldEnum = (FieldEnumeration) DynaSiteObjects.getFieldEnumerations()
                                .get(Long.valueOf(value));
                        result = documentId + "=" + fieldEnum.getEnumeration();
                    } else if (inputType.equals("currentMedicine")) {
                        // Drugs drug = DrugsDAO.getOne(Long.valueOf(value));
                        Drugs drug = null;
                        try {
                            drug = (Drugs) DynaSiteObjects.getDrugMap().get(Long.valueOf(value));
                            result = documentId + "=" + drug.getName();
                        } catch (NumberFormatException e) {
                            e.printStackTrace();
                        }
                        if (drug == null) {
                            result = documentId + "=" + value;
                        }
                    } else if (inputType.equals("Yes/No")) {
                        if (value.equals("1")) {
                            value = "Yes";
                        } else if (value.equals("0")) {
                            value = "No";
                        }
                        result = documentId + "=" + value;
                    } else if (inputType.equals("checkbox")) {
                        if (value.equals("true")) {
                            value = "Yes";
                        } else if (value.equals("1")) {
                            value = "Yes";
                        } else if (value.equals("on")) {
                            value = "Yes";
                        } else if (value.equals("false")) {
                            value = "";
                        } else if (value.equals("0")) {
                            value = "";
                        } else if (value.equals("off")) {
                            value = "";
                        }
                        result = documentId + "=" + value;
                    } else if (inputType.equals("checkbox_dwr")) {
                        if (value.equals("true")) {
                            value = "Yes";
                        } else if (value.equals("on")) {
                            value = "Yes";
                        } else if (value.equals("false")) {
                            value = "";
                        } else if (value.equals("off")) {
                            value = "";
                        }
                        result = documentId + "=" + value;
                    } else if (inputType.equals("sex")) {
                        if (value.equals("1")) {
                            value = "Female";
                        } else if (value.equals("2")) {
                            value = "Male";
                        }
                        result = documentId + "=" + value;
                    } else if (inputType.equals("ega")) {
                        int valueInt = new Integer(value);
                        int days = valueInt % 7;
                        int weeks = valueInt / 7;
                        value = weeks + ", " + days + "/7";
                        result = documentId + "=" + value;
                    } else if (pageItem.getInputType().equals("sites")
                            || pageItem.getInputType().equals("sites_not_selected")) {
                        Long thisSite = new Long(value);
                        Site site = (Site) DynaSiteObjects.getClinicMap().get(thisSite);
                        value = site.getName();
                        result = documentId + "=" + value;
                    } else if (inputType.equals("text") & displayField.intValue() != formFieldId.intValue()) {
                        // used in Lab form chart to share two fields in one cell.
                        /*if (displayField != 0) {
                        documentId = String.valueOf(encounterId) + "." + String.valueOf(displayField);
                        }*/
                        result = documentId + "=" + value;
                        //} else if (inputType.equals("dropdown") & currentFieldNameIdentifier != null) {
                    } else if (inputType.equals("dropdown") || inputType.equals("dropdown-add-one")
                            || inputType.equals("dropdown_site")) {
                        //Integer id = Integer.valueOf(value);
                        String uuidValue = null;
                        Integer id = null;
                        if (pageItem.getFkIdentifier() != null && pageItem.getFkIdentifier().equals("uuid")) {
                            uuidValue = value;
                        } else {
                            id = Integer.valueOf(value);
                        }
                        DropdownItem item = null;
                        try {
                            item = WidgetUtils.getDropdownItem(conn, pageItem.getDropdownTable(),
                                    pageItem.getDropdownColumn(), id, null, pageItem.getFkIdentifier(),
                                    uuidValue);
                        } catch (ObjectNotFoundException e) {
                            log.debug("value for Dropdown item not found:" + e);
                        } catch (SQLException e) {
                            log.debug("value for Dropdown item not found:" + e);
                        }
                        if (item != null) {
                            value = item.getDropdownValue();
                            result = documentId + "=" + value;
                        } else {
                            value = "Unable to fetch updated value.";
                            result = documentId + "=" + value;
                        }
                    } else {
                        result = documentId + "=" + value;
                    }
                }
            }
        } else {
            result = documentId + "=" + "Error: No value entered.";
        }
    } catch (ServletException e) {
        log.error(e);
    } catch (NumberFormatException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } finally {
        try {
            if (conn != null && !conn.isClosed()) {
                conn.close();
                conn = null;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    return result;
}

From source file:com.bzcentre.dapiPush.DapiReceiver.java

@Override
public Object[] invoke(Map<String, Object> request) {
    NginxClojureRT.log.info(TAG + " is invoked...");
    String chk_token;/*from w ww .  j a va2 s . co  m*/
    String user_id;
    String invitations;
    String return_code = "";
    String dummy_header = "http://www.dummy.com/dummy?"; // full url for URLEncodedUtils
    String payload;
    String provider;
    MsgCounter msgCounter = new MsgCounter();
    @SuppressWarnings("unused")
    Integer isModerator;
    String query;
    String dapiToken = newBzToken(service_seed);
    int push_status = NGX_HTTP_FORBIDDEN;

    GsonBuilder gBuilder = new GsonBuilder();
    gBuilder.registerTypeAdapter(new TypeToken<Receipient>() {
    }.getType(), new ReceipientTypeAdapter());
    Gson g = gBuilder.disableHtmlEscaping().serializeNulls().create();
    List<String[]> undeliverables = new ArrayList<>();
    Set<String> deliverables = new HashSet<>();

    String msg = "";
    errMsg = null;

    String requestMethod;

    // Supported request map constants can be find in the MiniConstants file
    requestMethod = request.get(REQUEST_METHOD).toString();
    if (requestMethod.equals(GET) && request.containsKey(QUERY_STRING)) {
        try {
            msg = dummy_header + request.get(QUERY_STRING).toString();
        } catch (NullPointerException e) {
            errMsg = "NullPointerException" + e.getMessage();
        }
    } else if (requestMethod.equals(POST)) {
        if (request.containsKey(BODY)) {
            InputStream body = (InputStream) request.get(BODY);
            BufferedReader bReader = new BufferedReader(new InputStreamReader(body));
            StringBuilder sbfFileContents = new StringBuilder();
            //read file line by line
            try {
                while ((msg = bReader.readLine()) != null) {
                    sbfFileContents.append(msg);
                }
                msg = dummy_header + sbfFileContents.toString();
            } catch (IOException e) {
                errMsg = "IOException" + e.getMessage();
            } catch (NullPointerException e) {
                errMsg = "Null Content, Error :" + e.getMessage();
            }
        } else {
            errMsg = "NO BODY";
        }
    }

    if (errMsg != null) {
        NginxClojureRT.log.info(TAG + "http parse error:" + errMsg);
        return new Object[] { NGX_HTTP_BAD_REQUEST, ArrayMap.create(CONTENT_TYPE, "text/plain"), //headers map
                "{\"method\":\"" + requestMethod + " \", \"message\":\"" + errMsg + "\"}" //response body can be string, File or Array/Collection of string or File
        };
    }
    // invitations is a base64+URLencoded string
    try {
        NginxClojureRT.log.debug(TAG + "msg get from body:\n" + msg);

        final Map<String, Object> queryMap = convertQueryStringToMap(msg);
        PushNotificationResponse<SimpleApnsPushNotification> apnsProxyResponse;
        chk_token = queryMap.get("dapiToken").toString();
        user_id = queryMap.get("user_id").toString();

        invitations = queryMap.get("invitations").toString();
        invitations = StringUtils.newStringUtf8(Base64.decodeBase64(invitations));
        NginxClojureRT.log.debug(TAG + "after base64 decode:\n" + invitations);

        if (chk_token.equals(dapiToken)) { // Hoicoi Token validation
            List<Receipient> invitees;
            NginxClojureRT.log.info(TAG + "Parsing invitees from json..." + invitations);
            invitees = g.fromJson(invitations, new TypeToken<ArrayList<Receipient>>() {
            }.getType());

            NginxClojureRT.log.info(TAG + "user " + user_id + " is sending " + invitees.size()
                    + " push token(s) to user(s) " + g.toJson(invitees.get(0).getPayload().getAcme7()));
            // receipient={"fcm_token","apns_token","payload"}
            // payload class is as APNS message payload defined, FCM needs to map to it.
            msgCounter.countdown = invitees.size();
            NginxClojureRT.log.info(TAG + "msgCounter[countdown,apns,fcm]:" + msgCounter.list());
            for (Receipient receipient : invitees) {
                return_code = "";
                payload = g.toJson(receipient.getPayload());
                //                  isModerator= receipient.getIsMdr();

                // default state sent_request, ApnsProxy will validate the result and make state update
                if (receipient.getApns_Token() != null && !receipient.getApns_Token().isEmpty()
                        && payload != null) {
                    query = "INSERT INTO `notification_push_blacklist` (`provider`,`user_id`,`to_token`) VALUES ('apns',"
                            + receipient.getPayload().getAcme8() + ",'" + receipient.getApns_Token() + "')";
                    try {
                        stmt.executeUpdate(query);
                    } catch (SQLException e) {
                        if (e.getErrorCode() != 1062) { // code 1062=duplicate entry
                            NginxClojureRT.log.info(TAG + "apns query exception near line 186: "
                                    + e.getMessage() + " when\n" + query);
                        }
                    }

                    provider = "apns";
                    switch (inBlackList(receipient.getPayload().getAcme8(), receipient.getApns_Token())) {
                    case "sent_request":
                    case "false":

                        apnsProxyResponse = apnsProxy.apnsPush(receipient.getApns_Token(), payload);

                        if (apnsProxyResponse.isAccepted()) {
                            NginxClojureRT.log.info(TAG + "Pushing notification to user "
                                    + receipient.getPayload().getAcme8() + " through APNS.");

                            MessageProcessor.pushBlackList(receipient.getApns_Token(), "whiteList", null);
                            deliverables.add(receipient.getPayload().getAcme8());
                            push_status = (push_status == NGX_HTTP_FORBIDDEN ? NGX_HTTP_NO_CONTENT
                                    : push_status); //status 204
                            return_code = "apns_pushOK";
                            msgCounter.countdown--;
                            msgCounter.apns++;
                        } else {
                            String reason = apnsProxyResponse.getRejectionReason();
                            Date timestamp = apnsProxyResponse.getTokenInvalidationTimestamp();
                            push_status = NGX_HTTP_NOT_FOUND;

                            if (reason.equals("BadDeviceToken") || reason.equals("Unregistered")) {
                                MessageProcessor.pushBlackList(receipient.getApns_Token(), reason, timestamp);
                            } else {
                                MessageProcessor.pushBlackList(receipient.getApns_Token(), "whiteList", null);
                            }

                            String[] undeliverable = { provider, receipient.getApns_Token(),
                                    receipient.getPayload().getAcme8() };
                            undeliverables.add(undeliverable);
                            msgCounter.countdown--;
                        }
                        break;
                    case "inactive":
                        push_status = NGX_HTTP_NOT_FOUND;// status 404, to indicate that the user removes the app.
                        return_code = "Unregistered";
                        String[] undeliverable = { provider, receipient.getApns_Token(),
                                receipient.getPayload().getAcme8() };
                        undeliverables.add(undeliverable);
                        msgCounter.countdown--;
                        NginxClojureRT.log.info(TAG + "Already in blacklist:" + receipient.getApns_Token());
                        break;
                    default:
                        msgCounter.countdown--;
                        return_code = "apns_blacklist_null_exception";
                        NginxClojureRT.log.info(TAG + "APNS BlackList check return null!");
                        break;
                    }
                }

                if (receipient.getFcm_Token() != null && receipient.getFcm_Token().isEmpty()
                        && payload != null) {
                    //                     Timestamp timestamp = new Timestamp(System.currentTimeMillis());
                    query = "INSERT INTO `notification_push_blacklist` (`provider`,`user_id`,`to_token`) VALUES ('fcm',"
                            + receipient.getPayload().getAcme8() + ",'" + receipient.getFcm_Token() + "')";
                    try {
                        stmt.executeUpdate(query);
                    } catch (SQLException e) {
                        if (e.getClass().getName().equals("com.mysql.jdbc.CommunicationsException")) {
                            rebuildDBConnection("stmt", query);
                        }

                        if (e.getErrorCode() != 1062) { // code 1062=duplicate entry
                            NginxClojureRT.log.info(TAG + "odbc query exception near line 223 => Code:"
                                    + e.getErrorCode() + " : " + e.getMessage() + "\n" + query);
                        }
                    }

                    provider = "fcm";
                    String responseType = inBlackList(receipient.getPayload().getAcme8(),
                            receipient.getFcm_Token());
                    switch (responseType) {
                    case "sent_request":
                    case "false":
                        msgCounter.countdown--;
                        if (fcmProxy.fcmPush(receipient.getFcm_Token(), payload)) {
                            deliverables.add(receipient.getPayload().getAcme8());
                            push_status = (push_status == NGX_HTTP_FORBIDDEN ? NGX_HTTP_NO_CONTENT
                                    : push_status); //status 204
                            return_code = "fcm_pushOK";
                            msgCounter.fcm++;
                            break;
                        } else {
                            String response = inBlackList(receipient.getPayload().getAcme8(),
                                    receipient.getFcm_Token());
                            if (!response.equals("inactive")) {
                                NginxClojureRT.log.info("TAG"
                                        + "Some thing wrong with the fcmPush. Expecting inactive but ... ->"
                                        + response);
                                break;
                            } else {
                                msgCounter.countdown++; // if is inactive, continue inactive block, so add the counter back.
                            }
                        }
                    case "inactive":
                        push_status = NGX_HTTP_NOT_FOUND;// status 404, to indicate that the user removes the app.
                        return_code = "Unregistered";
                        String[] undeliverable = { provider, receipient.getFcm_Token(),
                                receipient.getPayload().getAcme8() };
                        undeliverables.add(undeliverable);
                        msgCounter.countdown--;
                        if (responseType.equals("inactive"))
                            NginxClojureRT.log.info(TAG + "Already in blacklist:" + receipient.getFcm_Token());
                        break;
                    default:
                        msgCounter.countdown--;
                        return_code = "fcm_blacklist_null_exception";
                        NginxClojureRT.log.info(TAG + "FCM BlackList nullException!");
                        break;
                    }
                }
                NginxClojureRT.log.info(TAG + "msgCounter[countdown,apns,fcm]:" + msgCounter.list());
                if (msgCounter.countdown == 0) {
                    NginxClojureRT.log.info(TAG + "There are " + (msgCounter.apns + msgCounter.fcm)
                            + " notification(s) ha(s)(ve) been successfully pushed to user(s) "
                            + g.toJson(deliverables) + " for => "
                            + invitees.get(0).getPayload().getAps().getAlert().getBody());
                    return wrapupPushResult(receipient.getPayload().getAcme8(), push_status, return_code,
                            deliverables, msgCounter, undeliverables);
                }
            }
        } else {
            return_code = "InvalidToken";
            errMsg = "HoiCoi Token is not valid<br>" + chk_token + "<br>" + dapiToken;
        }
    } catch (IllegalArgumentException | JsonParseException | IllegalStateException | NullPointerException
            | ClassCastException | URISyntaxException e) {
        return_code = e.getClass().getName();
        errMsg = e.getMessage();
        e.printStackTrace();
    }

    return new Object[] { NGX_HTTP_FORBIDDEN, ArrayMap.create(CONTENT_TYPE, "text/plain"), //headers map
            "{\"code\":\"" + (return_code.isEmpty() ? "future_not_response" : return_code)
                    + "\", \"message\":\"Should return from the Future response.\"}" //response body can be string, File or Array/Collection of string or File
    };
}

From source file:atlas.kingj.roi.FrmMain.java

/**
 * Initialize the contents of the frame.
 *///from w  w w .  ja v a 2 s.  c o m
private void initialize() {

    frmTitanRoiCalculator = new JFrame();
    frmTitanRoiCalculator.addWindowListener(new FrmTitanRoiCalculatorWindowListener());
    frmTitanRoiCalculator.setResizable(false);
    frmTitanRoiCalculator.setTitle("Titan Production Calculator");
    try {
        frmTitanRoiCalculator.setIconImage(ImageIO.read(FrmMain.class.getResourceAsStream("/atlas/logo.png")));//Toolkit.getDefaultToolkit().getImage(FrmMain.class.getResource("/atlas/logo.png")));
    } catch (NullPointerException e) {
        System.out.println("Image load error");
    } catch (IOException e1) {
        e1.printStackTrace();
    }
    frmTitanRoiCalculator.setBounds(100, 100, 800, 600);
    frmTitanRoiCalculator.setLocationRelativeTo(null);
    frmTitanRoiCalculator.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);//JFrame.EXIT_ON_CLOSE);

    JMenuBar menuBar = new JMenuBar();
    frmTitanRoiCalculator.setJMenuBar(menuBar);

    JMenu mnFile = new JMenu("File");
    mnFile.setMnemonic('F');
    menuBar.add(mnFile);

    mntmOpen = new JMenuItem("Open");
    mntmOpen.setMnemonic('O');
    mntmOpen.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, InputEvent.CTRL_MASK));
    mntmOpen.addActionListener(new MntmOpenActionListener());
    mnFile.add(mntmOpen);

    mntmSave = new JMenuItem("Save");
    mntmSave.setMnemonic('S');
    mntmSave.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_MASK));
    mntmSave.addActionListener(new MntmSaveActionListener());
    mnFile.add(mntmSave);

    JMenuItem mntmExit = new JMenuItem("Exit");
    mntmExit.setMnemonic('X');
    mntmExit.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            SaveAndClose();
        }
    });

    mntmSaveAll = new JMenuItem("Save All");
    mntmSaveAll.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            SaveAll();
        }
    });

    mntmOpenAll = new JMenuItem("Open All");
    mntmOpenAll.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            OpenAll();
        }
    });
    mnFile.add(mntmOpenAll);
    mntmSaveAll.setMnemonic('V');
    mnFile.add(mntmSaveAll);

    mnExport = new JMenu("Export");
    mnFile.add(mnExport);

    mntmSpreadsheet = new JMenuItem("Spreadsheet");
    mntmSpreadsheet.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            ResetStatusLabel();

            fc = new OpenSaveFileChooser();
            fc.setFileFilter(new XLSfilter());
            fc.type = 3;

            int returnVal = fc.showSaveDialog(frmTitanRoiCalculator);
            if (returnVal == JFileChooser.APPROVE_OPTION) {

                File file = fc.getSelectedFile();

                String path = file.getAbsolutePath();

                String extension = ".xls";

                if (!path.endsWith(extension)) {
                    file = new File(path + extension);
                }

                StatusDialog a = new StatusDialog("Generating spreadsheet...");

                SaveFileWorker worker = new SaveFileWorker(file, a, false);

                worker.execute();

                a.setLocationRelativeTo(frmTitanRoiCalculator);
                a.setVisible(true);

                if (FileSaveError)
                    ShowMessage("File save error");
                else if (FileSaveWarning)
                    ShowMessage("File saved, but possible errors.");
                else
                    ShowMessageSuccess("File saved.");

            }
        }
    });
    mnExport.add(mntmSpreadsheet);
    mnFile.add(mntmExit);

    JMenu mnView = new JMenu("View");
    mnView.setMnemonic('V');
    menuBar.add(mnView);

    RoiData = new ROIData();

    mntmUnitConverter = new JMenuItem("Unit Converter");
    mntmUnitConverter.setMnemonic('C');
    mntmUnitConverter.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_U, InputEvent.CTRL_MASK));
    mntmUnitConverter.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            new UnitConverter();
        }
    });
    mnView.add(mntmUnitConverter);

    mnSettings = new JMenu("Settings");
    mnSettings.setMnemonic('E');
    menuBar.add(mnSettings);

    mnUnits = new JMenu("Units");
    mnUnits.setMnemonic('U');
    mnSettings.add(mnUnits);

    rdbtnmntmImperial = new JRadioButtonMenuItem("Imperial");
    rdbtnmntmImperial.setMnemonic('I');
    rdbtnmntmImperial.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_I, InputEvent.CTRL_MASK));
    rdbtnmntmImperial.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            if (metric) {
                // Change units from metric to imperial
                ChangeUnits();
            }
        }
    });
    mnUnits.add(rdbtnmntmImperial);

    rdbtnmntmMetric = new JRadioButtonMenuItem("Metric");
    rdbtnmntmMetric.setMnemonic('M');
    rdbtnmntmMetric.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_M, InputEvent.CTRL_MASK));
    rdbtnmntmMetric.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            if (!metric) {
                // Change units from imperial to metric
                ChangeUnits();
            }
        }
    });
    rdbtnmntmMetric.setSelected(true);
    mnUnits.add(rdbtnmntmMetric);

    btnsUnits.add(rdbtnmntmMetric);
    btnsUnits.add(rdbtnmntmImperial);

    JMenuItem mntmOptions_1 = new JMenuItem("Options");
    mntmOptions_1.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_T, InputEvent.CTRL_MASK));
    mntmOptions_1.setMnemonic('O');
    mntmOptions_1.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            Machine machine = null;
            if (listMachines.getSelectedIndex() > -1)
                machine = (Machine) listMachines.getSelectedValue();
            OptionDialog options = new OptionDialog(environment, machine);
            options.setLocationRelativeTo(frmTitanRoiCalculator);
            options.addWindowListener(new WindowAdapter() {
                @Override
                public void windowClosed(WindowEvent e) {
                    UpdateAnalysis();
                }
            });
            options.setVisible(true);
        }
    });

    mnTimings = new JMenu("Timings");
    mnSettings.add(mnTimings);

    mntmSaveToFile = new JMenuItem("Save to File");
    mntmSaveToFile.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            OperatorTimings times = environment.timings;

            fc = new OpenSaveFileChooser();
            fc.setFileFilter(new OBJfilter(3));
            fc.type = 1;

            int returnVal = fc.showSaveDialog(frmTitanRoiCalculator);
            if (returnVal == JFileChooser.APPROVE_OPTION) {

                File file = fc.getSelectedFile();

                String path = file.getAbsolutePath();

                String extension = ".ser";

                if (!path.endsWith(extension)) {
                    file = new File(path + extension);
                }

                try {
                    FileOutputStream fout = new FileOutputStream(file);
                    ObjectOutputStream oos = new ObjectOutputStream(fout);
                    oos.writeObject(times);
                    oos.close();
                    ShowMessageSuccess("File saved.");
                } catch (Exception e1) {
                    JOptionPane.showMessageDialog(frmTitanRoiCalculator, "Error writing file.", "Error",
                            JOptionPane.ERROR_MESSAGE);
                }
            }
        }
    });
    mnTimings.add(mntmSaveToFile);

    mntmLoadFromFile = new JMenuItem("Load from File");
    mntmLoadFromFile.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {

            fc = new OpenSaveFileChooser();
            fc.setFileFilter(new OBJfilter(3));
            fc.type = 1;

            int returnVal = fc.showOpenDialog(frmTitanRoiCalculator);
            if (returnVal == JFileChooser.APPROVE_OPTION) {

                File file = fc.getSelectedFile();

                try {
                    FileInputStream fin = new FileInputStream(file);
                    ObjectInputStream ois = new ObjectInputStream(fin);
                    environment.timings = (OperatorTimings) ois.readObject();
                    ois.close();

                    ShowMessageSuccess("File loaded.");

                } catch (Exception e1) {
                    ShowMessage("File error.");
                }
            }
        }
    });
    mnTimings.add(mntmLoadFromFile);
    mnSettings.add(mntmOptions_1);

    JMenu mnHelp = new JMenu("Help");
    mnHelp.setMnemonic('H');
    menuBar.add(mnHelp);

    JMenuItem mntmInstructions = new JMenuItem("Instructions");
    mntmInstructions.setMnemonic('I');
    mntmInstructions.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            InstructDialog instructions = new InstructDialog();
            instructions.setLocationRelativeTo(frmTitanRoiCalculator);
            instructions.setVisible(true);
        }
    });
    mnHelp.add(mntmInstructions);

    JMenuItem mntmAbout = new JMenuItem("About");
    mntmAbout.setMnemonic('A');
    mntmAbout.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            AboutDialog about = new AboutDialog();
            about.setLocationRelativeTo(frmTitanRoiCalculator);
            about.setVisible(true);
        }
    });
    mnHelp.add(mntmAbout);

    tabbedPane = new JTabbedPane(JTabbedPane.TOP);
    tabbedPane.addChangeListener(TabChangeListener);
    frmTitanRoiCalculator.getContentPane().add(tabbedPane, BorderLayout.CENTER);

    pnlMachine = new JPanel();
    tabbedPane.addTab("Machine Selection", null, pnlMachine, "Add and configure machine setups");
    tabbedPane.setEnabledAt(0, true);
    pnlMachine.setLayout(null);

    grpMachines = new JPanel();
    grpMachines.setFont(new Font("Tahoma", Font.PLAIN, 11));
    grpMachines.setBounds(20, 72, 182, 256);
    grpMachines.setBorder(
            new TitledBorder(null, "Machine Type", TitledBorder.LEADING, TitledBorder.TOP, null, null));
    pnlMachine.add(grpMachines);
    grpMachines.setLayout(null);

    try {
        rdbtnER610 = new JRadioButton(
                new ImageIcon(ImageIO.read(FrmMain.class.getResourceAsStream("/atlas/er610.png"))));
        rdbtnER610.setDisabledIcon(
                new ImageIcon(ImageIO.read(FrmMain.class.getResourceAsStream("/atlas/er610_dis.png"))));
        rdbtnER610.setDisabledSelectedIcon(
                new ImageIcon(ImageIO.read(FrmMain.class.getResourceAsStream("/atlas/er610_dis.png"))));
        rdbtnER610.setEnabled(false);
        rdbtnER610.setToolTipText("Titan ER610");
    } catch (NullPointerException e1) {
        System.out.println("Image load error");
    } catch (IOException e1) {
        e1.printStackTrace();
    }

    rdbtnER610.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            rdbtnClick("ER610");
            UpdateMachine();
            listMachines.repaint();
        }
    });
    rdbtnER610.setSelected(true);
    rdbtnER610.setBounds(13, 24, 155, 40);
    try {
        rdbtnER610.setPressedIcon(
                new ImageIcon(ImageIO.read(FrmMain.class.getResourceAsStream("/atlas/er610_down.png"))));
        rdbtnER610.setRolloverEnabled(true);
        rdbtnER610.setRolloverIcon(
                new ImageIcon(ImageIO.read(FrmMain.class.getResourceAsStream("/atlas/er610_over.png"))));
        rdbtnER610.setSelectedIcon(
                new ImageIcon(ImageIO.read(FrmMain.class.getResourceAsStream("/atlas/er610_select.png"))));
    } catch (NullPointerException e11) {
        System.out.println("Image load error");
    } catch (IOException e1) {
        e1.printStackTrace();
    }
    grpMachines.add(rdbtnER610);

    try {
        rdbtnSR9DS = new JRadioButton(
                new ImageIcon(ImageIO.read(FrmMain.class.getResourceAsStream("/atlas/sr9ds.png"))));
        rdbtnSR9DS.setDisabledIcon(
                new ImageIcon(ImageIO.read(FrmMain.class.getResourceAsStream("/atlas/sr9ds_dis.png"))));
        rdbtnSR9DS.setEnabled(false);
        rdbtnSR9DS.setToolTipText("Titan SR9-DS");
    } catch (NullPointerException e11) {
        System.out.println("Image load error");
    } catch (IOException e1) {
        e1.printStackTrace();
    }
    rdbtnSR9DS.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            rdbtnClick("SR9DS");
            UpdateMachine();
            listMachines.repaint();
        }
    });

    try {
        rdbtnSR9DS.setPressedIcon(
                new ImageIcon(ImageIO.read(FrmMain.class.getResourceAsStream("/atlas/sr9ds_down.png"))));
        rdbtnSR9DS.setRolloverEnabled(true);
        rdbtnSR9DS.setRolloverIcon(
                new ImageIcon(ImageIO.read(FrmMain.class.getResourceAsStream("/atlas/sr9ds_over.png"))));
        rdbtnSR9DS.setSelectedIcon(
                new ImageIcon(ImageIO.read(FrmMain.class.getResourceAsStream("/atlas/sr9ds_select.png"))));
        rdbtnSR9DS.setBounds(13, 68, 155, 40);
        grpMachines.add(rdbtnSR9DS);

        rdbtnSR9DT = new JRadioButton(
                new ImageIcon(ImageIO.read(FrmMain.class.getResourceAsStream("/atlas/sr9dt.png"))));
        rdbtnSR9DT.setDisabledIcon(
                new ImageIcon(ImageIO.read(FrmMain.class.getResourceAsStream("/atlas/sr9dt_dis.png"))));
        rdbtnSR9DT.setEnabled(false);
        rdbtnSR9DT.setToolTipText("Titan SR9-DT");
    } catch (NullPointerException e11) {
        System.out.println("Image load error");
    } catch (IOException e1) {
        e1.printStackTrace();
    }
    rdbtnSR9DT.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            rdbtnClick("SR9DT");
            UpdateMachine();
            listMachines.repaint();
        }
    });
    rdbtnSR9DT.setBounds(13, 112, 155, 40);
    try {
        rdbtnSR9DT.setPressedIcon(
                new ImageIcon(ImageIO.read(FrmMain.class.getResourceAsStream("/atlas/sr9dt_down.png"))));
        rdbtnSR9DT.setRolloverEnabled(true);
        rdbtnSR9DT.setRolloverIcon(
                new ImageIcon(ImageIO.read(FrmMain.class.getResourceAsStream("/atlas/sr9dt_over.png"))));
        rdbtnSR9DT.setSelectedIcon(
                new ImageIcon(ImageIO.read(FrmMain.class.getResourceAsStream("/atlas/sr9dt_select.png"))));
    } catch (NullPointerException e11) {
        System.out.println("Image load error");
    } catch (IOException e1) {
        e1.printStackTrace();
    }
    grpMachines.add(rdbtnSR9DT);

    try {
        rdbtnSR800 = new JRadioButton(
                new ImageIcon(ImageIO.read(FrmMain.class.getResourceAsStream("/atlas/sr800.png"))));
        rdbtnSR800.setDisabledIcon(
                new ImageIcon(ImageIO.read(FrmMain.class.getResourceAsStream("/atlas/sr800_dis.png"))));
        rdbtnSR800.setEnabled(false);
        rdbtnSR800.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                rdbtnClick("SR800");
                UpdateMachine();
                listMachines.repaint();
            }
        });
        rdbtnSR800.setPressedIcon(
                new ImageIcon(ImageIO.read(FrmMain.class.getResourceAsStream("/atlas/sr800_down.png"))));
        rdbtnSR800.setRolloverEnabled(true);
        rdbtnSR800.setRolloverIcon(
                new ImageIcon(ImageIO.read(FrmMain.class.getResourceAsStream("/atlas/sr800_over.png"))));
        rdbtnSR800.setSelectedIcon(
                new ImageIcon(ImageIO.read(FrmMain.class.getResourceAsStream("/atlas/sr800_select.png"))));
    } catch (IOException e2) {
        e2.printStackTrace();
    }
    rdbtnSR800.setToolTipText("Titan SR800");
    rdbtnSR800.setRolloverEnabled(true);
    rdbtnSR800.setBounds(13, 156, 155, 40);
    grpMachines.add(rdbtnSR800);

    try {
        rdbtnCustom = new JRadioButton(
                new ImageIcon(ImageIO.read(FrmMain.class.getResourceAsStream("/atlas/custom.png"))));
        rdbtnCustom.setDisabledIcon(
                new ImageIcon(ImageIO.read(FrmMain.class.getResourceAsStream("/atlas/custom_dis.png"))));
        rdbtnCustom.setEnabled(false);
        rdbtnCustom.setPressedIcon(
                new ImageIcon(ImageIO.read(FrmMain.class.getResourceAsStream("/atlas/custom_down.png"))));
        rdbtnCustom.setRolloverEnabled(true);
        rdbtnCustom.setRolloverIcon(
                new ImageIcon(ImageIO.read(FrmMain.class.getResourceAsStream("/atlas/custom_over.png"))));
        rdbtnCustom.setSelectedIcon(
                new ImageIcon(ImageIO.read(FrmMain.class.getResourceAsStream("/atlas/custom_select.png"))));
    } catch (IOException e2) {
        e2.printStackTrace();
    }
    rdbtnCustom.setToolTipText("Custom Machine");
    rdbtnCustom.setRolloverEnabled(true);
    rdbtnCustom.setBounds(13, 200, 155, 40);
    grpMachines.add(rdbtnCustom);
    rdbtnCustom.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            rdbtnClick("Custom");
            UpdateMachine();
            ResetStatusLabel();
            listMachines.repaint();
        }
    });

    rdbtnsMachines.add(rdbtnER610);
    rdbtnsMachines.add(rdbtnSR9DS);
    rdbtnsMachines.add(rdbtnSR9DT);
    rdbtnsMachines.add(rdbtnSR800);
    rdbtnsMachines.add(rdbtnCustom);

    grpVariants = new JPanel();
    grpVariants.setFont(new Font("Tahoma", Font.PLAIN, 11));
    grpVariants.setBounds(20, 339, 482, 112);
    grpVariants
            .setBorder(new TitledBorder(null, "Variants", TitledBorder.LEADING, TitledBorder.TOP, null, null));
    pnlMachine.add(grpVariants);
    grpVariants.setLayout(null);

    cmbCorepos = new JComboBox();
    cmbCorepos.setFont(new Font("Tahoma", Font.PLAIN, 11));
    cmbCorepos.setToolTipText("Set the core positioning system");
    cmbCorepos.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            if (formReady)
                UpdateMachine();
        }
    });
    cmbCorepos.setEnabled(false);
    cmbCorepos.setBounds(104, 70, 122, 20);
    grpVariants.add(cmbCorepos);
    cmbCorepos.setModel(new DefaultComboBoxModel(new String[] { "Manual", "Laser" }));

    lblCorePositioning = new JLabel("Core Positioning:");
    lblCorePositioning.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblCorePositioning.setToolTipText("Set the core positioning system");
    lblCorePositioning.setEnabled(false);
    lblCorePositioning.setHorizontalAlignment(SwingConstants.RIGHT);
    lblCorePositioning.setBounds(12, 73, 88, 14);
    grpVariants.add(lblCorePositioning);

    lblKnifeControl = new JLabel("Knife Control:");
    lblKnifeControl.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblKnifeControl.setToolTipText("Set the type of knife positioning system");
    lblKnifeControl.setEnabled(false);
    lblKnifeControl.setHorizontalAlignment(SwingConstants.RIGHT);
    lblKnifeControl.setBounds(22, 48, 78, 14);
    grpVariants.add(lblKnifeControl);

    cmbKnives = new JComboBox();
    cmbKnives.setFont(new Font("Tahoma", Font.PLAIN, 11));
    cmbKnives.setToolTipText("Set the type of knife positioning system");
    cmbKnives.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            if (formReady)
                UpdateMachine();
        }
    });
    cmbKnives.setEnabled(false);
    cmbKnives.setBounds(104, 45, 122, 20);
    grpVariants.add(cmbKnives);
    cmbKnives.setModel(new DefaultComboBoxModel(new String[] { "Manual", "Auto" }));

    cmbUnloader = new JComboBox();
    cmbUnloader.setFont(new Font("Tahoma", Font.PLAIN, 11));
    cmbUnloader.setToolTipText("Set the unloader type");
    cmbUnloader.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            if (formReady)
                UpdateMachine();
        }
    });
    cmbUnloader.setEnabled(false);
    cmbUnloader.setBounds(350, 20, 122, 20);
    grpVariants.add(cmbUnloader);
    cmbUnloader.setModel(new DefaultComboBoxModel(new String[] { "Manual", "Pneumatic", "Electric" }));

    lblUnloader = new JLabel("Unloader:");
    lblUnloader.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblUnloader.setToolTipText("Set the unloader type");
    lblUnloader.setEnabled(false);
    lblUnloader.setHorizontalAlignment(SwingConstants.RIGHT);
    lblUnloader.setBounds(259, 23, 87, 14);
    grpVariants.add(lblUnloader);

    cmbSpeed = new JComboBox();
    cmbSpeed.setFont(new Font("Tahoma", Font.PLAIN, 11));
    cmbSpeed.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            if (formReady)
                UpdateMachine();
        }
    });
    cmbSpeed.setEnabled(false);
    cmbSpeed.setToolTipText("Machine top speed in metres/min");
    cmbSpeed.setBounds(104, 20, 122, 20);
    grpVariants.add(cmbSpeed);
    cmbSpeed.setModel(new DefaultComboBoxModel(new String[] { "450", "550" }));

    lblSpeed = new JLabel("Speed:");
    lblSpeed.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblSpeed.setToolTipText("Machine top speed in metres/min");
    lblSpeed.setEnabled(false);
    lblSpeed.setHorizontalAlignment(SwingConstants.RIGHT);
    lblSpeed.setBounds(54, 23, 46, 14);
    grpVariants.add(lblSpeed);

    cmbUnwindDrive = new JComboBox();
    cmbUnwindDrive.setFont(new Font("Tahoma", Font.PLAIN, 11));
    cmbUnwindDrive.setToolTipText("Unwind drive type");
    cmbUnwindDrive.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            if (formReady)
                UpdateMachine();
        }
    });
    cmbUnwindDrive.setEnabled(false);
    cmbUnwindDrive.setBounds(350, 45, 122, 20);
    grpVariants.add(cmbUnwindDrive);
    cmbUnwindDrive.setModel(new DefaultComboBoxModel(new String[] { "Single", "Double" }));

    lblUnwindDrive = new JLabel("Unwind Drive:");
    lblUnwindDrive.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblUnwindDrive.setToolTipText("Unwind drive type");
    lblUnwindDrive.setEnabled(false);
    lblUnwindDrive.setHorizontalAlignment(SwingConstants.RIGHT);
    lblUnwindDrive.setBounds(259, 48, 87, 14);
    grpVariants.add(lblUnwindDrive);

    lblRewindControlLoop = new JLabel("Rewind Control Loop:");
    lblRewindControlLoop.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblRewindControlLoop.setToolTipText("Rewind control loop type");
    lblRewindControlLoop.setEnabled(false);
    lblRewindControlLoop.setHorizontalAlignment(SwingConstants.RIGHT);
    lblRewindControlLoop.setBounds(224, 73, 122, 14);
    grpVariants.add(lblRewindControlLoop);

    cmbRewindCtrl = new JComboBox();
    cmbRewindCtrl.setFont(new Font("Tahoma", Font.PLAIN, 11));
    cmbRewindCtrl.setToolTipText("Rewind control loop type");
    cmbRewindCtrl.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            if (formReady)
                UpdateMachine();
        }
    });
    cmbRewindCtrl.setEnabled(false);
    cmbRewindCtrl.setBounds(350, 70, 122, 20);
    grpVariants.add(cmbRewindCtrl);
    cmbRewindCtrl.setModel(new DefaultComboBoxModel(new String[] { "Open", "Closed" }));

    listModel = new DefaultListModel();
    jobModel = new DefaultListModel();
    scheduleModel = new DefaultListModel();
    listModel.removeAllElements();
    /*listMachines.setModel(new AbstractListModel() {
       String[] values = new String[] {"ER610: My test 1", "SR9-DS: this is another test", "SR9-DT: third test", "ER610:  test 2", "ER610: bla bla", "SR9-DS: this is another test", "SR9-DT: hello", "SR9-DT: third test"};
       public int getSize() {
    return values.length;
       }
       public Object getElementAt(int index) {
    return values[index];
       }
    });*/

    JLabel lblMachines = new JLabel("Machines");
    lblMachines.setFont(new Font("Tahoma", Font.BOLD, 12));
    lblMachines.setBounds(522, 19, 85, 14);
    pnlMachine.add(lblMachines);

    btnMachDelete = new JButton("");
    try {
        btnMachDelete
                .setIcon(new ImageIcon(ImageIO.read(FrmMain.class.getResourceAsStream("/atlas/delete.png"))));
        btnMachDelete.setRolloverEnabled(true);
        btnMachDelete.setRolloverIcon(
                new ImageIcon(ImageIO.read(FrmMain.class.getResourceAsStream("/atlas/delete_over.png"))));
        btnMachDelete.setDisabledIcon(
                new ImageIcon(ImageIO.read(FrmMain.class.getResourceAsStream("/atlas/delete_dis.png"))));
    } catch (NullPointerException e11) {
        System.out.println("Image load error");
    } catch (IOException e1) {
        e1.printStackTrace();
    }
    btnMachDelete.setToolTipText("Delete machine");
    btnMachDelete.setEnabled(false);
    btnMachDelete.addActionListener(new DeleteButtonListener());
    btnMachDelete.setBounds(651, 460, 36, 36);
    pnlMachine.add(btnMachDelete);

    btnMachUp = new JButton("");
    btnMachUp.setToolTipText("Move machine up");
    btnMachUp.setEnabled(false);
    try {
        btnMachUp.setIcon(new ImageIcon(ImageIO.read(FrmMain.class.getResourceAsStream("/atlas/up.png"))));
        btnMachUp.setRolloverEnabled(true);
        btnMachUp.setRolloverIcon(
                new ImageIcon(ImageIO.read(FrmMain.class.getResourceAsStream("/atlas/up_over.png"))));
        btnMachUp.setDisabledIcon(
                new ImageIcon(ImageIO.read(FrmMain.class.getResourceAsStream("/atlas/up_dis.png"))));
    } catch (NullPointerException e11) {
        System.out.println("Image load error");
    } catch (IOException e1) {
        e1.printStackTrace();
    }
    btnMachUp.addActionListener(new UpListener());
    btnMachUp.setBounds(700, 463, 30, 30);
    pnlMachine.add(btnMachUp);

    btnMachDown = new JButton("");
    btnMachDown.setToolTipText("Move machine down");
    btnMachDown.setEnabled(false);
    try {
        btnMachDown.setIcon(new ImageIcon(ImageIO.read(FrmMain.class.getResourceAsStream("/atlas/down.png"))));
        btnMachDown.setRolloverEnabled(true);
        btnMachDown.setRolloverIcon(
                new ImageIcon(ImageIO.read(FrmMain.class.getResourceAsStream("/atlas/down_over.png"))));
        btnMachDown.setDisabledIcon(
                new ImageIcon(ImageIO.read(FrmMain.class.getResourceAsStream("/atlas/down_dis.png"))));
    } catch (NullPointerException e11) {
        System.out.println("Image load error");
    } catch (IOException e1) {
        e1.printStackTrace();
    }
    btnMachDown.addActionListener(new DownListener());
    btnMachDown.setBounds(737, 463, 30, 30);
    pnlMachine.add(btnMachDown);

    btnMachReset = new JButton("Reset");
    btnMachReset.setFont(new Font("Tahoma", Font.PLAIN, 11));
    btnMachReset.setEnabled(false);
    btnMachReset.setToolTipText("Reset the form");
    btnMachReset.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            ResetForm();
        }
    });

    btnMachReset.setBounds(20, 460, 100, 36);
    pnlMachine.add(btnMachReset);
    /*txtMachName.addKeyListener(new KeyAdapter() {
       @Override
       public void keyPressed(KeyEvent e) {
    int key = e.getKeyCode();  
    if (e.getKeyCode() == KeyEvent.VK_ENTER)  
       btnAddMachine.doClick();
       }
    });*/

    btnNewMachine = new JButton("Add New");
    btnNewMachine.setFont(new Font("Tahoma", Font.BOLD, 11));
    btnNewMachine.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            formReady = false;

            ResetStatusLabel();

            int index = listMachines.getSelectedIndex();
            int size = listModel.getSize();

            if (size >= Consts.MACH_LIST_LIMIT) { // Max list size
                ShowMessage(
                        "Maximum number of machines allocated. Please delete before attempting to add more.");
                return;
            }

            String newName = getUniqueName("Machine");
            txtMachName.setText(newName);
            machine = new Machine(newName);
            machNames.add(newName.toLowerCase());

            //If no selection or if item in last position is selected,
            //add the new one to end of list, and select new one.
            if (index == -1 || (index + 1 == size)) {

                listModel.addElement(machine);
                listMachines.setSelectedIndex(size);

                RoiData.energies.add(RoiData.new EnergyData());
                RoiData.maintenance.add(RoiData.new MaintData());
                listCompare.addSelectionInterval(size, size);

                //Otherwise insert the new one after the current selection,
                //and select new one.
            } else {
                int[] sel = listCompare.getSelectedIndices();
                int[] selection = new int[sel.length + 1];
                System.arraycopy(sel, 0, selection, 0, sel.length);
                listCompare.setSelectedIndices(new int[] {});
                listModel.insertElementAt(machine, index + 1);

                boolean max = false;
                for (int i = 0; i < selection.length; i++) {
                    if (selection[i] >= index + 1 && !max) {
                        if (i < selection.length - 1)
                            System.arraycopy(selection, i, selection, i + 1, selection.length - i - 1);
                        selection[i] = index + 1;
                        max = true;
                    } else if (selection[i] >= index + 1)
                        selection[i] = selection[i] + 1;
                }
                RoiData.energies.add(index + 1, RoiData.new EnergyData());
                RoiData.maintenance.add(index + 1, RoiData.new MaintData());
                listCompare.setSelectedIndices(selection);
                //listCompareRoi.setSelectedIndices(selection);
                listMachines.setSelectedIndex(index + 1);
                //listCompare.addSelectionInterval(index + 1, index + 1);
            }

            ResetStatusLabel();
            //UpdateForm();  already triggered in listchanged
            formReady = true;
            txtMachName.requestFocusInWindow();
        }
    });
    try {
        btnNewMachine
                .setIcon(new ImageIcon(ImageIO.read(FrmMain.class.getResourceAsStream("/atlas/plus.png"))));
    } catch (IOException e1) {
        e1.printStackTrace();
    }
    btnNewMachine.setToolTipText("Add new machine");
    btnNewMachine.setBounds(522, 460, 110, 36);
    pnlMachine.add(btnNewMachine);

    grpOptions = new JPanel();
    grpOptions.setFont(new Font("Tahoma", Font.PLAIN, 11));
    grpOptions.setBounds(212, 72, 290, 256);
    pnlMachine.add(grpOptions);
    grpOptions.setBorder(new TitledBorder(UIManager.getBorder("TitledBorder.border"), "Options",
            TitledBorder.LEADING, TitledBorder.TOP, null, null));
    grpOptions.setLayout(null);

    chckbxFlag = new JCheckBox("Flag Detection");
    chckbxFlag.setFont(new Font("Tahoma", Font.PLAIN, 11));
    chckbxFlag.setToolTipText("Whether an automatic flag detection system is used");
    chckbxFlag.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            if (formReady)
                UpdateMachine();
            if (!chckbxFlag.isSelected())
                chckbxSelectAll.setSelected(false);
            else
                UpdateSelectAllChckbx();
        }
    });
    chckbxFlag.setEnabled(false);
    chckbxFlag.setBounds(155, 104, 109, 23);
    grpOptions.add(chckbxFlag);

    chckbxSpliceTable = new JCheckBox("Splice Table");
    chckbxSpliceTable.setFont(new Font("Tahoma", Font.PLAIN, 11));
    chckbxSpliceTable.setToolTipText("Whether a splice table is fitted");
    chckbxSpliceTable.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            if (formReady)
                UpdateMachine();
            if (!chckbxSpliceTable.isSelected())
                chckbxSelectAll.setSelected(false);
            else
                UpdateSelectAllChckbx();
        }
    });
    chckbxSpliceTable.setEnabled(false);
    chckbxSpliceTable.setBounds(22, 104, 109, 23);
    grpOptions.add(chckbxSpliceTable);

    chckbxAlignmentGuide = new JCheckBox("Alignment Guide");
    chckbxAlignmentGuide.setFont(new Font("Tahoma", Font.PLAIN, 11));
    chckbxAlignmentGuide.setToolTipText("Whether an alignment guide is fitted");
    chckbxAlignmentGuide.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            if (formReady)
                UpdateMachine();
            if (!chckbxAlignmentGuide.isSelected())
                chckbxSelectAll.setSelected(false);
            else
                UpdateSelectAllChckbx();
        }
    });
    chckbxAlignmentGuide.setEnabled(false);
    chckbxAlignmentGuide.setBounds(22, 130, 127, 23);
    grpOptions.add(chckbxAlignmentGuide);

    chckbxRollConditioning = new JCheckBox("Roll Conditioning");
    chckbxRollConditioning.setFont(new Font("Tahoma", Font.PLAIN, 11));
    chckbxRollConditioning.setToolTipText("Whether the machine supports roll conditioning");
    chckbxRollConditioning.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            if (formReady)
                UpdateMachine();
            if (!chckbxRollConditioning.isSelected())
                chckbxSelectAll.setSelected(false);
            else
                UpdateSelectAllChckbx();
        }
    });
    chckbxRollConditioning.setEnabled(false);
    chckbxRollConditioning.setBounds(22, 156, 127, 23);
    grpOptions.add(chckbxRollConditioning);

    chckbxTurretSupport = new JCheckBox("Turret Support");
    chckbxTurretSupport.setFont(new Font("Tahoma", Font.PLAIN, 11));
    chckbxTurretSupport.setToolTipText("For dual turret machines: extra turret support");
    chckbxTurretSupport.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            if (formReady)
                UpdateMachine();
            if (!chckbxTurretSupport.isSelected())
                chckbxSelectAll.setSelected(false);
            else
                UpdateSelectAllChckbx();
        }
    });
    chckbxTurretSupport.setEnabled(false);
    chckbxTurretSupport.setBounds(22, 182, 127, 23);
    grpOptions.add(chckbxTurretSupport);

    chckbxAutostripping = new JCheckBox("Autostripping");
    chckbxAutostripping.setFont(new Font("Tahoma", Font.PLAIN, 11));
    chckbxAutostripping.setToolTipText("Whether an autostripping feature is present for reel unloading");
    chckbxAutostripping.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            if (formReady)
                UpdateMachine();
            if (!chckbxAutostripping.isSelected())
                chckbxSelectAll.setSelected(false);
            else
                UpdateSelectAllChckbx();
        }
    });
    chckbxAutostripping.setEnabled(false);
    chckbxAutostripping.setBounds(22, 208, 97, 23);
    grpOptions.add(chckbxAutostripping);

    chckbxExtraRewind = new JCheckBox("850mm Rewind");
    chckbxExtraRewind.setFont(new Font("Tahoma", Font.PLAIN, 11));
    chckbxExtraRewind.setToolTipText("Extra wide 850mm max diameter rewind support");
    chckbxExtraRewind.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            if (formReady)
                UpdateMachine();
            if (!chckbxExtraRewind.isSelected())
                chckbxSelectAll.setSelected(false);
            else
                UpdateSelectAllChckbx();
        }
    });
    chckbxExtraRewind.setEnabled(false);
    chckbxExtraRewind.setBounds(155, 208, 109, 23);
    grpOptions.add(chckbxExtraRewind);

    chckbxAutoCutoff = new JCheckBox("Auto Cut-off");
    chckbxAutoCutoff.setFont(new Font("Tahoma", Font.PLAIN, 11));
    chckbxAutoCutoff.setToolTipText("Whether the web is cut automatically when a run completes");
    chckbxAutoCutoff.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            if (formReady)
                UpdateMachine();
            if (!chckbxAutoCutoff.isSelected())
                chckbxSelectAll.setSelected(false);
            else
                UpdateSelectAllChckbx();
        }
    });
    chckbxAutoCutoff.setEnabled(false);
    chckbxAutoCutoff.setBounds(155, 130, 109, 23);
    grpOptions.add(chckbxAutoCutoff);

    chckbxAutoTapeCore = new JCheckBox("Auto Tape Core");
    chckbxAutoTapeCore.setFont(new Font("Tahoma", Font.PLAIN, 11));
    chckbxAutoTapeCore.setToolTipText("Whether new reels are automatically taped before a run begins");
    chckbxAutoTapeCore.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            if (formReady)
                UpdateMachine();
            if (!chckbxAutoTapeCore.isSelected())
                chckbxSelectAll.setSelected(false);
            else
                UpdateSelectAllChckbx();
        }
    });
    chckbxAutoTapeCore.setEnabled(false);
    chckbxAutoTapeCore.setBounds(155, 156, 109, 23);
    grpOptions.add(chckbxAutoTapeCore);

    chckbxAutoTapeTail = new JCheckBox("Auto Tape Tail");
    chckbxAutoTapeTail.setFont(new Font("Tahoma", Font.PLAIN, 11));
    chckbxAutoTapeTail.setToolTipText("Whether the tails of completed reels are automatically taped down");
    chckbxAutoTapeTail.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            if (formReady)
                UpdateMachine();
            if (!chckbxAutoTapeTail.isSelected())
                chckbxSelectAll.setSelected(false);
            else
                UpdateSelectAllChckbx();
        }
    });
    chckbxAutoTapeTail.setEnabled(false);
    chckbxAutoTapeTail.setBounds(155, 182, 109, 23);
    grpOptions.add(chckbxAutoTapeTail);

    txtMachName = new JTextField();
    txtMachName.addFocusListener(new FocusAdapter() {
        @Override
        public void focusGained(FocusEvent e) {
            txtMachName.selectAll();
        }
    });
    txtMachName.getDocument().addDocumentListener(new DocumentListener() {
        @Override
        public void changedUpdate(DocumentEvent arg0) {
        }

        @Override
        public void insertUpdate(DocumentEvent arg0) {
            UpdateMachineName();
        }

        @Override
        public void removeUpdate(DocumentEvent arg0) {
            UpdateMachineName();
        }
    });
    txtMachName.setEnabled(false);
    txtMachName.setBounds(125, 35, 137, 28);
    grpOptions.add(txtMachName);
    txtMachName.getDocument().addDocumentListener(new DocumentListener() {
        public void changedUpdate(DocumentEvent e) {
        }

        public void removeUpdate(DocumentEvent e) {
            // text was deleted
        }

        public void insertUpdate(DocumentEvent e) {
            // text was inserted
        }
    });

    txtMachName.setToolTipText("Enter a name to refer to this particular machine by");
    txtMachName.setFont(new Font("Tahoma", Font.BOLD, 12));
    txtMachName.setColumns(10);

    lblMachName = new JLabel("Machine name:");
    lblMachName.setToolTipText("Enter a name to refer to this particular machine by");
    lblMachName.setEnabled(false);
    lblMachName.setBounds(26, 36, 91, 24);
    grpOptions.add(lblMachName);
    lblMachName.setFont(new Font("Tahoma", Font.PLAIN, 13));

    chckbxSelectAll = new JCheckBox("Select All");
    chckbxSelectAll.setFont(new Font("Tahoma", Font.PLAIN, 11));
    chckbxSelectAll.setToolTipText("Select all available options");
    chckbxSelectAll.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            if (chckbxSelectAll.isSelected()) {
                if (chckbxAlignmentGuide.isEnabled())
                    chckbxAlignmentGuide.setSelected(true);
                if (chckbxAutoCutoff.isEnabled())
                    chckbxAutoCutoff.setSelected(true);
                if (chckbxAutostripping.isEnabled())
                    chckbxAutostripping.setSelected(true);
                if (chckbxAutoTapeCore.isEnabled())
                    chckbxAutoTapeCore.setSelected(true);
                if (chckbxAutoTapeTail.isEnabled())
                    chckbxAutoTapeTail.setSelected(true);
                if (chckbxExtraRewind.isEnabled())
                    chckbxExtraRewind.setSelected(true);
                if (chckbxFlag.isEnabled())
                    chckbxFlag.setSelected(true);
                if (chckbxRollConditioning.isEnabled())
                    chckbxRollConditioning.setSelected(true);
                if (chckbxSpliceTable.isEnabled())
                    chckbxSpliceTable.setSelected(true);
                if (chckbxTurretSupport.isEnabled())
                    chckbxTurretSupport.setSelected(true);
            } else {
                chckbxAlignmentGuide.setSelected(false);
                chckbxAutoCutoff.setSelected(false);
                chckbxAutostripping.setSelected(false);
                chckbxAutoTapeCore.setSelected(false);
                chckbxAutoTapeTail.setSelected(false);
                chckbxExtraRewind.setSelected(false);
                chckbxFlag.setSelected(false);
                chckbxRollConditioning.setSelected(false);
                chckbxSpliceTable.setSelected(false);
                chckbxTurretSupport.setSelected(false);
            }

            if (formReady)
                UpdateMachine();
        }
    });
    chckbxSelectAll.setEnabled(false);
    chckbxSelectAll.setBounds(22, 78, 97, 23);
    grpOptions.add(chckbxSelectAll);

    lblMachineConfiguration = new JLabel("Machine Configuration");
    lblMachineConfiguration.setFont(new Font("Tahoma", Font.BOLD, 18));
    lblMachineConfiguration.setBounds(29, 18, 269, 22);
    pnlMachine.add(lblMachineConfiguration);

    lblAddNewMachines = new JLabel(
            "Add new machines to the list on the right, then configure their options and variants below");
    lblAddNewMachines.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblAddNewMachines.setBounds(29, 45, 433, 14);
    pnlMachine.add(lblAddNewMachines);

    btnCustomMachine = new JButton("Custom Machine Options");
    btnCustomMachine.setEnabled(false);
    btnCustomMachine.setFont(new Font("Tahoma", Font.PLAIN, 11));
    btnCustomMachine.setBounds(322, 460, 180, 36);
    pnlMachine.add(btnCustomMachine);
    btnCustomMachine.setToolTipText("Edit settings for a custom machine type");

    scrollPane = new JScrollPane();
    scrollPane.setBorder(null);
    scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
    scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
    scrollPane.setBounds(522, 44, 245, 405);
    pnlMachine.add(scrollPane);

    panel_6 = new JPanel();
    panel_6.setBorder(new SoftBevelBorder(BevelBorder.LOWERED, new Color(192, 192, 192), null, null, null));
    panel_6.setBackground(Color.WHITE);
    panel_6.setToolTipText("Select a machine to edit options, re-order, or delete");
    scrollPane.setViewportView(panel_6);
    panel_6.setLayout(new BorderLayout(0, 0));

    //Create the list and put it in a scroll pane.
    listMachines = new JList(listModel);
    panel_6.add(listMachines, BorderLayout.NORTH);
    listMachines.addListSelectionListener(new MachineListSelectionListener());
    listMachines.setCellRenderer(new MachineListRenderer());

    listMachines.setBorder(null);
    listMachines.setToolTipText("Select a machine to edit options, re-order, or delete");
    listMachines.setFont(new Font("Tahoma", Font.PLAIN, 13));
    listMachines.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

    btnOverrideDefaultAcceleration = new JButton("Override Default Acceleration");
    btnOverrideDefaultAcceleration.setFont(new Font("Tahoma", Font.PLAIN, 11));
    btnOverrideDefaultAcceleration
            .setToolTipText("Set new values for the acceleration/deceleration of this machine");
    btnOverrideDefaultAcceleration.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            try { // check list selected
                listMachines.getSelectedIndex();
            } catch (Exception e2) {
                return;
            }
            Machine currMachine = (Machine) listMachines.getSelectedValue();
            AccelDecel dialog = new AccelDecel(currMachine);
            dialog.setLocationRelativeTo(frmTitanRoiCalculator);
            dialog.setVisible(true);
        }
    });
    btnOverrideDefaultAcceleration.setEnabled(false);
    btnOverrideDefaultAcceleration.setBounds(130, 460, 182, 36);
    pnlMachine.add(btnOverrideDefaultAcceleration);

    btnCustomMachine.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            ResetStatusLabel();
            //rdbtnOther.doClick();
            MachineBuilder newmach = new MachineBuilder(machine);
            newmach.setLocationRelativeTo(frmTitanRoiCalculator);
            newmach.setVisible(true);
        }
    });

    pnlJob = new JPanel();
    tabbedPane.addTab("Job Selection", null, pnlJob, "Add and configure machine jobs");
    tabbedPane.setEnabledAt(1, true);
    pnlJob.setLayout(null);

    JPanel pnlMaterials = new JPanel();
    pnlMaterials.setBounds(280, 72, 227, 124);
    pnlMaterials.setBorder(new TitledBorder(UIManager.getBorder("TitledBorder.border"), "Material Settings",
            TitledBorder.LEADING, TitledBorder.TOP, null, null));
    pnlJob.add(pnlMaterials);
    pnlMaterials.setLayout(null);

    Material[] materials = { new Material("Custom", 1.0, 20), new Material("Aluminium", 2.7, 40),
            new Material("Board", 1.3, 80), new Material("Cellophane", 1.5, 20),
            new Material("HDPE/BOPE", 0.94, 20), new Material("Laminate", 1.0, 20),
            new Material("LDPE/BOPE", 0.91, 20), new Material("LLDPE", 0.9, 20),
            new Material("MDPE", 0.925, 20), new Material("Nylon", 1.12, 20),
            new Material("Polypropylene", 0.91, 20), new Material("Polystyrene", 1.04, 20),
            new Material("Paper", 0.8, 100), new Material("PEEK", 1.3, 20), new Material("Polyester", 1.4, 20),
            new Material("PLA", 1.24, 20), new Material("Polyolefin", 0.92, 20),
            new Material("PSA Label", 1.1, 20), new Material("PVC", 1.36, 20),
            new Material("Shrink label", 0.91, 20), new Material("Tri. Lam.", 1.1, 20) };

    cmbMaterials = new JComboBox(materials);
    cmbMaterials.setMaximumRowCount(20);
    cmbMaterials.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            if (jobFormReady) {
                Material m = (Material) cmbMaterials.getSelectedItem();
                if (!(m.name.equals("Custom"))) {
                    jobFormReady = false;
                    txtThickness.setText(Double.toString(roundTwoDecimals(m.getThickness())));
                    if (lblGsm.getText().equals("(gsm)"))
                        txtDensity.setText(Double.toString(roundTwoDecimals(m.getDensity())));
                    else
                        txtDensity
                                .setText(Double.toString(roundTwoDecimals(m.getDensity() * m.getThickness())));
                    if (!metric) {
                        txtThickness
                                .setText(Double.toString(roundTwoDecimals(Core.MicroToMil(m.getThickness()))));
                    }
                    jobFormReady = true;
                }
                UpdateJob();
            }
        }
    });
    cmbMaterials.setEnabled(false);
    cmbMaterials.setSelectedIndex(0);
    cmbMaterials.setToolTipText("Choose a preset material");
    cmbMaterials.setBounds(81, 26, 117, 22);
    pnlMaterials.add(cmbMaterials);

    lblPresets = new JLabel("Presets:");
    lblPresets.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblPresets.setToolTipText("Choose a preset material");
    lblPresets.setEnabled(false);
    lblPresets.setBounds(37, 29, 40, 15);
    pnlMaterials.add(lblPresets);

    lblThickness_1 = new JLabel("Thickness:");
    lblThickness_1.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblThickness_1.setToolTipText("Material thickness");
    lblThickness_1.setEnabled(false);
    lblThickness_1.setHorizontalAlignment(SwingConstants.RIGHT);
    lblThickness_1.setBounds(7, 61, 70, 14);
    pnlMaterials.add(lblThickness_1);

    lblDensity_1 = new JLabel("Density:");
    lblDensity_1.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblDensity_1.setToolTipText("Material density (per volume, not area)");
    lblDensity_1.setEnabled(false);
    lblDensity_1.setHorizontalAlignment(SwingConstants.RIGHT);
    lblDensity_1.setBounds(31, 86, 46, 14);
    pnlMaterials.add(lblDensity_1);

    txtThickness = new JTextField();
    txtThickness.addFocusListener(new FocusAdapter() {
        @Override
        public void focusGained(FocusEvent e) {
            txtThickness.selectAll();
        }
    });
    txtThickness.setEnabled(false);
    txtThickness.getDocument().addDocumentListener(new JobInputChangeListener());

    txtThickness.setToolTipText("Material thickness");
    txtThickness.setText("20");
    txtThickness.setBounds(81, 58, 86, 20);
    pnlMaterials.add(txtThickness);
    txtThickness.setColumns(10);

    txtDensity = new JTextField();
    txtDensity.addFocusListener(new FocusAdapter() {
        @Override
        public void focusGained(FocusEvent e) {
            txtDensity.selectAll();
        }
    });
    txtDensity.setEnabled(false);
    txtDensity.getDocument().addDocumentListener(new JobInputChangeListener());

    txtDensity.setToolTipText("Material density (per volume, not area)");
    txtDensity.setText("0.92");
    txtDensity.setBounds(81, 83, 86, 20);
    pnlMaterials.add(txtDensity);
    txtDensity.setColumns(10);

    lblmicro0 = new JLabel("(\u00B5m)");
    lblmicro0.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblmicro0.setEnabled(false);
    lblmicro0.setBounds(177, 61, 46, 14);
    pnlMaterials.add(lblmicro0);

    lblgm3 = new JLabel("(g/cm  )");
    lblgm3.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblgm3.setEnabled(false);
    lblgm3.setBounds(177, 86, 46, 14);
    pnlMaterials.add(lblgm3);

    label_3 = new JLabel("3");
    label_3.setEnabled(false);
    label_3.setFont(new Font("Tahoma", Font.PLAIN, 8));
    label_3.setBounds(204, 83, 14, 14);
    pnlMaterials.add(label_3);

    JPanel pnlJobs = new JPanel();
    pnlJobs.setBounds(20, 168, 250, 283);
    pnlJobs.setBorder(new TitledBorder(UIManager.getBorder("TitledBorder.border"), "Rewind Settings",
            TitledBorder.LEADING, TitledBorder.TOP, null, new Color(0, 0, 0)));
    pnlJob.add(pnlJobs);
    pnlJobs.setLayout(null);

    lblTargetRewindLength = new JLabel("Rewind Output:");
    lblTargetRewindLength.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblTargetRewindLength.setToolTipText("Quantity of rewind output");
    lblTargetRewindLength.setEnabled(false);
    lblTargetRewindLength.setHorizontalAlignment(SwingConstants.RIGHT);
    lblTargetRewindLength.setBounds(17, 197, 88, 14);
    pnlJobs.add(lblTargetRewindLength);

    lblSlitWidth = new JLabel("Slit Width:");
    lblSlitWidth.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblSlitWidth.setToolTipText("Width of each output reel");
    lblSlitWidth.setEnabled(false);
    lblSlitWidth.setHorizontalAlignment(SwingConstants.RIGHT);
    lblSlitWidth.setBounds(46, 60, 59, 14);
    pnlJobs.add(lblSlitWidth);

    lblSlitCount = new JLabel("Reel Count:");
    lblSlitCount.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblSlitCount.setToolTipText("Number of reels per set at the output");
    lblSlitCount.setEnabled(false);
    lblSlitCount.setHorizontalAlignment(SwingConstants.RIGHT);
    lblSlitCount.setBounds(46, 33, 59, 14);
    pnlJobs.add(lblSlitCount);

    lblTrimtotal = new JLabel("Trim (total):");
    lblTrimtotal.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblTrimtotal.setToolTipText("The trim resulting from the given slit widths");
    lblTrimtotal.setEnabled(false);
    lblTrimtotal.setHorizontalAlignment(SwingConstants.RIGHT);
    lblTrimtotal.setBounds(20, 114, 85, 14);
    pnlJobs.add(lblTrimtotal);

    txtSlits = new JTextField();
    txtSlits.setToolTipText("Number of reels per set at the output");
    txtSlits.addFocusListener(new FocusAdapter() {
        @Override
        public void focusGained(FocusEvent e) {
            txtSlits.selectAll();
        }
    });
    txtSlits.getDocument().addDocumentListener(new JobInputChangeListener());
    txtSlits.setEnabled(false);

    txtSlits.setText("1");
    txtSlits.setBounds(109, 30, 86, 20);
    pnlJobs.add(txtSlits);
    txtSlits.setColumns(10);

    txtSlitWidth = new JTextField();
    txtSlitWidth.setToolTipText("Width of each output reel");
    txtSlitWidth.addFocusListener(new FocusAdapter() {
        @Override
        public void focusGained(FocusEvent e) {
            txtSlitWidth.selectAll();
        }
    });
    txtSlitWidth.getDocument().addDocumentListener(new JobInputChangeListener());
    txtSlitWidth.setEnabled(false);

    txtSlitWidth.setText("1350");
    txtSlitWidth.setBounds(109, 58, 86, 20);
    pnlJobs.add(txtSlitWidth);
    txtSlitWidth.setColumns(10);

    txtRewindAmount = new JTextField();
    txtRewindAmount.setToolTipText("Quantity of rewind output");
    txtRewindAmount.addFocusListener(new FocusAdapter() {
        @Override
        public void focusGained(FocusEvent e) {
            txtRewindAmount.selectAll();
        }
    });
    txtRewindAmount.getDocument().addDocumentListener(new JobInputChangeListener());
    txtRewindAmount.setEnabled(false);
    txtRewindAmount.setName("RewindLength");

    txtRewindAmount.setText("1000");
    txtRewindAmount.setBounds(109, 194, 86, 20);
    pnlJobs.add(txtRewindAmount);
    txtRewindAmount.setColumns(10);

    lblTrim = new JLabel("0 mm");
    lblTrim.setToolTipText("The trim resulting from the given slit widths");
    lblTrim.setEnabled(false);
    lblTrim.setBounds(111, 114, 65, 14);
    pnlJobs.add(lblTrim);

    cmbRewindCore = new JComboBox();
    cmbRewindCore.setToolTipText("Core diameter of rewind reels");
    ((JTextField) cmbRewindCore.getEditor().getEditorComponent()).getDocument()
            .addDocumentListener(new DocumentListener() {
                @Override
                public void removeUpdate(DocumentEvent arg0) {
                    UpdateJob();
                }

                @Override
                public void insertUpdate(DocumentEvent arg0) {
                    UpdateJob();
                }

                @Override
                public void changedUpdate(DocumentEvent arg0) {
                }
            });
    /*cmbRewindCore.addActionListener(new ActionListener() {
       public void actionPerformed(ActionEvent e) {
    UpdateJob(jobIndex);
       }
    });*/
    cmbRewindCore.setEnabled(false);

    cmbRewindCore.setModel(new DefaultComboBoxModel(Consts.REWIND_CORE_MM));
    cmbRewindCore.setSelectedIndex(1);
    cmbRewindCore.setBounds(109, 137, 87, 20);
    pnlJobs.add(cmbRewindCore);
    cmbRewindCore.setEditable(true);

    lblRewindCoremm = new JLabel("Rewind Core:");
    lblRewindCoremm.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblRewindCoremm.setToolTipText("Core diameter of rewind reels");
    lblRewindCoremm.setEnabled(false);
    lblRewindCoremm.setBounds(40, 140, 65, 14);
    pnlJobs.add(lblRewindCoremm);

    lblPer_1 = new JLabel("per:");
    lblPer_1.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblPer_1.setToolTipText("Set whether rewind output is measured per reel or per set");
    lblPer_1.setEnabled(false);
    lblPer_1.setBounds(85, 248, 20, 14);
    pnlJobs.add(lblPer_1);

    cmbJobDomain = new JComboBox();
    cmbJobDomain.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            UpdateSetReel();
            //UpdateJob();
        }
    });
    cmbJobDomain.setEnabled(false);
    cmbJobDomain.setToolTipText("Set whether rewind output is measured per reel or per set");
    cmbJobDomain.setModel(new DefaultComboBoxModel(new String[] { "Reel", "Set" }));
    cmbJobDomain.setBounds(109, 246, 95, 20);
    pnlJobs.add(cmbJobDomain);

    lblmm3 = new JLabel("(mm)");
    lblmm3.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblmm3.setEnabled(false);
    lblmm3.setBounds(205, 61, 27, 14);
    pnlJobs.add(lblmm3);

    lblmm2 = new JLabel("(mm)");
    lblmm2.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblmm2.setEnabled(false);
    lblmm2.setBounds(206, 140, 27, 14);
    pnlJobs.add(lblmm2);

    pnlUnwinds = new JPanel();
    pnlUnwinds.setLayout(null);
    pnlUnwinds.setBorder(new TitledBorder(UIManager.getBorder("TitledBorder.border"), "Unwind Settings",
            TitledBorder.LEADING, TitledBorder.TOP, null, null));
    pnlUnwinds.setBounds(280, 207, 227, 162);
    pnlJob.add(pnlUnwinds);

    lblUnwindLength = new JLabel("Unwind Size:");
    lblUnwindLength.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblUnwindLength.setToolTipText("Quantity of material per mother roll");
    lblUnwindLength.setEnabled(false);
    lblUnwindLength.setHorizontalAlignment(SwingConstants.RIGHT);
    lblUnwindLength.setBounds(21, 104, 66, 14);
    pnlUnwinds.add(lblUnwindLength);

    txtUnwindAmount = new JTextField();
    txtUnwindAmount.setToolTipText("Quantity of material per mother roll");
    txtUnwindAmount.addFocusListener(new FocusAdapter() {
        @Override
        public void focusGained(FocusEvent arg0) {
            txtUnwindAmount.selectAll();
        }
    });
    txtUnwindAmount.getDocument().addDocumentListener(new JobInputChangeListener());
    txtUnwindAmount.setEnabled(false);
    txtUnwindAmount.setName("UnwindLength");
    txtUnwindAmount.setText("10000");
    txtUnwindAmount.setBounds(92, 100, 86, 20);
    pnlUnwinds.add(txtUnwindAmount);
    txtUnwindAmount.setColumns(10);

    lblWebWidthmm = new JLabel("Web Width:");
    lblWebWidthmm.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblWebWidthmm.setToolTipText("Width of mother rolls");
    lblWebWidthmm.setEnabled(false);
    lblWebWidthmm.setBounds(31, 29, 57, 14);
    pnlUnwinds.add(lblWebWidthmm);

    lblUnwindCoremm = new JLabel("Unwind Core:");
    lblUnwindCoremm.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblUnwindCoremm.setToolTipText("Core diameter of mother rolls");
    lblUnwindCoremm.setEnabled(false);
    lblUnwindCoremm.setBounds(22, 54, 66, 14);
    pnlUnwinds.add(lblUnwindCoremm);

    cmbUnwindCore = new JComboBox();
    cmbUnwindCore.setToolTipText("Core diameter of mother rolls");
    ((JTextField) cmbUnwindCore.getEditor().getEditorComponent()).getDocument()
            .addDocumentListener(new DocumentListener() {
                @Override
                public void removeUpdate(DocumentEvent arg0) {
                    UpdateJob();
                }

                @Override
                public void insertUpdate(DocumentEvent arg0) {
                    UpdateJob();
                }

                @Override
                public void changedUpdate(DocumentEvent arg0) {
                }
            });
    cmbUnwindCore.setEnabled(false);

    cmbUnwindCore.setModel(new DefaultComboBoxModel(new String[] { "76", "152", "254" }));
    cmbUnwindCore.setBounds(92, 51, 86, 20);
    pnlUnwinds.add(cmbUnwindCore);
    cmbUnwindCore.setEditable(true);

    lblmm0 = new JLabel("(mm)");
    lblmm0.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblmm0.setEnabled(false);
    lblmm0.setBounds(189, 29, 32, 14);
    pnlUnwinds.add(lblmm0);

    lblmm1 = new JLabel("(mm)");
    lblmm1.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblmm1.setEnabled(false);
    lblmm1.setBounds(189, 53, 32, 14);
    pnlUnwinds.add(lblmm1);

    pnlEnviron = new JPanel();
    tabbedPane.addTab("Job Scheduling", null, pnlEnviron, "Edit the schedule of jobs to be analysed");
    tabbedPane.setEnabledAt(2, true);
    pnlEnviron.setLayout(null);

    JPanel pnlShifts = new JPanel();
    pnlShifts.setLayout(null);
    pnlShifts.setBorder(new TitledBorder(UIManager.getBorder("TitledBorder.border"), "Shift Options",
            TitledBorder.LEADING, TitledBorder.TOP, null, null));
    pnlShifts.setBounds(20, 72, 287, 162);
    pnlEnviron.add(pnlShifts);

    JLabel lblShiftLength = new JLabel("Shift Length:");
    lblShiftLength.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblShiftLength.setToolTipText("Hours per working shift");
    lblShiftLength.setHorizontalAlignment(SwingConstants.RIGHT);
    lblShiftLength.setBounds(15, 28, 108, 14);
    pnlShifts.add(lblShiftLength);

    JLabel lblDayLength = new JLabel("Day Length:");
    lblDayLength.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblDayLength.setToolTipText("Working hours per day");
    lblDayLength.setHorizontalAlignment(SwingConstants.RIGHT);
    lblDayLength.setBounds(29, 78, 94, 14);
    pnlShifts.add(lblDayLength);

    JLabel lblShiftsDay = new JLabel("Shifts per Day:");
    lblShiftsDay.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblShiftsDay.setToolTipText("Shifts per day");
    lblShiftsDay.setHorizontalAlignment(SwingConstants.RIGHT);
    lblShiftsDay.setBounds(15, 53, 108, 14);
    pnlShifts.add(lblShiftsDay);

    JLabel lblDays = new JLabel("Days per Year:");
    lblDays.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblDays.setToolTipText("Days per year");
    lblDays.setHorizontalAlignment(SwingConstants.RIGHT);
    lblDays.setBounds(0, 106, 123, 14);
    pnlShifts.add(lblDays);

    txtShiftLength = new JTextField();
    txtShiftLength.getDocument().addDocumentListener(new DocumentListener() {
        @Override
        public void removeUpdate(DocumentEvent arg0) {
            UpdateShifts();
        }

        @Override
        public void insertUpdate(DocumentEvent arg0) {
            UpdateShifts();
        }

        @Override
        public void changedUpdate(DocumentEvent arg0) {
        }
    });
    txtShiftLength.addFocusListener(new FocusAdapter() {
        @Override
        public void focusGained(FocusEvent arg0) {
            txtShiftLength.selectAll();
        }
    });
    txtShiftLength.setToolTipText("Hours per working shift");

    txtShiftLength.setText("8");
    txtShiftLength.setBounds(133, 25, 86, 20);
    pnlShifts.add(txtShiftLength);
    txtShiftLength.setColumns(10);

    txtShiftCount = new JTextField();
    txtShiftCount.getDocument().addDocumentListener(new DocumentListener() {
        @Override
        public void removeUpdate(DocumentEvent arg0) {
            UpdateShifts();
        }

        @Override
        public void insertUpdate(DocumentEvent arg0) {
            UpdateShifts();
        }

        @Override
        public void changedUpdate(DocumentEvent arg0) {
        }
    });
    txtShiftCount.addFocusListener(new FocusAdapter() {
        @Override
        public void focusGained(FocusEvent e) {
            txtShiftCount.selectAll();
        }
    });
    txtShiftCount.setToolTipText("Shifts per day");

    txtShiftCount.setText("3");
    txtShiftCount.setBounds(133, 50, 86, 20);
    pnlShifts.add(txtShiftCount);
    txtShiftCount.setColumns(10);

    txtDaysYear = new JTextField();
    txtDaysYear.getDocument().addDocumentListener(new DocumentListener() {
        @Override
        public void removeUpdate(DocumentEvent arg0) {
            UpdateShifts();
        }

        @Override
        public void insertUpdate(DocumentEvent arg0) {
            UpdateShifts();
        }

        @Override
        public void changedUpdate(DocumentEvent arg0) {
        }
    });
    txtDaysYear.addFocusListener(new FocusAdapter() {
        @Override
        public void focusGained(FocusEvent e) {
            txtDaysYear.selectAll();
        }
    });
    txtDaysYear.setToolTipText("Days per year");

    txtDaysYear.setText("250");
    txtDaysYear.setBounds(133, 103, 86, 20);
    pnlShifts.add(txtDaysYear);
    txtDaysYear.setColumns(10);

    lblDayLength2 = new JLabel("24 hours");
    lblDayLength2.setToolTipText("Working hours per day");
    lblDayLength2.setBounds(133, 78, 86, 14);
    pnlShifts.add(lblDayLength2);

    lblHoursYear = new JLabel("Hours per Year:");
    lblHoursYear.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblHoursYear.setToolTipText("Working hours per year");
    lblHoursYear.setBounds(47, 131, 76, 14);
    pnlShifts.add(lblHoursYear);

    lblHoursYear2 = new JLabel("6000 hours");
    lblHoursYear2.setToolTipText("Working hours per year");
    lblHoursYear2.setBounds(133, 131, 86, 14);
    pnlShifts.add(lblHoursYear2);

    lblHrs = new JLabel("hrs");
    lblHrs.setBounds(229, 28, 46, 14);
    pnlShifts.add(lblHrs);

    btnAddAll = new JButton("Add All");
    btnAddAll.setToolTipText("Add all jobs to the schedule in order");
    btnAddAll.setFont(new Font("Tahoma", Font.BOLD, 11));
    btnAddAll.setEnabled(false);
    try {
        btnAddAll.setIcon(new ImageIcon(ImageIO.read(FrmMain.class.getResourceAsStream("/atlas/plus.png"))));
    } catch (IOException e1) {
        e1.printStackTrace();
    }
    btnAddAll.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            for (int i = 0; i < jobModel.getSize(); ++i) {
                listJobsAvail.setSelectedIndex(i);
                btnAddJob.doClick();
            }
        }
    });
    btnAddAll.setBounds(327, 460, 110, 36);
    pnlEnviron.add(btnAddAll);

    btnAddJob = new JButton("");
    btnAddJob.setToolTipText("Add this job to the schedule");
    btnAddJob.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            //AddToSchedule(listJobsAvail.getSelectedValue());

            ResetStatusLabel();

            int index = listSchedule.getSelectedIndex();
            //int source_index = listJobsAvail.getSelectedIndex();
            Job sel = (Job) listJobsAvail.getSelectedValue();
            JobItem j = environment.getSchedule().new JobItem(sel, 0, sel.getTotWeight(), sel.getTotLength());
            int size = scheduleModel.getSize();

            // no limit now there are scroll bars
            /* if(size >= Consts.JOB_LIST_LIMIT){    // Max list size
              ShowMessage("Maximum number of jobs scheduled. Please delete before attempting to add more.");
              return;
            }*/

            //If no selection or if item in last position is selected,
            //add the new one to end of list, and select new one.
            if (index == -1 || (index + 1 == size)) {

                scheduleModel.addElement(sel);
                listSchedule.setSelectedIndex(size);
                environment.getSchedule().addJob(j);

                //Otherwise insert the new one after the current selection,
                //and select new one.
            } else {
                scheduleModel.insertElementAt(sel, index + 1);
                listSchedule.setSelectedIndex(index + 1);
                environment.getSchedule().insertJob(j, index + 1);
            }

            btnClearSchedule.setEnabled(true);
        }
    });
    btnAddJob.setEnabled(false);
    try {
        btnAddJob.setIcon(new ImageIcon(ImageIO.read(FrmMain.class.getResourceAsStream("/atlas/add_job.png"))));
        btnAddJob.setDisabledIcon(
                new ImageIcon(ImageIO.read(FrmMain.class.getResourceAsStream("/atlas/add_job_dis.png"))));
        btnAddJob.setRolloverEnabled(true);
        btnAddJob.setRolloverIcon(
                new ImageIcon(ImageIO.read(FrmMain.class.getResourceAsStream("/atlas/add_job_over.png"))));
    } catch (NullPointerException e111) {
        System.out.println("Image load error");
    } catch (IOException e1) {
        e1.printStackTrace();
    }
    btnAddJob.setBounds(521, 178, 54, 54);
    pnlEnviron.add(btnAddJob);

    btnRemoveJob = new JButton("");
    btnRemoveJob.setToolTipText("Remove job from schedule");
    btnRemoveJob.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            ResetStatusLabel();

            // Uncomment this code to allow jobs to be saved back after removal from schedule
            /*if(listSchedule.getSelectedIndex() > -1){
               Job j = (Job) listSchedule.getSelectedValue();
               String name = j.getName().toLowerCase();
               if(!jobNames.contains(name) && !jobModel.contains(j)){
                  if(jobModel.size() < Consts.JOB_LIST_LIMIT){
             jobNames.add(name);
             jobFormReady = true;
             int index = -1;
             if(listJobsAvail.getSelectedIndex() > -1)
                index = listJobsAvail.getSelectedIndex();
             if(index < 0){
                jobModel.addElement(j);
                listJobsAvail.setSelectedIndex(jobModel.size()-1);
                listJobs.setSelectedIndex(jobModel.size()-1);
             }else{
                jobModel.insertElementAt(j, index+1);
                listJobsAvail.setSelectedIndex(index+1);
                listJobs.setSelectedIndex(index+1);
             }
                  }
               }
            }*/

            ListSelectionModel lsm = listSchedule.getSelectionModel();
            int firstSelected = lsm.getMinSelectionIndex();
            int lastSelected = lsm.getMaxSelectionIndex();
            scheduleModel.removeRange(firstSelected, lastSelected);
            environment.getSchedule().remove(firstSelected);

            int size = scheduleModel.size();

            if (size == 0) {
                //List is empty: disable delete, up, and down buttons.
                btnClearSchedule.setEnabled(false);
                btnUpSchedule.setEnabled(false);
                btnDownSchedule.setEnabled(false);
                listSchedule.clearSelection();
                btnRemoveJob.setEnabled(false);
                btnViewSchedule.setEnabled(false);
            } else {
                //Adjust the selection.
                if (firstSelected == scheduleModel.getSize()) {
                    //Removed item in last position.
                    firstSelected--;
                }
                listSchedule.setSelectedIndex(firstSelected);

                if (size == 21) { // No longer full list
                    ResetStatusLabel();
                }

            }
        }
    });
    btnRemoveJob.setEnabled(false);
    try {
        btnRemoveJob
                .setIcon(new ImageIcon(ImageIO.read(FrmMain.class.getResourceAsStream("/atlas/del_job.png"))));
        btnRemoveJob.setDisabledIcon(
                new ImageIcon(ImageIO.read(FrmMain.class.getResourceAsStream("/atlas/del_job_dis.png"))));
        btnRemoveJob.setRolloverEnabled(true);
        btnRemoveJob.setRolloverIcon(
                new ImageIcon(ImageIO.read(FrmMain.class.getResourceAsStream("/atlas/del_job_over.png"))));
    } catch (NullPointerException e111) {
        System.out.println("Image load error");
    } catch (IOException e1) {
        e1.printStackTrace();
    }
    btnRemoveJob.setBounds(520, 243, 54, 54);
    pnlEnviron.add(btnRemoveJob);

    lblJobSchedule_1 = new JLabel("Job Schedule");
    lblJobSchedule_1.setFont(new Font("Tahoma", Font.BOLD, 18));
    lblJobSchedule_1.setBounds(29, 18, 269, 22);
    pnlEnviron.add(lblJobSchedule_1);

    lblScheduleJobsTo = new JLabel("Schedule jobs to the right, then set shift options below");
    lblScheduleJobsTo.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblScheduleJobsTo.setBounds(29, 45, 279, 14);
    pnlEnviron.add(lblScheduleJobsTo);

    lblAvailableJobs_1 = new JLabel("Available Jobs");
    lblAvailableJobs_1.setFont(new Font("Tahoma", Font.BOLD, 12));
    lblAvailableJobs_1.setBounds(327, 19, 137, 14);
    pnlEnviron.add(lblAvailableJobs_1);

    lblJobSchedule_2 = new JLabel("Job Schedule");
    lblJobSchedule_2.setFont(new Font("Tahoma", Font.BOLD, 12));
    lblJobSchedule_2.setBounds(577, 19, 110, 14);
    pnlEnviron.add(lblJobSchedule_2);

    panel = new JPanel();
    panel.setLayout(null);
    panel.setBorder(new TitledBorder(UIManager.getBorder("TitledBorder.border"), "Schedule Options",
            TitledBorder.LEADING, TitledBorder.TOP, null, null));
    panel.setBounds(20, 245, 287, 104);
    pnlEnviron.add(panel);

    btnViewSchedule = new JButton("View Schedule Diagram");
    btnViewSchedule.setFont(new Font("Tahoma", Font.PLAIN, 11));
    btnViewSchedule.setToolTipText("View chart of schedule timings");
    btnViewSchedule.setEnabled(false);
    btnViewSchedule.setBounds(33, 27, 170, 29);
    panel.add(btnViewSchedule);

    chckbxSimulateScheduleStart = new JCheckBox("Ignore machine config & knife positioning times");
    chckbxSimulateScheduleStart.setFont(new Font("Tahoma", Font.PLAIN, 11));
    chckbxSimulateScheduleStart.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            if (!initialising)
                environment.StartStopTimes = !chckbxSimulateScheduleStart.isSelected();
        }
    });
    chckbxSimulateScheduleStart.setToolTipText(
            "WARNING:  Use ONLY when you wish to model the output of a single job over a long time period \u2013 such that the initial set-up time has no material impact on the production volume");
    chckbxSimulateScheduleStart.setBounds(30, 62, 251, 18);
    panel.add(chckbxSimulateScheduleStart);

    lblhoverForInfo = new JLabel("(hover for info)");
    lblhoverForInfo.setToolTipText(
            "WARNING:  Use ONLY when you wish to model the output of a single job over a long time period \u2013 such that the initial set-up time has no material impact on the production volume");
    lblhoverForInfo.setForeground(Color.GRAY);
    lblhoverForInfo.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblhoverForInfo.setBounds(34, 80, 147, 14);
    panel.add(lblhoverForInfo);

    btnUpSchedule = new JButton("");
    btnUpSchedule.setToolTipText("Move job earlier in schedule");
    btnUpSchedule.addActionListener(new ScheduleUpListener());
    try {
        btnUpSchedule.setIcon(new ImageIcon(ImageIO.read(FrmMain.class.getResourceAsStream("/atlas/up.png"))));
        btnUpSchedule.setRolloverEnabled(true);
        btnUpSchedule.setRolloverIcon(
                new ImageIcon(ImageIO.read(FrmMain.class.getResourceAsStream("/atlas/up_over.png"))));
        btnUpSchedule.setDisabledIcon(
                new ImageIcon(ImageIO.read(FrmMain.class.getResourceAsStream("/atlas/up_dis.png"))));
    } catch (NullPointerException e11) {
        System.out.println("Image load error");
    } catch (IOException e1) {
        e1.printStackTrace();
    }
    btnUpSchedule.setEnabled(false);
    btnUpSchedule.setBounds(700, 463, 30, 30);
    pnlEnviron.add(btnUpSchedule);

    btnDownSchedule = new JButton("");
    btnDownSchedule.setToolTipText("Move job later in schedule");
    btnDownSchedule.addActionListener(new ScheduleDownListener());
    try {
        btnDownSchedule
                .setIcon(new ImageIcon(ImageIO.read(FrmMain.class.getResourceAsStream("/atlas/down.png"))));
        btnDownSchedule.setRolloverEnabled(true);
        btnDownSchedule.setRolloverIcon(
                new ImageIcon(ImageIO.read(FrmMain.class.getResourceAsStream("/atlas/down_over.png"))));
        btnDownSchedule.setDisabledIcon(
                new ImageIcon(ImageIO.read(FrmMain.class.getResourceAsStream("/atlas/down_dis.png"))));
    } catch (NullPointerException e11) {
        System.out.println("Image load error");
    } catch (IOException e1) {
        e1.printStackTrace();
    }
    btnDownSchedule.setEnabled(false);
    btnDownSchedule.setBounds(737, 463, 30, 30);
    pnlEnviron.add(btnDownSchedule);

    btnClearSchedule = new JButton("Clear");
    btnClearSchedule.setToolTipText("Clear all jobs from the schedule");
    btnClearSchedule.setFont(new Font("Tahoma", Font.BOLD, 11));
    btnClearSchedule.setEnabled(false);
    try {
        btnClearSchedule
                .setIcon(new ImageIcon(ImageIO.read(FrmMain.class.getResourceAsStream("/atlas/delete.png"))));
        btnClearSchedule.setRolloverEnabled(true);
        btnClearSchedule.setRolloverIcon(
                new ImageIcon(ImageIO.read(FrmMain.class.getResourceAsStream("/atlas/delete_over.png"))));
        btnClearSchedule.setDisabledIcon(
                new ImageIcon(ImageIO.read(FrmMain.class.getResourceAsStream("/atlas/delete_dis.png"))));
    } catch (NullPointerException e11) {
        System.out.println("Image load error");
    } catch (IOException e1) {
        e1.printStackTrace();
    }
    btnClearSchedule.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            scheduleModel.removeAllElements();
            environment.getSchedule().empty();
        }
    });
    btnClearSchedule.setBounds(577, 460, 110, 36);
    pnlEnviron.add(btnClearSchedule);
    //listSchedule.setBorder(new SoftBevelBorder(BevelBorder.LOWERED, null, null, null, null));
    //listSchedule.setBounds(577, 44, 190, 405);
    //pnlEnviron.add(listSchedule);
    btnViewSchedule.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            ScheduleChart ch = new ScheduleChart(environment.getSchedule());
            ch.pack();
            try {
                ch.setIconImage(ImageIO.read(FrmMain.class.getResourceAsStream("/atlas/logo.png")));
            } catch (NullPointerException e11) {
                System.out.println("Image load error");
            } catch (IOException e) {
                e.printStackTrace();
            }
            ch.setLocationRelativeTo(frmTitanRoiCalculator);
            ch.setVisible(true);
        }
    });

    scrlSchedule = new JScrollPane();
    scrlSchedule.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
    scrlSchedule.setBorder(new SoftBevelBorder(BevelBorder.LOWERED, Color.LIGHT_GRAY, null, null, null));
    scrlSchedule.setBounds(577, 44, 190, 405);
    scrlSchedule.getVerticalScrollBar().setUnitIncrement(16);
    pnlEnviron.add(scrlSchedule);

    panel_8 = new JPanel();
    panel_8.setToolTipText("Select job to re-order or remove from schedule");
    panel_8.setBackground(Color.WHITE);
    panel_8.setBorder(null);
    scrlSchedule.setViewportView(panel_8);
    panel_8.setLayout(new BorderLayout(0, 0));

    listSchedule = new JList(scheduleModel);
    panel_8.add(listSchedule, BorderLayout.NORTH);
    listSchedule.setToolTipText("Select job to re-order or remove from schedule");
    listSchedule.addListSelectionListener(new ScheduleSelectionListener());
    listSchedule.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    listSchedule.setCellRenderer(new JobListRenderer());

    panel_5 = new JPanel();
    panel_5.setLayout(null);
    panel_5.setBorder(new TitledBorder(UIManager.getBorder("TitledBorder.border"), "Notes",
            TitledBorder.LEADING, TitledBorder.TOP, null, null));
    panel_5.setBounds(20, 360, 287, 136);
    pnlEnviron.add(panel_5);

    lblToViewAnalysis = new JLabel("To view analysis for 1 job only, add just that job");
    lblToViewAnalysis.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblToViewAnalysis.setBounds(24, 24, 241, 14);
    panel_5.add(lblToViewAnalysis);

    lblToTheSchedule = new JLabel("to the schedule.");
    lblToTheSchedule.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblToTheSchedule.setBounds(24, 38, 241, 14);
    panel_5.add(lblToTheSchedule);

    lblToModelMaintenance = new JLabel("To model maintenance or other downtime, edit the");
    lblToModelMaintenance.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblToModelMaintenance.setBounds(24, 59, 253, 14);
    panel_5.add(lblToModelMaintenance);

    lblShiftOptionsAbove = new JLabel("shift options above. This will affect annual output,");
    lblShiftOptionsAbove.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblShiftOptionsAbove.setBounds(24, 73, 253, 14);
    panel_5.add(lblShiftOptionsAbove);

    lblButNotThe = new JLabel("but not the rates or efficiencies. For these, use the");
    lblButNotThe.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblButNotThe.setBounds(24, 87, 253, 14);
    panel_5.add(lblButNotThe);

    lbladvancedTabIn = new JLabel("'advanced' tab in the options menu box.");
    lbladvancedTabIn.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lbladvancedTabIn.setBounds(24, 101, 253, 14);
    panel_5.add(lbladvancedTabIn);

    scrollPane_2 = new JScrollPane();
    scrollPane_2.setBorder(null);
    scrollPane_2.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
    scrollPane_2.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
    scrollPane_2.setBounds(327, 44, 190, 405);
    pnlEnviron.add(scrollPane_2);

    panel_9 = new JPanel();
    panel_9.setToolTipText("Select job to be added");
    scrollPane_2.setViewportView(panel_9);
    panel_9.setBorder(new SoftBevelBorder(BevelBorder.LOWERED, Color.LIGHT_GRAY, null, null, null));
    panel_9.setBackground(Color.WHITE);
    panel_9.setLayout(new BorderLayout(0, 0));

    listJobsAvail = new JList(jobModel);
    panel_9.add(listJobsAvail, BorderLayout.NORTH);
    listJobsAvail.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "add");
    listJobsAvail.getActionMap().put("add", new AddScheduleBtn());
    listJobsAvail.setToolTipText("Select job to be added");
    listJobsAvail.addListSelectionListener(new JobAvailSelectionListener());
    listJobsAvail.setCellRenderer(new JobListRenderer());
    listJobsAvail.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    listJobsAvail.setBorder(null);

    pnlCompare = new JPanel();
    tabbedPane.addTab("Productivity Comparison", null, pnlCompare, "Productivity comparison data & graphs");
    tabbedPane.setEnabledAt(3, true);
    pnlCompare.setLayout(null);

    pnlResults = new JPanel();
    pnlResults.setBorder(
            new TitledBorder(null, "Numerical Results", TitledBorder.LEADING, TitledBorder.TOP, null, null));
    pnlResults.setBounds(20, 72, 479, 134);
    pnlCompare.add(pnlResults);
    pnlResults.setLayout(null);

    lblOutputLength = new JLabel("Output length over time period:");
    lblOutputLength.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblOutputLength.setEnabled(false);
    lblOutputLength.setToolTipText("Quantity produced");
    lblOutputLength.setBounds(220, 54, 152, 14);
    pnlResults.add(lblOutputLength);

    lblOutputWeight = new JLabel("Output weight over time period:");
    lblOutputWeight.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblOutputWeight.setEnabled(false);
    lblOutputWeight.setToolTipText("Quantity produced");
    lblOutputWeight.setBounds(220, 79, 162, 14);
    pnlResults.add(lblOutputWeight);

    cmbTimeRef = new JComboBox();
    cmbTimeRef.setEnabled(false);
    cmbTimeRef.setToolTipText("Select a time range to display results over");
    cmbTimeRef.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            // Refresh analyses
            UpdateNumericalAnalysis();
        }
    });
    cmbTimeRef.setModel(
            new DefaultComboBoxModel(new String[] { "Schedule", "Year", "Hour", "Shift", "Day"/*, "Week"*/ }));
    cmbTimeRef.setBounds(247, 98, 125, 24);
    pnlResults.add(cmbTimeRef);

    lblPer = new JLabel("Per:");
    lblPer.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblPer.setEnabled(false);
    lblPer.setBounds(220, 103, 20, 14);
    pnlResults.add(lblPer);

    lblAverageMmin = new JLabel("Average rate:");
    lblAverageMmin.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblAverageMmin.setEnabled(false);
    lblAverageMmin.setToolTipText("Average quantity processed");
    lblAverageMmin.setBounds(20, 54, 95, 14);
    pnlResults.add(lblAverageMmin);

    lblNumericsWeight = new JLabel("0.0 tons");
    lblNumericsWeight.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblNumericsWeight.setEnabled(false);
    lblNumericsWeight.setToolTipText("Quantity produced");
    lblNumericsWeight.setBounds(380, 79, 89, 14);
    pnlResults.add(lblNumericsWeight);

    lblNumericsLength = new JLabel("0.0 metres");
    lblNumericsLength.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblNumericsLength.setEnabled(false);
    lblNumericsLength.setToolTipText("Quantity produced");
    lblNumericsLength.setBounds(380, 54, 89, 14);
    pnlResults.add(lblNumericsLength);

    lblNumericsRate = new JLabel("0.0 m/hr");
    lblNumericsRate.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblNumericsRate.setEnabled(false);
    lblNumericsRate.setToolTipText("Average quantity processed");
    lblNumericsRate.setBounds(128, 54, 82, 14);
    pnlResults.add(lblNumericsRate);

    lblEfficiency = new JLabel("Machine running:");
    lblEfficiency.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblEfficiency.setEnabled(false);
    lblEfficiency.setToolTipText("Proportion of total time for which the machine is running");
    lblEfficiency.setBounds(20, 104, 95, 14);
    pnlResults.add(lblEfficiency);

    cmbMachines = new JComboBox();
    cmbMachines.setMaximumRowCount(15);
    cmbMachines.setFont(new Font("Tahoma", Font.BOLD, 11));
    cmbMachines.setEnabled(false);
    cmbMachines.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            UpdateNumericalAnalysis();
        }
    });
    cmbMachines.setToolTipText("Select machine");
    cmbMachines.setBounds(128, 20, 244, 24);
    pnlResults.add(cmbMachines);

    lblMachine = new JLabel("Select Machine:");
    lblMachine.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblMachine.setEnabled(false);
    lblMachine.setToolTipText("Select machine");
    lblMachine.setBounds(20, 25, 77, 14);
    pnlResults.add(lblMachine);

    lblNumericsEff = new JLabel("0.0 %");
    lblNumericsEff.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblNumericsEff.setEnabled(false);
    lblNumericsEff.setToolTipText("Machine efficiency");
    lblNumericsEff.setBounds(128, 104, 65, 14);
    pnlResults.add(lblNumericsEff);

    lblscheduletimelbl = new JLabel("Time to run schedule:");
    lblscheduletimelbl.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblscheduletimelbl.setToolTipText("Time to run schedule");
    lblscheduletimelbl.setEnabled(false);
    lblscheduletimelbl.setBounds(20, 79, 103, 14);
    pnlResults.add(lblscheduletimelbl);

    lblscheduletime = new JLabel("0.0 hr");
    lblscheduletime.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblscheduletime.setToolTipText("Time to run schedule");
    lblscheduletime.setEnabled(false);
    lblscheduletime.setBounds(128, 79, 77, 14);
    pnlResults.add(lblscheduletime);

    pnlROI = new JPanel();
    tabbedPane.addTab("Return on Investment", (Icon) null, pnlROI,
            "Return on investment comparison and analysis");
    pnlROI.setLayout(null);
    tabbedPane.setEnabledAt(4, true);

    lblProductivityComparison = new JLabel("Productivity Comparison");
    lblProductivityComparison.setFont(new Font("Tahoma", Font.BOLD, 18));
    lblProductivityComparison.setBounds(29, 18, 269, 22);
    pnlCompare.add(lblProductivityComparison);

    lblSelectMultipleMachines = new JLabel(
            "Select multiple machines from the list on the right, then compare them below");
    lblSelectMultipleMachines.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblSelectMultipleMachines.setBounds(29, 45, 433, 14);
    pnlCompare.add(lblSelectMultipleMachines);

    label_2 = new JLabel("Machines");
    label_2.setFont(new Font("Tahoma", Font.BOLD, 12));
    label_2.setBounds(522, 19, 85, 14);
    pnlCompare.add(label_2);

    pnlProdGraph = new JPanel();
    pnlProdGraph.setBounds(20, 222, 479, 274);
    pnlCompare.add(pnlProdGraph);
    pnlProdGraph.setBorder(new TitledBorder(UIManager.getBorder("TitledBorder.border"), "Graphical Results",
            TitledBorder.LEADING, TitledBorder.TOP, null, null));
    pnlProdGraph.setLayout(null);

    btnShowGraph = new JButton("Open Graph");
    btnShowGraph.setFont(new Font("Tahoma", Font.BOLD, 11));
    btnShowGraph.setToolTipText("Open graph in new window");
    btnShowGraph.setEnabled(false);
    btnShowGraph.setBounds(366, 51, 99, 39);
    pnlProdGraph.add(btnShowGraph);

    btnSaveToFile = new JButton("Save to File");
    btnSaveToFile.setFont(new Font("Tahoma", Font.PLAIN, 11));
    btnSaveToFile.setToolTipText("Save image to disk");
    btnSaveToFile.setEnabled(false);
    btnSaveToFile.addActionListener(SaveActionListener);
    btnSaveToFile.setBounds(366, 97, 99, 24);
    pnlProdGraph.add(btnSaveToFile);

    pnlPreview = new JPanel();
    pnlPreview.setBackground(Color.WHITE);
    pnlPreview.setBorder(new SoftBevelBorder(BevelBorder.LOWERED, Color.LIGHT_GRAY, null, null, null));
    pnlPreview.setBounds(21, 51, 335, 205);
    pnlProdGraph.add(pnlPreview);
    pnlPreview.setLayout(null);
    pnlGraph = new ChartPanel(chart);
    pnlGraph.setBounds(2, 2, 331, 201);
    //pnlGraph.setPreferredSize(new java.awt.Dimension(243, 171));
    pnlPreview.add(pnlGraph);
    try {
        picLabel = new JLabel(
                new ImageIcon(ImageIO.read(FrmMain.class.getResourceAsStream("/atlas/no_preview.png"))));
    } catch (IOException e2) {
        e2.printStackTrace();
    }
    picLabel.setBounds(2, 2, 331, 201);
    pnlPreview.add(picLabel);
    pnlGraph.setVisible(false);

    lblPreview = new JLabel("Graph Preview");
    lblPreview.setForeground(Color.DARK_GRAY);
    lblPreview.setFont(new Font("Tahoma", Font.BOLD, 12));
    lblPreview.setEnabled(false);
    lblPreview.setBounds(21, 24, 99, 16);
    pnlProdGraph.add(lblPreview);

    lblType = new JLabel("Graph Type:");
    lblType.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblType.setEnabled(false);
    lblType.setToolTipText("Choose measurement type");
    lblType.setBounds(184, 26, 65, 14);
    pnlProdGraph.add(lblType);

    btnShowTimings = new JButton("Machine Runs");
    btnShowTimings.setFont(new Font("Tahoma", Font.PLAIN, 11));
    btnShowTimings.setToolTipText("Show timing diagram for a single machine run");
    btnShowTimings.setEnabled(false);
    btnShowTimings.addActionListener(new BtnShowTimingsActionListener());
    btnShowTimings.setBounds(366, 201, 99, 24);
    pnlProdGraph.add(btnShowTimings);

    btnDowntime = new JButton("Productivity");
    btnDowntime.setFont(new Font("Tahoma", Font.PLAIN, 11));
    btnDowntime.setToolTipText("View productivity breakdown charts for the selected machines");
    btnDowntime.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            ShowTimingBreakdown();
        }
    });
    btnDowntime.setEnabled(false);
    btnDowntime.setBounds(366, 232, 99, 24);
    pnlProdGraph.add(btnDowntime);

    lblbreakdown1 = new JLabel("Show timing");
    lblbreakdown1.setEnabled(false);
    lblbreakdown1.setBounds(370, 166, 99, 14);
    pnlProdGraph.add(lblbreakdown1);

    lblbreakdown2 = new JLabel("breakdown for:");
    lblbreakdown2.setEnabled(false);
    lblbreakdown2.setBounds(370, 182, 99, 14);
    pnlProdGraph.add(lblbreakdown2);

    panel_3 = new JPanel();
    panel_3.setBorder(new TitledBorder(null, "", TitledBorder.LEADING, TitledBorder.TOP, null, null));
    panel_3.setBounds(522, 459, 245, 37);
    pnlCompare.add(panel_3);
    panel_3.setLayout(null);

    btnNone = new JButton("None");
    btnNone.setFont(new Font("Tahoma", Font.PLAIN, 11));
    btnNone.setEnabled(false);
    btnNone.setBounds(172, 7, 57, 23);
    panel_3.add(btnNone);
    btnNone.setToolTipText("Clear machine selection");

    btnAll = new JButton("All");
    btnAll.setFont(new Font("Tahoma", Font.PLAIN, 11));
    btnAll.setEnabled(false);
    btnAll.setBounds(105, 7, 57, 23);
    panel_3.add(btnAll);
    btnAll.setToolTipText("Select all machines");

    lblSelect = new JLabel("Select:");
    lblSelect.setEnabled(false);
    lblSelect.setBounds(37, 11, 46, 14);
    panel_3.add(lblSelect);

    scrollPane_3 = new JScrollPane();
    scrollPane_3.setBorder(null);
    scrollPane_3.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
    scrollPane_3.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
    scrollPane_3.setBounds(522, 44, 245, 405);
    pnlCompare.add(scrollPane_3);

    panel_10 = new JPanel();
    panel_10.setToolTipText(
            "Click a machine to select it. Select multiple machines to compare their performance under the chosen job schedule.");
    panel_10.setBackground(Color.WHITE);
    scrollPane_3.setViewportView(panel_10);
    panel_10.setBorder(new SoftBevelBorder(BevelBorder.LOWERED, Color.LIGHT_GRAY, null, null, null));
    panel_10.setLayout(new BorderLayout(0, 0));

    listCompare = new JList(listModel);
    panel_10.add(listCompare, BorderLayout.NORTH);
    listCompare.setCellRenderer(new MachineListRenderer());
    listCompare.setToolTipText(
            "Click a machine to select it. Select multiple machines to compare their performance under the chosen job schedule.");
    listCompare.setBorder(null);
    listCompare.addListSelectionListener(new MultiSelectionListener());

    btnAll.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            int[] count = new int[listModel.size()];
            for (int i = 0; i < listModel.size(); ++i)
                count[i] = i;
            listCompare.setSelectedIndices(count);
        }
    });
    btnNone.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            listCompare.clearSelection();
        }
    });
    btnShowGraph.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            // TODO base on cmbGraphType: or not if just using chart

            /*PieChart test = new PieChart("title","this is a pie chart");
            test.pack();
            test.setVisible(true);
            test.setLocationRelativeTo(null);*/
            JFrame popGraph = new JFrame();

            JFreeChart chartBig = null;
            try {
                chartBig = (JFreeChart) chart.clone();
            } catch (CloneNotSupportedException e) {
                e.printStackTrace();
            }
            //chartBig.setTitle("Productivity Comparison");

            ChartPanel cpanel = new ChartPanel(chartBig);
            cpanel.setPreferredSize(new java.awt.Dimension(500, 300));
            popGraph.setContentPane(cpanel);
            try {
                popGraph.setIconImage(ImageIO.read(FrmMain.class.getResourceAsStream("/atlas/logo.png")));
            } catch (NullPointerException e11) {
                System.out.println("Image load error");
            } catch (IOException e) {
                e.printStackTrace();
            }
            popGraph.setTitle("Productivity Graph");
            popGraph.setSize(450, 300);

            popGraph.pack();
            popGraph.setVisible(true);
            popGraph.setLocationRelativeTo(frmTitanRoiCalculator);
        }
    });

    cmbGraphType = new JComboBox();
    cmbGraphType.setMaximumRowCount(10);
    cmbGraphType.setFont(new Font("Tahoma", Font.PLAIN, 11));
    cmbGraphType.setEnabled(false);
    cmbGraphType.setToolTipText("Choose measurement type");
    cmbGraphType.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            // Refresh analyses
            UpdateGraph();
        }
    });
    cmbGraphType.setModel(new DefaultComboBoxModel(new String[] { "Schedule Time", "Length per Hour",
            "Weight per Hour", "Length per Year", "Weight per Year", "Run Percentage" }));
    cmbGraphType.setSelectedIndex(0);
    cmbGraphType.setBounds(251, 21, 105, 24);
    pnlProdGraph.add(cmbGraphType);

    lblReturnOnInvestment = new JLabel("Return on Investment");
    lblReturnOnInvestment.setFont(new Font("Tahoma", Font.BOLD, 18));
    lblReturnOnInvestment.setBounds(29, 18, 269, 22);
    pnlROI.add(lblReturnOnInvestment);

    lblSelectMultipleMachines_1 = new JLabel(
            "Select multiple machines from the list on the right, then compare them below");
    lblSelectMultipleMachines_1.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblSelectMultipleMachines_1.setBounds(29, 45, 433, 14);
    pnlROI.add(lblSelectMultipleMachines_1);

    lblCompareroiList = new JLabel("Machines");
    lblCompareroiList.setFont(new Font("Tahoma", Font.BOLD, 12));
    lblCompareroiList.setBounds(522, 19, 85, 14);
    pnlROI.add(lblCompareroiList);

    panel_4 = new JPanel();
    panel_4.setLayout(null);
    panel_4.setBorder(new TitledBorder(null, "", TitledBorder.LEADING, TitledBorder.TOP, null, null));
    panel_4.setBounds(522, 459, 245, 37);
    pnlROI.add(panel_4);

    btnROIselectnone = new JButton("None");
    btnROIselectnone.setFont(new Font("Tahoma", Font.PLAIN, 11));
    btnROIselectnone.setEnabled(false);
    btnROIselectnone.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            listCompareRoi.clearSelection();
        }
    });
    btnROIselectnone.setToolTipText("Clear machine selection");
    btnROIselectnone.setBounds(172, 7, 57, 23);
    panel_4.add(btnROIselectnone);

    btnROIselectall = new JButton("All");
    btnROIselectall.setFont(new Font("Tahoma", Font.PLAIN, 11));
    btnROIselectall.setEnabled(false);
    btnROIselectall.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            int[] count = new int[listModel.size()];
            for (int i = 0; i < listModel.size(); ++i)
                count[i] = i;
            listCompareRoi.setSelectedIndices(count);
        }
    });
    btnROIselectall.setToolTipText("Select all machines");
    btnROIselectall.setBounds(105, 7, 57, 23);
    panel_4.add(btnROIselectall);

    lblROIselect = new JLabel("Select:");
    lblROIselect.setEnabled(false);
    lblROIselect.setBounds(37, 11, 46, 14);
    panel_4.add(lblROIselect);

    tabsROI = new JTabbedPane(JTabbedPane.TOP);
    tabsROI.addChangeListener(new ChangeListener() {
        public void stateChanged(ChangeEvent arg0) {
            try {
                ResetStatusLabel();
            } catch (NullPointerException e) {
                // Form is still initialising
                return;
            }

            int tab = tabsROI.getSelectedIndex();
            switch (tab) {
            case 0:
                UpdateROIProd();
                break;
            case 1:
                UpdateROIEnergy();
                break;
            case 2:
                UpdateROIMaint();
                break;
            case 3:
                UpdateROIWaste();
                break;
            }
        }
    });
    tabsROI.setBorder(new SoftBevelBorder(BevelBorder.LOWERED, null, null, null, null));
    tabsROI.setBounds(29, 72, 470, 424);
    pnlROI.add(tabsROI);

    pnlProdROI = new JPanel();
    pnlProdROI.setBackground(Color.WHITE);
    tabsROI.addTab("Productivity", null, pnlProdROI, "ROI based on productivity");
    pnlProdROI.setLayout(null);

    lblThisToolIlllustrates = new JLabel(
            "This tool illlustrates the long-term financial benfits of particular machines and options in");
    lblThisToolIlllustrates.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblThisToolIlllustrates.setForeground(Color.GRAY);
    lblThisToolIlllustrates.setBounds(10, 11, 439, 14);
    pnlProdROI.add(lblThisToolIlllustrates);

    lblInTermsOf = new JLabel("terms of productivity gains.");
    lblInTermsOf.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblInTermsOf.setForeground(Color.GRAY);
    lblInTermsOf.setBounds(10, 27, 317, 14);
    pnlProdROI.add(lblInTermsOf);

    pnlGraphProd = new JPanel();
    pnlGraphProd.setBackground(Color.WHITE);
    pnlGraphProd.setBorder(new SoftBevelBorder(BevelBorder.LOWERED, Color.LIGHT_GRAY, null, null, null));
    pnlGraphProd.setBounds(10, 100, 439, 230);
    pnlProdROI.add(pnlGraphProd);
    pnlGraphProd.setLayout(null);

    pnlGraphProdInner = new ChartPanel(null);
    pnlGraphProdInner.setBounds(2, 2, 435, 226);
    //pnlGraphProd.add(pnlGraphProdInner);

    try {
        lblNoGraph = new JLabel(
                new ImageIcon(ImageIO.read(FrmMain.class.getResourceAsStream("/atlas/no_preview.png"))));
    } catch (IOException e2) {
        e2.printStackTrace();
    }
    lblNoGraph.setBounds(2, 2, 435, 226);
    pnlGraphProd.add(lblNoGraph);

    lblSellingPrice = new JLabel("Selling price:");
    lblSellingPrice.setEnabled(false);
    lblSellingPrice.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblSellingPrice.setBounds(10, 52, 60, 14);
    pnlProdROI.add(lblSellingPrice);

    txtsellingprice = new JTextField();
    txtsellingprice.setToolTipText("Average selling price of the material per unit weight");
    txtsellingprice.setEnabled(false);
    txtsellingprice.addFocusListener(new FocusAdapter() {
        @Override
        public void focusGained(FocusEvent arg0) {
            txtsellingprice.selectAll();
        }
    });
    txtsellingprice.getDocument().addDocumentListener(new DocumentListener() {
        @Override
        public void changedUpdate(DocumentEvent arg0) {
        }

        @Override
        public void insertUpdate(DocumentEvent arg0) {
            UpdateROIValue();
        }

        @Override
        public void removeUpdate(DocumentEvent arg0) {
            UpdateROIValue();
        }

    });
    txtsellingprice.setFont(new Font("Tahoma", Font.PLAIN, 11));
    txtsellingprice.setBounds(90, 49, 65, 20);
    pnlProdROI.add(txtsellingprice);
    txtsellingprice.setColumns(10);

    lblPerTonne = new JLabel("per tonne");
    lblPerTonne.setEnabled(false);
    lblPerTonne.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblPerTonne.setBounds(160, 52, 70, 14);
    pnlProdROI.add(lblPerTonne);

    lblContribution = new JLabel("Contribution:");
    lblContribution.setEnabled(false);
    lblContribution.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblContribution.setBounds(10, 75, 70, 14);
    pnlProdROI.add(lblContribution);

    txtcontribution = new JTextField();
    txtcontribution.setToolTipText("Contribution percentage");
    txtcontribution.setEnabled(false);
    txtcontribution.addFocusListener(new FocusAdapter() {
        @Override
        public void focusGained(FocusEvent e) {
            txtcontribution.selectAll();
        }
    });
    txtcontribution.getDocument().addDocumentListener(new DocumentListener() {
        @Override
        public void changedUpdate(DocumentEvent e) {
        }

        @Override
        public void insertUpdate(DocumentEvent e) {
            UpdateROIValue();
        }

        @Override
        public void removeUpdate(DocumentEvent e) {
            UpdateROIValue();
        }
    });
    txtcontribution.setFont(new Font("Tahoma", Font.PLAIN, 11));
    txtcontribution.setBounds(90, 73, 65, 20);
    pnlProdROI.add(txtcontribution);
    txtcontribution.setColumns(10);

    lblpercent = new JLabel("%");
    lblpercent.setEnabled(false);
    lblpercent.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblpercent.setBounds(160, 76, 11, 14);
    pnlProdROI.add(lblpercent);

    lblValueAddedlbl = new JLabel("Value added:");
    lblValueAddedlbl.setEnabled(false);
    lblValueAddedlbl.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblValueAddedlbl.setBounds(279, 52, 70, 14);
    pnlProdROI.add(lblValueAddedlbl);

    lblvalueadded = new JLabel("\u00A30.00 / tonne");
    lblvalueadded.setToolTipText("Value added per unit weight");
    lblvalueadded.setEnabled(false);
    lblvalueadded.setFont(new Font("Tahoma", Font.BOLD, 12));
    lblvalueadded.setBounds(279, 71, 170, 20);
    pnlProdROI.add(lblvalueadded);

    cmbMarg1 = new JComboBox();
    cmbMarg1.setToolTipText("Old machine");
    cmbMarg1.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            UpdateROIProd();
        }
    });
    cmbMarg1.setEnabled(false);
    cmbMarg1.setFont(new Font("Tahoma", Font.PLAIN, 11));
    cmbMarg1.setBounds(10, 359, 111, 20);
    pnlProdROI.add(cmbMarg1);

    cmbMarg2 = new JComboBox();
    cmbMarg2.setToolTipText("New machine");
    cmbMarg2.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            UpdateROIProd();
        }
    });
    cmbMarg2.setEnabled(false);
    cmbMarg2.setFont(new Font("Tahoma", Font.PLAIN, 11));
    cmbMarg2.setBounds(141, 359, 111, 20);
    pnlProdROI.add(cmbMarg2);

    lblMarginalImprovement = new JLabel("\u00A30.00 per annum");
    lblMarginalImprovement.setToolTipText("Marginal improvement");
    lblMarginalImprovement.setEnabled(false);
    lblMarginalImprovement.setFont(new Font("Tahoma", Font.BOLD, 13));
    lblMarginalImprovement.setBounds(279, 358, 170, 20);
    pnlProdROI.add(lblMarginalImprovement);

    lblSelectMachines = new JLabel("Select 2 machines to view the marginal improvement between them:");
    lblSelectMachines.setForeground(Color.GRAY);
    lblSelectMachines.setFont(new Font("Tahoma", Font.BOLD, 11));
    lblSelectMachines.setBounds(10, 338, 412, 14);
    pnlProdROI.add(lblSelectMachines);

    lblpound1 = new JLabel("\u00A3");
    lblpound1.setEnabled(false);
    lblpound1.setBounds(80, 52, 11, 14);
    pnlProdROI.add(lblpound1);

    lblTo = new JLabel("to");
    lblTo.setForeground(Color.GRAY);
    lblTo.setFont(new Font("Tahoma", Font.BOLD, 11));
    lblTo.setBounds(125, 362, 16, 14);
    pnlProdROI.add(lblTo);

    label = new JLabel("=");
    label.setForeground(Color.GRAY);
    label.setFont(new Font("Tahoma", Font.BOLD, 13));
    label.setBounds(259, 362, 11, 14);
    pnlProdROI.add(label);

    pnlEnergy = new JPanel();
    pnlEnergy.setBackground(Color.WHITE);
    tabsROI.addTab("Energy Efficiency", null, pnlEnergy, "ROI based on machine power usage");
    pnlEnergy.setLayout(null);

    lblThisToolHighlights = new JLabel(
            "This tool highlights power consumption differences between machines, and the resulting");
    lblThisToolHighlights.setForeground(Color.GRAY);
    lblThisToolHighlights.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblThisToolHighlights.setBounds(10, 11, 439, 14);
    pnlEnergy.add(lblThisToolHighlights);

    lblImpactOnFinancial = new JLabel("impact on financial returns.");
    lblImpactOnFinancial.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblImpactOnFinancial.setForeground(Color.GRAY);
    lblImpactOnFinancial.setBounds(10, 27, 439, 14);
    pnlEnergy.add(lblImpactOnFinancial);

    rdbtnAveragePower = new JRadioButton("Average power");
    rdbtnAveragePower.setToolTipText("Select \"average power\" input type");
    rdbtnAveragePower.setFont(new Font("Tahoma", Font.PLAIN, 11));
    rdbtnAveragePower.setEnabled(false);
    rdbtnAveragePower.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            ClearPowerTxts();
            txtaveragepower.setEnabled(true);
            txthourlyusage.setEnabled(false);
            txtannualusage.setEnabled(false);
            lblKw.setEnabled(true);
            lblKwh.setEnabled(false);
            lblKwh_1.setEnabled(false);
            txtaveragepower.requestFocusInWindow();
            UpdateEnergyData();
        }
    });
    rdbtnAveragePower.setSelected(true);
    rdbtnAveragePower.setBackground(Color.WHITE);
    rdbtnAveragePower.setBounds(349, 44, 109, 23);
    pnlEnergy.add(rdbtnAveragePower);

    rdbtnHourlyUsage = new JRadioButton("Hourly usage");
    rdbtnHourlyUsage.setToolTipText("Select \"hourly usage\" input type");
    rdbtnHourlyUsage.setFont(new Font("Tahoma", Font.PLAIN, 11));
    rdbtnHourlyUsage.setEnabled(false);
    rdbtnHourlyUsage.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            ClearPowerTxts();
            txtaveragepower.setEnabled(false);
            txthourlyusage.setEnabled(true);
            txtannualusage.setEnabled(false);
            lblKw.setEnabled(false);
            lblKwh.setEnabled(true);
            lblKwh_1.setEnabled(false);
            txthourlyusage.requestFocusInWindow();
            UpdateEnergyData();
        }
    });
    rdbtnHourlyUsage.setBackground(Color.WHITE);
    rdbtnHourlyUsage.setBounds(349, 70, 109, 23);
    pnlEnergy.add(rdbtnHourlyUsage);

    rdbtnAnnualUsage = new JRadioButton("Annual usage");
    rdbtnAnnualUsage.setToolTipText("Select \"annual usage\" input type");
    rdbtnAnnualUsage.setFont(new Font("Tahoma", Font.PLAIN, 11));
    rdbtnAnnualUsage.setEnabled(false);
    rdbtnAnnualUsage.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            ClearPowerTxts();
            txtaveragepower.setEnabled(false);
            txthourlyusage.setEnabled(false);
            txtannualusage.setEnabled(true);
            lblKw.setEnabled(false);
            lblKwh.setEnabled(false);
            lblKwh_1.setEnabled(true);
            txtannualusage.requestFocusInWindow();
            UpdateEnergyData();
        }
    });
    rdbtnAnnualUsage.setBackground(Color.WHITE);
    rdbtnAnnualUsage.setBounds(349, 97, 109, 23);
    pnlEnergy.add(rdbtnAnnualUsage);

    rdbtnsPower.add(rdbtnAveragePower);
    rdbtnsPower.add(rdbtnHourlyUsage);
    rdbtnsPower.add(rdbtnAnnualUsage);

    lblEnergyCostl = new JLabel("Energy cost:");
    lblEnergyCostl.setEnabled(false);
    lblEnergyCostl.setFont(new Font("Tahoma", Font.BOLD, 11));
    lblEnergyCostl.setBounds(10, 101, 72, 14);
    pnlEnergy.add(lblEnergyCostl);

    lblpound2 = new JLabel("\u00A3");
    lblpound2.setEnabled(false);
    lblpound2.setFont(new Font("Tahoma", Font.PLAIN, 12));
    lblpound2.setBounds(91, 100, 13, 14);
    pnlEnergy.add(lblpound2);

    txtenergycost = new JTextField();
    txtenergycost.setToolTipText("Raw energy cost, per kWh");
    txtenergycost.setEnabled(false);
    txtenergycost.addFocusListener(new FocusAdapter() {
        @Override
        public void focusGained(FocusEvent arg0) {
            txtenergycost.selectAll();
        }
    });
    txtenergycost.getDocument().addDocumentListener(new DocumentListener() {
        @Override
        public void removeUpdate(DocumentEvent arg0) {
            UpdateROIEnergy();
        }

        @Override
        public void insertUpdate(DocumentEvent arg0) {
            UpdateROIEnergy();
        }

        @Override
        public void changedUpdate(DocumentEvent arg0) {
        }
    });
    txtenergycost.setFont(new Font("Tahoma", Font.PLAIN, 12));
    txtenergycost.setBounds(102, 98, 74, 20);
    pnlEnergy.add(txtenergycost);
    txtenergycost.setColumns(10);

    lblPerKwh = new JLabel("per kWh");
    lblPerKwh.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblPerKwh.setEnabled(false);
    lblPerKwh.setBounds(179, 101, 46, 14);
    pnlEnergy.add(lblPerKwh);

    txtaveragepower = new JTextField();
    txtaveragepower.setToolTipText("Average power in kW");
    txtaveragepower.setEnabled(false);
    txtaveragepower.getDocument().addDocumentListener(new DocumentListener() {
        @Override
        public void removeUpdate(DocumentEvent arg0) {
            UpdateEnergyData();
        }

        @Override
        public void insertUpdate(DocumentEvent arg0) {
            UpdateEnergyData();
        }

        @Override
        public void changedUpdate(DocumentEvent arg0) {
        }
    });
    txtaveragepower.addFocusListener(new FocusAdapter() {
        @Override
        public void focusGained(FocusEvent e) {
            txtaveragepower.selectAll();
        }
    });
    txtaveragepower.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseReleased(MouseEvent arg0) {
            if (txtLimitRunSpeed.contains(arg0.getPoint())) {
                if (!txtaveragepower.isEnabled()) {
                    rdbtnAveragePower.doClick();
                }
            }
        }
    });
    txtaveragepower.setBounds(233, 47, 86, 20);
    pnlEnergy.add(txtaveragepower);
    txtaveragepower.setColumns(10);

    txthourlyusage = new JTextField();
    txthourlyusage.setToolTipText("Average hourly energy usage");
    txthourlyusage.setEnabled(false);
    txthourlyusage.getDocument().addDocumentListener(new DocumentListener() {
        @Override
        public void removeUpdate(DocumentEvent e) {
            UpdateEnergyData();
        }

        @Override
        public void insertUpdate(DocumentEvent e) {
            UpdateEnergyData();
        }

        @Override
        public void changedUpdate(DocumentEvent e) {
        }
    });
    txthourlyusage.addFocusListener(new FocusAdapter() {
        @Override
        public void focusGained(FocusEvent e) {
            txthourlyusage.selectAll();
        }
    });
    txthourlyusage.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseReleased(MouseEvent arg0) {
            if (txtLimitRunSpeed.contains(arg0.getPoint())) {
                if (!txthourlyusage.isEnabled())
                    rdbtnHourlyUsage.doClick();
            }
        }
    });
    txthourlyusage.setColumns(10);
    txthourlyusage.setBounds(233, 73, 86, 20);
    pnlEnergy.add(txthourlyusage);

    txtannualusage = new JTextField();
    txtannualusage.setToolTipText("Average annual energy usage");
    txtannualusage.setEnabled(false);
    txtannualusage.getDocument().addDocumentListener(new DocumentListener() {
        @Override
        public void removeUpdate(DocumentEvent e) {
            UpdateEnergyData();
        }

        @Override
        public void insertUpdate(DocumentEvent e) {
            UpdateEnergyData();
        }

        @Override
        public void changedUpdate(DocumentEvent e) {
        }
    });
    txtannualusage.addFocusListener(new FocusAdapter() {
        @Override
        public void focusGained(FocusEvent e) {
            txtannualusage.selectAll();
        }
    });
    txtannualusage.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseReleased(MouseEvent arg0) {
            if (txtLimitRunSpeed.contains(arg0.getPoint())) {
                if (!txtannualusage.isEnabled())
                    rdbtnAnnualUsage.doClick();
            }
        }
    });
    txtannualusage.setColumns(10);
    txtannualusage.setBounds(233, 99, 86, 20);
    pnlEnergy.add(txtannualusage);

    cmbMachineEnergy = new JComboBox();
    cmbMachineEnergy.setEnabled(false);
    cmbMachineEnergy.setToolTipText("Select machine to edit");
    cmbMachineEnergy.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            UpdateEnergyView();
        }
    });
    cmbMachineEnergy.setBounds(69, 46, 152, 23);
    pnlEnergy.add(cmbMachineEnergy);

    lblMachine_1 = new JLabel("Machine:");
    lblMachine_1.setEnabled(false);
    lblMachine_1.setFont(new Font("Tahoma", Font.BOLD, 11));
    lblMachine_1.setBounds(10, 50, 59, 14);
    pnlEnergy.add(lblMachine_1);

    lblKw = new JLabel("kW");
    lblKw.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblKw.setEnabled(false);
    lblKw.setBounds(323, 50, 15, 14);
    pnlEnergy.add(lblKw);

    lblKwh = new JLabel("kWh");
    lblKwh.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblKwh.setEnabled(false);
    lblKwh.setBounds(323, 76, 26, 14);
    pnlEnergy.add(lblKwh);

    lblKwh_1 = new JLabel("MWh");
    lblKwh_1.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblKwh_1.setEnabled(false);
    lblKwh_1.setBounds(323, 102, 26, 14);
    pnlEnergy.add(lblKwh_1);

    pnlGraphEnergy = new JPanel();
    pnlGraphEnergy.setBorder(new SoftBevelBorder(BevelBorder.LOWERED, Color.LIGHT_GRAY, null, null, null));
    pnlGraphEnergy.setBackground(Color.WHITE);
    pnlGraphEnergy.setBounds(10, 126, 439, 226);
    pnlEnergy.add(pnlGraphEnergy);
    pnlGraphEnergy.setLayout(null);
    try {
        lblNoGraph2 = new JLabel(
                new ImageIcon(ImageIO.read(FrmMain.class.getResourceAsStream("/atlas/no_preview.png"))));
    } catch (IOException e2) {
        e2.printStackTrace();
    }
    lblNoGraph2.setBounds(2, 2, 435, 222);
    pnlGraphEnergy.add(lblNoGraph2);

    lblPleaseSetPower = new JLabel("Please set power usage for each machine");
    lblPleaseSetPower.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblPleaseSetPower.setEnabled(false);
    lblPleaseSetPower.setForeground(Color.GRAY);
    lblPleaseSetPower.setBounds(10, 74, 215, 14);
    pnlEnergy.add(lblPleaseSetPower);

    lblMarginalEnergy = new JLabel("\u00A30.00 per annum");
    lblMarginalEnergy.setToolTipText("Marginal improvement");
    lblMarginalEnergy.setFont(new Font("Tahoma", Font.BOLD, 13));
    lblMarginalEnergy.setEnabled(false);
    lblMarginalEnergy.setBounds(279, 358, 170, 20);
    pnlEnergy.add(lblMarginalEnergy);

    label_4 = new JLabel("=");
    label_4.setForeground(Color.GRAY);
    label_4.setFont(new Font("Tahoma", Font.BOLD, 13));
    label_4.setBounds(259, 362, 11, 14);
    pnlEnergy.add(label_4);

    cmbMargEnergy2 = new JComboBox();
    cmbMargEnergy2.setToolTipText("New machine");
    cmbMargEnergy2.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            UpdateROIEnergy();
        }
    });
    cmbMargEnergy2.setFont(new Font("Tahoma", Font.PLAIN, 11));
    cmbMargEnergy2.setEnabled(false);
    cmbMargEnergy2.setBounds(141, 359, 111, 20);
    pnlEnergy.add(cmbMargEnergy2);

    label_5 = new JLabel("to");
    label_5.setForeground(Color.GRAY);
    label_5.setFont(new Font("Tahoma", Font.BOLD, 11));
    label_5.setBounds(125, 362, 16, 14);
    pnlEnergy.add(label_5);

    cmbMargEnergy1 = new JComboBox();
    cmbMargEnergy1.setToolTipText("Old machine");
    cmbMargEnergy1.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            UpdateROIEnergy();
        }
    });
    cmbMargEnergy1.setFont(new Font("Tahoma", Font.PLAIN, 11));
    cmbMargEnergy1.setEnabled(false);
    cmbMargEnergy1.setBounds(10, 359, 111, 20);
    pnlEnergy.add(cmbMargEnergy1);

    pnlMaint = new JPanel();
    pnlMaint.setBackground(Color.WHITE);
    tabsROI.addTab("Maintenance", null, pnlMaint, "ROI based on maintenance costs");
    tabsROI.setMnemonicAt(2, 65);
    pnlMaint.setLayout(null);

    lblThisToolDemonstrates_1 = new JLabel(
            "This tool demonstrates the maintenance reduction benefits of machines.");
    lblThisToolDemonstrates_1.setBounds(10, 11, 421, 14);
    lblThisToolDemonstrates_1.setForeground(Color.GRAY);
    lblThisToolDemonstrates_1.setFont(new Font("Tahoma", Font.PLAIN, 11));
    pnlMaint.add(lblThisToolDemonstrates_1);

    lblMaintenanceHoursPer = new JLabel("Annual downtime:");
    lblMaintenanceHoursPer.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblMaintenanceHoursPer.setEnabled(false);
    lblMaintenanceHoursPer.setBounds(10, 64, 86, 14);
    pnlMaint.add(lblMaintenanceHoursPer);

    lblRepairCostsPer = new JLabel("Labour costs per hour:");
    lblRepairCostsPer.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblRepairCostsPer.setEnabled(false);
    lblRepairCostsPer.setBounds(255, 36, 111, 14);
    pnlMaint.add(lblRepairCostsPer);

    lblPartsCostsPer = new JLabel("Parts costs per year:");
    lblPartsCostsPer.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblPartsCostsPer.setEnabled(false);
    lblPartsCostsPer.setBounds(255, 64, 101, 14);
    pnlMaint.add(lblPartsCostsPer);

    cmbMachinesmaintenance = new JComboBox();
    cmbMachinesmaintenance.setEnabled(false);
    cmbMachinesmaintenance.setToolTipText("Please set maintenance costs for each machine");
    cmbMachinesmaintenance.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            ViewMaintCosts();
        }
    });
    cmbMachinesmaintenance.setBounds(79, 30, 152, 23);
    pnlMaint.add(cmbMachinesmaintenance);

    txtmaintenancehours = new JTextField();
    txtmaintenancehours.setToolTipText("Hours per year for which machine is not running due to maintenance");
    txtmaintenancehours.setEnabled(false);
    txtmaintenancehours.addFocusListener(new FocusAdapter() {
        @Override
        public void focusGained(FocusEvent e) {
            txtmaintenancehours.selectAll();
        }
    });
    txtmaintenancehours.getDocument().addDocumentListener(new DocumentListener() {
        @Override
        public void removeUpdate(DocumentEvent e) {
            UpdateMaintCosts();
        }

        @Override
        public void insertUpdate(DocumentEvent e) {
            UpdateMaintCosts();
        }

        @Override
        public void changedUpdate(DocumentEvent e) {
        }
    });
    txtmaintenancehours.setBounds(106, 61, 67, 20);
    pnlMaint.add(txtmaintenancehours);
    txtmaintenancehours.setColumns(10);

    txtmaintenanceperhour = new JTextField();
    txtmaintenanceperhour.setToolTipText("Hourly labour costs for maintenance");
    txtmaintenanceperhour.setEnabled(false);
    txtmaintenanceperhour.addFocusListener(new FocusAdapter() {
        @Override
        public void focusGained(FocusEvent e) {
            txtmaintenanceperhour.selectAll();
        }
    });
    txtmaintenanceperhour.getDocument().addDocumentListener(new DocumentListener() {
        @Override
        public void removeUpdate(DocumentEvent e) {
            UpdateMaintCosts();
        }

        @Override
        public void insertUpdate(DocumentEvent e) {
            UpdateMaintCosts();
        }

        @Override
        public void changedUpdate(DocumentEvent e) {
        }
    });
    txtmaintenanceperhour.setColumns(10);
    txtmaintenanceperhour.setBounds(382, 33, 67, 20);
    pnlMaint.add(txtmaintenanceperhour);

    txtmaintenanceparts = new JTextField();
    txtmaintenanceparts.setToolTipText("Annual cost of maintenance parts for this machine");
    txtmaintenanceparts.setEnabled(false);
    txtmaintenanceparts.addFocusListener(new FocusAdapter() {
        @Override
        public void focusGained(FocusEvent e) {
            txtmaintenanceparts.selectAll();
        }
    });
    txtmaintenanceparts.getDocument().addDocumentListener(new DocumentListener() {
        @Override
        public void removeUpdate(DocumentEvent e) {
            UpdateMaintCosts();
        }

        @Override
        public void insertUpdate(DocumentEvent e) {
            UpdateMaintCosts();
        }

        @Override
        public void changedUpdate(DocumentEvent e) {
        }
    });
    txtmaintenanceparts.setColumns(10);
    txtmaintenanceparts.setBounds(382, 61, 67, 20);
    pnlMaint.add(txtmaintenanceparts);

    lbltotalmaintcost = new JLabel("\u00A30.00 / year");
    lbltotalmaintcost.setToolTipText("Total annual spend on maintenance for this machine (labour + parts)");
    lbltotalmaintcost.setForeground(Color.GRAY);
    lbltotalmaintcost.setEnabled(false);
    lbltotalmaintcost.setHorizontalAlignment(SwingConstants.LEFT);
    lbltotalmaintcost.setFont(new Font("Tahoma", Font.BOLD, 11));
    lbltotalmaintcost.setBounds(344, 87, 105, 14);
    pnlMaint.add(lbltotalmaintcost);

    lblpound10 = new JLabel("\u00A3");
    lblpound10.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblpound10.setEnabled(false);
    lblpound10.setBounds(373, 36, 11, 14);
    pnlMaint.add(lblpound10);

    lblpound11 = new JLabel("\u00A3");
    lblpound11.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblpound11.setEnabled(false);
    lblpound11.setBounds(373, 64, 11, 14);
    pnlMaint.add(lblpound11);

    pnlGraphMaint = new JPanel();
    pnlGraphMaint.setBorder(new SoftBevelBorder(BevelBorder.LOWERED, Color.LIGHT_GRAY, null, null, null));
    pnlGraphMaint.setBackground(Color.WHITE);
    pnlGraphMaint.setBounds(10, 110, 439, 242);
    pnlMaint.add(pnlGraphMaint);
    pnlGraphMaint.setLayout(null);
    try {
        lblNoGraph3 = new JLabel(
                new ImageIcon(ImageIO.read(FrmMain.class.getResourceAsStream("/atlas/no_preview.png"))));
    } catch (IOException e2) {
        e2.printStackTrace();
    }
    lblNoGraph3.setBounds(2, 2, 435, 238);
    pnlGraphMaint.add(lblNoGraph3);

    cmbMargMaint1 = new JComboBox();
    cmbMargMaint1.setToolTipText("Old machine");
    cmbMargMaint1.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            UpdateROIMaint();
        }
    });
    cmbMargMaint1.setFont(new Font("Tahoma", Font.PLAIN, 11));
    cmbMargMaint1.setEnabled(false);
    cmbMargMaint1.setBounds(10, 359, 111, 20);
    pnlMaint.add(cmbMargMaint1);

    label_8 = new JLabel("to");
    label_8.setForeground(Color.GRAY);
    label_8.setFont(new Font("Tahoma", Font.BOLD, 11));
    label_8.setBounds(125, 362, 16, 14);
    pnlMaint.add(label_8);

    cmbMargMaint2 = new JComboBox();
    cmbMargMaint2.setToolTipText("New machine");
    cmbMargMaint2.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            UpdateROIMaint();
        }
    });
    cmbMargMaint2.setFont(new Font("Tahoma", Font.PLAIN, 11));
    cmbMargMaint2.setEnabled(false);
    cmbMargMaint2.setBounds(141, 359, 111, 20);
    pnlMaint.add(cmbMargMaint2);

    label_9 = new JLabel("=");
    label_9.setForeground(Color.GRAY);
    label_9.setFont(new Font("Tahoma", Font.BOLD, 13));
    label_9.setBounds(259, 362, 11, 14);
    pnlMaint.add(label_9);

    lblMarginalMaint = new JLabel("\u00A30.00 per annum");
    lblMarginalMaint.setToolTipText("Marginal improvement");
    lblMarginalMaint.setFont(new Font("Tahoma", Font.BOLD, 13));
    lblMarginalMaint.setEnabled(false);
    lblMarginalMaint.setBounds(279, 358, 170, 20);
    pnlMaint.add(lblMarginalMaint);

    lblProdLoss = new JLabel("\u00A30.00 / year");
    lblProdLoss.setToolTipText("Loss in production value due to downtime");
    lblProdLoss.setForeground(Color.GRAY);
    lblProdLoss.setEnabled(false);
    lblProdLoss.setHorizontalAlignment(SwingConstants.LEFT);
    lblProdLoss.setFont(new Font("Tahoma", Font.BOLD, 11));
    lblProdLoss.setBounds(106, 87, 125, 14);
    pnlMaint.add(lblProdLoss);

    lblHrs_1 = new JLabel("hrs");
    lblHrs_1.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblHrs_1.setEnabled(false);
    lblHrs_1.setBounds(180, 64, 16, 14);
    pnlMaint.add(lblHrs_1);

    label_10 = new JLabel("Machine:");
    label_10.setEnabled(false);
    label_10.setFont(new Font("Tahoma", Font.BOLD, 11));
    label_10.setBounds(10, 34, 59, 14);
    pnlMaint.add(label_10);

    label_11 = new JLabel("=");
    label_11.setEnabled(false);
    label_11.setForeground(Color.GRAY);
    label_11.setFont(new Font("Tahoma", Font.BOLD, 13));
    label_11.setBounds(88, 87, 11, 14);
    pnlMaint.add(label_11);

    label_12 = new JLabel("=");
    label_12.setEnabled(false);
    label_12.setForeground(Color.GRAY);
    label_12.setFont(new Font("Tahoma", Font.BOLD, 13));
    label_12.setBounds(323, 87, 11, 14);
    pnlMaint.add(label_12);

    lblAnnualTotal = new JLabel("Annual total");
    lblAnnualTotal.setEnabled(false);
    lblAnnualTotal.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblAnnualTotal.setBounds(255, 87, 67, 14);
    pnlMaint.add(lblAnnualTotal);

    lblProductionLoss = new JLabel("Production loss");
    lblProductionLoss.setEnabled(false);
    lblProductionLoss.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblProductionLoss.setBounds(10, 87, 77, 14);
    pnlMaint.add(lblProductionLoss);

    pnlWaste = new JPanel();
    pnlWaste.setBackground(Color.WHITE);
    tabsROI.addTab("Waste Reduction", null, pnlWaste, "ROI based on waste reduction");
    pnlWaste.setLayout(null);

    lblThisToolDemonstrates = new JLabel(
            "This tool demonstrates the waste reduction capabilities of particular machines.");
    lblThisToolDemonstrates.setForeground(Color.GRAY);
    lblThisToolDemonstrates.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblThisToolDemonstrates.setBounds(10, 11, 439, 14);
    pnlWaste.add(lblThisToolDemonstrates);

    lblWasteSavedPer_1 = new JLabel("Waste saved per splice due to flag detection camera:");
    lblWasteSavedPer_1.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblWasteSavedPer_1.setEnabled(false);
    lblWasteSavedPer_1.setBounds(10, 39, 256, 14);
    pnlWaste.add(lblWasteSavedPer_1);

    txtwastesavedflags = new JTextField();
    txtwastesavedflags.setToolTipText("Saving per splice");
    txtwastesavedflags.setEnabled(false);
    txtwastesavedflags.addFocusListener(new FocusAdapter() {
        @Override
        public void focusGained(FocusEvent e) {
            txtwastesavedflags.selectAll();
        }
    });
    txtwastesavedflags.getDocument().addDocumentListener(new DocumentListener() {
        @Override
        public void removeUpdate(DocumentEvent e) {
            UpdateROIWaste();
        }

        @Override
        public void insertUpdate(DocumentEvent e) {
            UpdateROIWaste();
        }

        @Override
        public void changedUpdate(DocumentEvent e) {
        }
    });
    txtwastesavedflags.setBounds(286, 36, 86, 20);
    pnlWaste.add(txtwastesavedflags);
    txtwastesavedflags.setColumns(10);

    lblM_1 = new JLabel("m");
    lblM_1.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblM_1.setEnabled(false);
    lblM_1.setBounds(378, 39, 46, 14);
    pnlWaste.add(lblM_1);

    lblWasteSavedPer_2 = new JLabel("Waste saved per mother roll due to alignment guide:");
    lblWasteSavedPer_2.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblWasteSavedPer_2.setEnabled(false);
    lblWasteSavedPer_2.setBounds(10, 64, 256, 14);
    pnlWaste.add(lblWasteSavedPer_2);

    txtwastesavedguide = new JTextField();
    txtwastesavedguide.setToolTipText("Saving per mother roll");
    txtwastesavedguide.setEnabled(false);
    txtwastesavedguide.getDocument().addDocumentListener(new DocumentListener() {
        @Override
        public void removeUpdate(DocumentEvent e) {
            UpdateROIWaste();
        }

        @Override
        public void insertUpdate(DocumentEvent e) {
            UpdateROIWaste();
        }

        @Override
        public void changedUpdate(DocumentEvent e) {
        }
    });
    txtwastesavedguide.addFocusListener(new FocusAdapter() {
        @Override
        public void focusGained(FocusEvent e) {
            txtwastesavedguide.selectAll();
        }
    });
    txtwastesavedguide.setBounds(286, 61, 86, 20);
    pnlWaste.add(txtwastesavedguide);
    txtwastesavedguide.setColumns(10);

    lblM_2 = new JLabel("m");
    lblM_2.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblM_2.setEnabled(false);
    lblM_2.setBounds(378, 64, 46, 14);
    pnlWaste.add(lblM_2);

    pnlGraphWaste = new JPanel();
    pnlGraphWaste.setBorder(new SoftBevelBorder(BevelBorder.LOWERED, Color.LIGHT_GRAY, null, null, null));
    pnlGraphWaste.setBackground(Color.WHITE);
    pnlGraphWaste.setBounds(10, 90, 439, 262);
    pnlWaste.add(pnlGraphWaste);
    pnlGraphWaste.setLayout(null);
    try {
        lblNoGraph4 = new JLabel(
                new ImageIcon(ImageIO.read(FrmMain.class.getResourceAsStream("/atlas/no_preview.png"))));
    } catch (IOException e2) {
        e2.printStackTrace();
    }
    lblNoGraph4.setBounds(2, 2, 435, 258);
    pnlGraphWaste.add(lblNoGraph4);

    cmbMargWaste1 = new JComboBox();
    cmbMargWaste1.setToolTipText("Old machine");
    cmbMargWaste1.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            UpdateROIWaste();
        }
    });
    cmbMargWaste1.setFont(new Font("Tahoma", Font.PLAIN, 11));
    cmbMargWaste1.setEnabled(false);
    cmbMargWaste1.setBounds(10, 359, 111, 20);
    pnlWaste.add(cmbMargWaste1);

    label_1 = new JLabel("to");
    label_1.setForeground(Color.GRAY);
    label_1.setFont(new Font("Tahoma", Font.BOLD, 11));
    label_1.setBounds(125, 362, 16, 14);
    pnlWaste.add(label_1);

    cmbMargWaste2 = new JComboBox();
    cmbMargWaste2.setToolTipText("New machine");
    cmbMargWaste2.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            UpdateROIWaste();
        }
    });
    cmbMargWaste2.setFont(new Font("Tahoma", Font.PLAIN, 11));
    cmbMargWaste2.setEnabled(false);
    cmbMargWaste2.setBounds(141, 359, 111, 20);
    pnlWaste.add(cmbMargWaste2);

    label_6 = new JLabel("=");
    label_6.setForeground(Color.GRAY);
    label_6.setFont(new Font("Tahoma", Font.BOLD, 13));
    label_6.setBounds(259, 362, 11, 14);
    pnlWaste.add(label_6);

    lblMarginalWaste = new JLabel("0.00m per annum");
    lblMarginalWaste.setToolTipText("Marginal improvement");
    lblMarginalWaste.setFont(new Font("Tahoma", Font.BOLD, 13));
    lblMarginalWaste.setEnabled(false);
    lblMarginalWaste.setBounds(279, 355, 170, 16);
    pnlWaste.add(lblMarginalWaste);

    lblMarginalWasteValue = new JLabel("(\u00A30.00 per annum)");
    lblMarginalWasteValue.setToolTipText("Marginal improvement value");
    lblMarginalWasteValue.setForeground(Color.GRAY);
    lblMarginalWasteValue.setFont(new Font("Tahoma", Font.BOLD, 11));
    lblMarginalWasteValue.setBounds(279, 370, 170, 16);
    pnlWaste.add(lblMarginalWasteValue);

    machNames = new HashSet<String>();
    jobNames = new HashSet<String>();

    lblStatus = new JLabel(" Ready.");
    lblStatus.setFont(new Font("Tahoma", Font.PLAIN, 12));
    frmTitanRoiCalculator.getContentPane().add(lblStatus, BorderLayout.SOUTH);

    lblmmin = new JLabel("(m/min)");
    lblmmin.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblmmin.setEnabled(false);
    lblmmin.setBounds(206, 168, 44, 14);
    pnlJobs.add(lblmmin);

    objfilter = new OBJfilter(1);

    // labels for unit conversion
    labs = new JLabel[7];
    labs[0] = lblmm0;
    labs[1] = lblmm1;
    labs[2] = lblmm2;
    labs[3] = lblgm3;
    labs[4] = lblmm3;
    labs[5] = lblmicro0;

    lblGsm = new JLabel("(gsm)");
    lblGsm.setToolTipText("Switch the input type for density between gsm and g/cc");
    lblGsm.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblGsm.setEnabled(false);
    lblGsm.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseReleased(MouseEvent arg0) {
            if (lblGsm.isEnabled() && lblGsm.contains(arg0.getPoint())) {
                jobFormReady = false;
                try {
                    //double oldval = Double.parseDouble(txtDensity.getText());
                    //double thickness = Double.parseDouble(txtThickness.getText());
                    double oldval = ((Job) listJobs.getSelectedValue()).getDensity();
                    double thickness = ((Job) listJobs.getSelectedValue()).getThickness();
                    if (lblGsm.getText().equals("(gsm)")) {
                        lblGsm.setText("(g/cc)");
                        label_3.setVisible(false);
                        lblgm3.setText("(gsm)");
                        txtDensity.setText(Double.toString(roundTwoDecimals(oldval * thickness)));
                        ((Job) listJobs.getSelectedValue()).gsm = true;
                    } else {
                        lblGsm.setText("(gsm)");
                        label_3.setVisible(true);
                        lblgm3.setText("(g/cm  )");
                        txtDensity.setText(Double.toString(roundTwoDecimals(oldval)));
                        ((Job) listJobs.getSelectedValue()).gsm = false;
                    }
                } catch (Exception e) {
                    lblGsm.setText("(gsm)");
                    label_3.setVisible(true);
                    lblgm3.setText("(g/cm  )");
                    txtDensity.setText("0.92");
                }
                jobFormReady = true;

            }
        }

        @Override
        public void mouseEntered(MouseEvent arg0) {
            lblGsm.setForeground(new Color(0, 0, 128));
        }

        @Override
        public void mouseExited(MouseEvent e) {
            lblGsm.setForeground(Color.black);
        }
    });
    lblGsm.setForeground(new Color(0, 0, 0));
    lblGsm.setCursor(new Cursor(Cursor.HAND_CURSOR));
    lblGsm.setBounds(177, 102, 46, 14);
    pnlMaterials.add(lblGsm);

    lblOr = new JLabel("or:");
    lblOr.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblOr.setEnabled(false);
    lblOr.setBounds(155, 102, 14, 14);
    pnlMaterials.add(lblOr);
    labs[6] = lblmmin;

    cmbUnwindType = new JComboBox();
    cmbUnwindType.setToolTipText("Type of measure to use for the unwind quantity above");
    cmbUnwindType.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            UpdateUnwindAmount();
        }
    });
    cmbUnwindType.setEnabled(false);
    cmbUnwindType
            .setModel(new DefaultComboBoxModel(new String[] { "Length (m)", "Weight (kg)", "Diameter (mm)" }));
    cmbUnwindType.setBounds(92, 124, 95, 20);
    pnlUnwinds.add(cmbUnwindType);

    txtWebWidth = new JTextField();
    txtWebWidth.setToolTipText("Width of mother rolls");
    txtWebWidth.setText("1350");
    txtWebWidth.addFocusListener(new FocusAdapter() {
        @Override
        public void focusGained(FocusEvent arg0) {
            txtWebWidth.selectAll();
        }
    });
    txtWebWidth.setEnabled(false);
    txtWebWidth.getDocument().addDocumentListener(new DocumentListener() {
        @Override
        public void removeUpdate(DocumentEvent arg0) {
            UpdateJob();
        }

        @Override
        public void insertUpdate(DocumentEvent arg0) {
            UpdateJob();
        }

        @Override
        public void changedUpdate(DocumentEvent arg0) {
        }
    });
    txtWebWidth.setBounds(92, 26, 86, 20);
    pnlUnwinds.add(txtWebWidth);
    txtWebWidth.setColumns(10);

    lblAverageFlags = new JLabel("Average Flags:");
    lblAverageFlags.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblAverageFlags.setToolTipText("The average number of flags in each mother roll");
    lblAverageFlags.setEnabled(false);
    lblAverageFlags.setBounds(14, 79, 75, 14);
    pnlUnwinds.add(lblAverageFlags);

    txtFlagCount = new JTextField();
    txtFlagCount.setToolTipText("The average number of flags in each mother roll");
    txtFlagCount.addFocusListener(new FocusAdapter() {
        @Override
        public void focusGained(FocusEvent arg0) {
            txtFlagCount.selectAll();
        }
    });
    txtFlagCount.getDocument().addDocumentListener(new JobInputChangeListener());
    txtFlagCount.setEnabled(false);
    txtFlagCount.setText("1");
    txtFlagCount.setBounds(92, 76, 43, 20);
    pnlUnwinds.add(txtFlagCount);
    txtFlagCount.setColumns(10);

    lblPerRoll = new JLabel("per roll");
    lblPerRoll.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblPerRoll.setEnabled(false);
    lblPerRoll.setBounds(140, 79, 46, 14);
    pnlUnwinds.add(lblPerRoll);

    txtLimitRunSpeed = new JTextField();
    txtLimitRunSpeed.setToolTipText(
            "Override for top machine speed (may be required for particular materials or environments)");
    txtLimitRunSpeed.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseReleased(MouseEvent arg0) {
            if (txtLimitRunSpeed.contains(arg0.getPoint())) {
                txtLimitRunSpeed.setEnabled(true);
                chckbxLimitRunSpeed.setSelected(true);
                txtLimitRunSpeed.requestFocusInWindow();
                txtLimitRunSpeed.selectAll();
                UpdateJob();
            }
        }
    });
    txtLimitRunSpeed.addFocusListener(new FocusAdapter() {
        @Override
        public void focusGained(FocusEvent e) {
            if (txtLimitRunSpeed.isEnabled()) {
                txtLimitRunSpeed.selectAll();
                chckbxLimitRunSpeed.setSelected(true);
            }
        }
    });
    txtLimitRunSpeed.getDocument().addDocumentListener(new JobInputChangeListener());
    txtLimitRunSpeed.setEnabled(false);

    txtLimitRunSpeed.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            chckbxLimitRunSpeed.setSelected(true);
        }
    });
    txtLimitRunSpeed.setText("800");
    txtLimitRunSpeed.setColumns(10);
    txtLimitRunSpeed.setBounds(130, 165, 65, 20);
    pnlJobs.add(txtLimitRunSpeed);

    cmbRewindType = new JComboBox();
    cmbRewindType.setToolTipText("Type of measure to use for rewind output above");
    cmbRewindType.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            UpdateRewindAmount();
            //UpdateJob();
        }
    });
    cmbRewindType.setEnabled(false);
    cmbRewindType
            .setModel(new DefaultComboBoxModel(new String[] { "Length (m)", "Weight (kg)", "Diameter (mm)" }));
    cmbRewindType.setBounds(109, 218, 95, 20);
    pnlJobs.add(cmbRewindType);

    chckbxLimitRunSpeed = new JCheckBox("");
    chckbxLimitRunSpeed.setToolTipText(
            "Override for top machine speed (may be required for particular materials or environments)");
    chckbxLimitRunSpeed.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            if (chckbxLimitRunSpeed.isSelected()) {
                txtLimitRunSpeed.setEnabled(true);
                txtLimitRunSpeed.requestFocusInWindow();
                txtLimitRunSpeed.selectAll();
            } else {
                txtLimitRunSpeed.setEnabled(false);
            }

            UpdateJob();
        }
    });
    chckbxLimitRunSpeed.setEnabled(false);
    chckbxLimitRunSpeed.setBounds(105, 164, 20, 20);
    pnlJobs.add(chckbxLimitRunSpeed);

    lblLimitRunSpeed = new JLabel("Speed Limit:");
    lblLimitRunSpeed.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblLimitRunSpeed.setToolTipText(
            "Override for top machine speed (may be required for particular materials or environments)");
    lblLimitRunSpeed.setEnabled(false);
    lblLimitRunSpeed.setBounds(47, 168, 59, 14);
    pnlJobs.add(lblLimitRunSpeed);

    lblKnifeType = new JLabel("Knife Type:");
    lblKnifeType.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblKnifeType.setToolTipText("Select knife type for this job");
    lblKnifeType.setEnabled(false);
    lblKnifeType.setHorizontalAlignment(SwingConstants.RIGHT);
    lblKnifeType.setBounds(46, 89, 59, 14);
    pnlJobs.add(lblKnifeType);

    cmbKnifeType = new JComboBox();
    cmbKnifeType.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            UpdateJob();
        }
    });
    cmbKnifeType.setModel(new DefaultComboBoxModel(new String[] { "Razor in Air", "Rotary Shear" }));
    cmbKnifeType.setToolTipText("Select knife type for this job");
    cmbKnifeType.setEnabled(false);
    cmbKnifeType.setBounds(109, 86, 95, 20);
    pnlJobs.add(cmbKnifeType);

    tabbedPane.setMnemonicAt(0, KeyEvent.VK_M);
    tabbedPane.setMnemonicAt(1, KeyEvent.VK_J);
    tabbedPane.setMnemonicAt(2, KeyEvent.VK_S);
    tabbedPane.setMnemonicAt(3, KeyEvent.VK_P);
    tabbedPane.setMnemonicAt(4, KeyEvent.VK_R);

    tabsROI.setMnemonicAt(0, KeyEvent.VK_D);
    tabsROI.setMnemonicAt(1, KeyEvent.VK_N);
    tabsROI.setMnemonicAt(3, KeyEvent.VK_W);

    scrollPane_4 = new JScrollPane();
    scrollPane_4.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
    scrollPane_4.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
    scrollPane_4.setBorder(null);
    scrollPane_4.setBounds(522, 44, 245, 405);
    pnlROI.add(scrollPane_4);

    panel_11 = new JPanel();
    panel_11.setToolTipText(
            "Click a machine to select it. Select two or more machines to compare their ROI measures.");
    scrollPane_4.setViewportView(panel_11);
    panel_11.setBackground(Color.WHITE);
    panel_11.setBorder(new SoftBevelBorder(BevelBorder.LOWERED, Color.LIGHT_GRAY, null, null, null));
    panel_11.setLayout(new BorderLayout(0, 0));

    listCompareRoi = new JList(listModel);
    panel_11.add(listCompareRoi, BorderLayout.NORTH);
    listCompareRoi.setToolTipText(
            "Click a machine to select it. Select two or more machines to compare their ROI measures.");
    listCompareRoi.setBorder(null);
    listCompareRoi.setSelectionModel(new DefaultListSelectionModel() {
        private static final long serialVersionUID = 1L;

        boolean gestureStarted = false;

        @Override
        public void setSelectionInterval(int index0, int index1) {
            if (!gestureStarted) {
                if (isSelectedIndex(index0)) {
                    super.removeSelectionInterval(index0, index1);
                } else {
                    super.addSelectionInterval(index0, index1);
                }
            }
            gestureStarted = true;
        }

        @Override
        public void setValueIsAdjusting(boolean isAdjusting) {
            if (isAdjusting == false) {
                gestureStarted = false;
            }
        }

    });
    listCompareRoi.addListSelectionListener(new ROIListSelectionListener());
    listCompareRoi.setCellRenderer(new MachineListRenderer());
    listCompare.setSelectionModel(listCompareRoi.getSelectionModel());

    btnJobUp = new JButton("");
    btnJobUp.setToolTipText("Move job up");
    btnJobUp.addActionListener(new JobUpListener());
    try {
        btnJobUp.setIcon(new ImageIcon(ImageIO.read(FrmMain.class.getResourceAsStream("/atlas/up.png"))));
        btnJobUp.setRolloverEnabled(true);
        btnJobUp.setRolloverIcon(
                new ImageIcon(ImageIO.read(FrmMain.class.getResourceAsStream("/atlas/up_over.png"))));
        btnJobUp.setDisabledIcon(
                new ImageIcon(ImageIO.read(FrmMain.class.getResourceAsStream("/atlas/up_dis.png"))));
    } catch (NullPointerException e11) {
        System.out.println("Image load error");
    } catch (IOException e1) {
        e1.printStackTrace();
    }
    btnJobUp.setEnabled(false);
    btnJobUp.setBounds(700, 463, 30, 30);
    pnlJob.add(btnJobUp);

    btnJobDown = new JButton("");
    btnJobDown.setToolTipText("Move job down");
    btnJobDown.addActionListener(new JobDownListener());
    try {
        btnJobDown.setIcon(new ImageIcon(ImageIO.read(FrmMain.class.getResourceAsStream("/atlas/down.png"))));
        btnJobDown.setRolloverEnabled(true);
        btnJobDown.setRolloverIcon(
                new ImageIcon(ImageIO.read(FrmMain.class.getResourceAsStream("/atlas/down_over.png"))));
        btnJobDown.setDisabledIcon(
                new ImageIcon(ImageIO.read(FrmMain.class.getResourceAsStream("/atlas/down_dis.png"))));
    } catch (NullPointerException e11) {
        System.out.println("Image load error");
    } catch (IOException e1) {
        e1.printStackTrace();
    }
    btnJobDown.setEnabled(false);
    btnJobDown.setBounds(737, 463, 30, 30);
    pnlJob.add(btnJobDown);

    btnNewJob = new JButton("Add New");
    btnNewJob.setFont(new Font("Tahoma", Font.BOLD, 11));
    btnNewJob.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            jobFormReady = false;
            ResetStatusLabel();

            EnableJobForm();

            // new
            ResetJobForm();
            lblGsm.setText("(gsm)");
            label_3.setVisible(true);
            lblgm3.setText("(g/cm  )");
            txtDensity.setText("0.92");

            btnJobDelete.setEnabled(true);

            btnAddAll.setEnabled(true);

            /*if(listJobs.getSelectedIndex() == 0)
               btnJobUp.setEnabled(false);
            else
               btnJobUp.setEnabled(true);
                    
            if(listJobs.getSelectedIndex() == jobModel.getSize()-1)
               btnJobDown.setEnabled(false);
            else
               btnJobDown.setEnabled(true);*/

            int index = listJobs.getSelectedIndex();
            int size = jobModel.getSize();

            if (size >= Consts.JOB_LIST_LIMIT) { // Max list size
                ShowMessage("Maximum number of jobs allocated. Please delete before attempting to add more.");
                return;
            }

            String newName = getUniqueJobName("Job");
            txtJobName.setText(newName);
            job = new Job(newName);
            jobNames.add(newName.toLowerCase());

            //If no selection or if item in last position is selected,
            //add the new one to end of list, and select new one.
            if (index == -1 || (index + 1 == size)) {

                jobModel.addElement(job);
                listJobs.setSelectedIndex(size);
                listJobsAvail.setSelectedIndex(size);
                if (size > 0)
                    btnJobUp.setEnabled(true);

                //Otherwise insert the new one after the current selection,
                //and select new one.
            } else {
                jobModel.insertElementAt(job, index + 1);
                listJobs.setSelectedIndex(index + 1);
                listJobsAvail.setSelectedIndex(index + 1);
            }

            // TODO don't reset form, or add copy button

            ResetStatusLabel();
            jobFormReady = true;

            UpdateJob();
            txtJobName.requestFocusInWindow();
        }
    });
    try {
        btnNewJob.setIcon(new ImageIcon(ImageIO.read(FrmMain.class.getResourceAsStream("/atlas/plus.png"))));
    } catch (IOException e1) {
        e1.printStackTrace();
    }
    btnNewJob.setToolTipText("Add new job");
    btnNewJob.setBounds(522, 460, 110, 36);
    pnlJob.add(btnNewJob);

    lblJobConfiguration = new JLabel("Job Configuration");
    lblJobConfiguration.setFont(new Font("Tahoma", Font.BOLD, 18));
    lblJobConfiguration.setBounds(29, 18, 269, 22);
    pnlJob.add(lblJobConfiguration);

    btnJobDelete = new JButton("");
    btnJobDelete.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            ResetStatusLabel();

            Job selected = (Job) listJobs.getSelectedValue();
            jobNames.remove(selected.getName().toLowerCase());

            ListSelectionModel lsm = listJobs.getSelectionModel();
            int firstSelected = lsm.getMinSelectionIndex();
            int lastSelected = lsm.getMaxSelectionIndex();
            jobModel.removeRange(firstSelected, lastSelected);

            int size = jobModel.size();

            if (size == 0) {
                //List is empty: disable delete, up, and down buttons.
                /*btnJobDelete.setEnabled(false);
                btnJobUp.setEnabled(false);
                btnJobDown.setEnabled(false);*/

            } else {
                //Adjust the selection.
                if (firstSelected == jobModel.getSize()) {
                    //Removed item in last position.
                    firstSelected--;
                }
                listJobs.setSelectedIndex(firstSelected);

                if (size == 21) { // No longer full list
                    ResetStatusLabel();
                }

                job = (Job) listJobs.getSelectedValue();
            }
        }
    });

    try {
        btnJobDelete
                .setIcon(new ImageIcon(ImageIO.read(FrmMain.class.getResourceAsStream("/atlas/delete.png"))));
        btnJobDelete.setRolloverEnabled(true);
        btnJobDelete.setRolloverIcon(
                new ImageIcon(ImageIO.read(FrmMain.class.getResourceAsStream("/atlas/delete_over.png"))));
        btnJobDelete.setDisabledIcon(
                new ImageIcon(ImageIO.read(FrmMain.class.getResourceAsStream("/atlas/delete_dis.png"))));
    } catch (NullPointerException e11) {
        System.out.println("Image load error");
    } catch (IOException e1) {
        e1.printStackTrace();
    }
    btnJobDelete.setToolTipText("Delete job");
    btnJobDelete.setRolloverEnabled(true);
    btnJobDelete.setEnabled(false);
    btnJobDelete.setBounds(651, 460, 36, 36);
    pnlJob.add(btnJobDelete);

    lblAddNewJobs = new JLabel(
            "Add new jobs to the list on the right, then configure unwind, rewind and material settings below");
    lblAddNewJobs.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblAddNewJobs.setBounds(29, 45, 483, 14);
    pnlJob.add(lblAddNewJobs);

    lblJobs = new JLabel("Jobs");
    lblJobs.setFont(new Font("Tahoma", Font.BOLD, 12));
    lblJobs.setBounds(522, 19, 85, 14);
    pnlJob.add(lblJobs);

    panel_1 = new JPanel();
    panel_1.setLayout(null);
    panel_1.setBorder(new TitledBorder(UIManager.getBorder("TitledBorder.border"), "Total Output",
            TitledBorder.LEADING, TitledBorder.TOP, null, null));
    panel_1.setBounds(280, 380, 227, 116);
    pnlJob.add(panel_1);

    lblTargetOutputFor = new JLabel("Target output for job:");
    lblTargetOutputFor.setEnabled(false);
    lblTargetOutputFor.setBounds(30, 22, 129, 14);
    panel_1.add(lblTargetOutputFor);

    txtTargetTotal = new JTextField();
    txtTargetTotal.addFocusListener(new FocusAdapter() {
        @Override
        public void focusGained(FocusEvent e) {
            txtTargetTotal.selectAll();
        }
    });
    txtTargetTotal.getDocument().addDocumentListener(new JobInputChangeListener());
    txtTargetTotal.setToolTipText("Total output quantity for this job");
    txtTargetTotal.setText("10000");
    txtTargetTotal.setEnabled(false);
    txtTargetTotal.setColumns(10);
    txtTargetTotal.setBounds(30, 43, 118, 20);

    panel_1.add(txtTargetTotal);

    cmbTargetTotal = new JComboBox();
    cmbTargetTotal.setToolTipText("Type of measure to use for output quantity above");
    cmbTargetTotal.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            UpdateTotalsAmount();
        }
    });
    cmbTargetTotal.setModel(
            new DefaultComboBoxModel(new String[] { "Length (m)", "Weight (kg)", "Weight (tonnes)" }));
    cmbTargetTotal.setEnabled(false);
    cmbTargetTotal.setBounds(30, 67, 118, 20);
    panel_1.add(cmbTargetTotal);

    lblCounts = new JLabel("0 reel(s), 0 set(s), 0 mother(s)");
    lblCounts.setFont(new Font("Tahoma", Font.PLAIN, 11));
    lblCounts.setForeground(Color.GRAY);
    lblCounts.setBounds(30, 92, 187, 14);
    panel_1.add(lblCounts);

    panel_2 = new JPanel();
    panel_2.setLayout(null);
    panel_2.setBorder(new TitledBorder(UIManager.getBorder("TitledBorder.border"), "Name", TitledBorder.LEADING,
            TitledBorder.TOP, null, new Color(0, 0, 0)));
    panel_2.setBounds(20, 72, 250, 83);
    pnlJob.add(panel_2);

    txtJobName = new JTextField();
    txtJobName.addFocusListener(new FocusAdapter() {
        @Override
        public void focusGained(FocusEvent e) {
            txtJobName.selectAll();
        }
    });
    txtJobName.setBounds(90, 30, 145, 28);
    panel_2.add(txtJobName);
    txtJobName.getDocument().addDocumentListener(new DocumentListener() {
        @Override
        public void changedUpdate(DocumentEvent arg0) {
        }

        @Override
        public void insertUpdate(DocumentEvent arg0) {
            UpdateJobName();
        }

        @Override
        public void removeUpdate(DocumentEvent arg0) {
            UpdateJobName();
        }
    });
    txtJobName.setToolTipText("Set the name of this job");
    txtJobName.setFont(new Font("Tahoma", Font.BOLD, 12));
    txtJobName.setEnabled(false);
    txtJobName.setColumns(10);

    lblJobName = new JLabel("Job name:");
    lblJobName.setToolTipText("Set the name of this job");
    lblJobName.setEnabled(false);
    lblJobName.setBounds(22, 31, 60, 24);
    panel_2.add(lblJobName);
    lblJobName.setFont(new Font("Tahoma", Font.PLAIN, 13));

    btnResetJobs = new JButton("Reset");
    btnResetJobs.setBounds(20, 460, 100, 36);
    pnlJob.add(btnResetJobs);
    btnResetJobs.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            ResetJobForm();
            UpdateJob();
        }
    });
    btnResetJobs.setToolTipText("Reset the form");
    btnResetJobs.setEnabled(false);

    scrollPane_1 = new JScrollPane();
    scrollPane_1.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
    scrollPane_1.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
    scrollPane_1.setBorder(null);
    scrollPane_1.setBounds(522, 44, 245, 405);
    pnlJob.add(scrollPane_1);

    panel_7 = new JPanel();
    panel_7.setToolTipText("Select a job to edit options, re-order, or delete");
    scrollPane_1.setViewportView(panel_7);
    panel_7.setBackground(Color.WHITE);
    panel_7.setBorder(new SoftBevelBorder(BevelBorder.LOWERED, Color.LIGHT_GRAY, null, null, null));
    panel_7.setLayout(new BorderLayout(0, 0));

    listJobs = new JList(jobModel);
    listJobs.setSelectionModel(listJobsAvail.getSelectionModel());
    panel_7.add(listJobs, BorderLayout.NORTH);
    listJobs.setToolTipText("Select a job to edit options, re-order, or delete");
    listJobs.addListSelectionListener(new JobListSelectionListener());
    listJobs.setBorder(null);
    listJobs.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    listJobs.setCellRenderer(new JobListRenderer());
    pnlJob.setFocusTraversalPolicy(new FocusTraversalOnArray(
            new Component[] { cmbMaterials, txtThickness, txtDensity, cmbUnwindCore, txtUnwindAmount, txtSlits,
                    txtSlitWidth, cmbRewindCore, txtRewindAmount, cmbJobDomain, lblPresets, lblThickness_1,
                    lblDensity_1, pnlMaterials, lblWebWidthmm, lblmm0, lblUnwindCoremm, lblmm1, lblUnwindLength,
                    pnlUnwinds, lblmicro0, lblgm3, label_3, pnlJobs, lblTargetRewindLength, lblSlitWidth,
                    lblSlitCount, lblTrimtotal, lblTrim, lblRewindCoremm, lblPer_1, lblmm3, lblmm2 }));
    Image img = null;
    try {
        img = ImageIO.read(FrmMain.class.getResourceAsStream("/atlas/refresh.png"));
    } catch (IOException e1) {
        e1.printStackTrace();
    }
    BufferedImage bi = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_ARGB);
    Graphics g = bi.createGraphics();
    g.drawImage(img, 0, 0, 25, 25, null);

    LoadSettings();

    DoLicenceCheck();

    initialising = false;

}